如何将值从0限制为无限到1到0?

时间:2019-03-28 10:06:39

标签: scala math fitness

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:2)

怎么样

fitness = 1/(1+x);

随着x的增加,函数趋于0