Как ограничить значение от 0 до бесконечности значением от 1 до 0? - PullRequest
0 голосов
/ 28 марта 2019

Я создаю программу в Scala, которая должна генерировать фитнес-функцию на основе линии, которой я ее предоставляю.

Для генерации фитнес-функции я написал метод, который берет список точек и возвращает фитнес-функцию, основанную на этих точках.

Эта фитнес-функция должна измерять сумму расстояний каждой точки от линии с точки зрения их значений y. И чем меньше сумма, тем выше фитнес.

Но теперь я застрял, потому что я не могу понять, как я могу преобразовать сумму расстояний от 0 до бесконечности в двойное число, которое составляет от 1 до 0, 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, в то время как моя максимально возможная сумма, то есть Бесконечность, дает мне пригодность 0

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Как насчет

fitness = 1/(1+x);

функция, которая движется к 0 при увеличении х

2 голосов
/ 28 марта 2019

Математика, не программирование. Но ...

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

- сигмовидная функция, адаптированная к вашим требованиям (fitness(0) = 1, fitness(inf) = 0).

...