0

我正在 Scala 中创建一个程序,该程序需要根据我提供的行生成适应度函数。

为了生成适应度函数,我编写了一个方法,该方法采用点列表并基于这些点返回适应度函数。

这个适应度函数应该根据它们的 y 值来测量每个点到直线的距离之和。总和越低,适应度越高。

但是现在我被卡住了,因为我不知道如何将距离之和从 0 转换为 Infinite 到从 1 到 0 的 Double,1 是最佳拟合线,0 是最差拟合线。

任何想法或数学方程式?先感谢您

我已经尝试使用 tanh 函数来限制这个值,只是意识到它对于更大的值非常有效。我也尝试过使用:

fitness = 1 - Math.atan(x)/(Math.PI/2);

这样我可能会得到相反的答案,但它没有用:'^)

这是与我的程序运行方式有关的代码:

//Point Class that is just a coordinate point (x, y)
class Point(val x: Double, val y: Double) {
}

//Line Class this is just a line with y = slope * x + yIntercept
class Line(val slope: Double, val yIntercept: Double) {

  def evaluate(x: Double): Double = {
    slope * x + yIntercept
  }
}

def lineFitFuncGen(points: List[Point]): Line => Double = {
    //Sum of the distances using the line given
    line: Line => {
      var lineSum: Double = 0.0
      for (point <- points) {
        lineSum += Math.abs(line.evaluate(point.x) - point.y)
      }
      lineSum
    }
  }

我运行程序并得到了总和,但现在我不知道如何取这个总和并将其转换为 1 到 0 的范围。我想让它成为我可能的最低总和,即 0 给我适合度为 1,而我可能的最高总和,即 Infinity 给我的适合度为 0

4

2 回答 2

2

数学,不是编程。但...

fitness(x) = 2 / (exp(x) + 1)

是适合您的要求的 sigmoid 函数 ( fitness(0) = 1, fitness(inf) = 0)。

于 2019-03-28T10:14:03.807 回答
2

怎么样

fitness = 1/(1+x);

当 x 增加时趋向 0 的函数

于 2019-03-28T10:14:04.307 回答