我正在Scala中创建一个程序,该程序需要根据我提供的代码生成适应性函数。
为了生成适应度函数,我编写了一个方法 获取点列表并基于这些点返回适应度函数。
此适应度函数应根据其y值来测量每个点与直线的距离之和。并且总和越低,适合度越高。
但是现在我被困住了,因为我不知道如何将0和2之间的距离之和变换为从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
答案 0 :(得分:2)
数学,而不是编程。但是...
fitness(x) = 2 / (exp(x) + 1)
Sigmoid函数适合您的要求(fitness(0) = 1
,fitness(inf) = 0
)。
答案 1 :(得分:2)
怎么样
fitness = 1/(1+x);
随着x的增加,函数趋于0