我正在 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