Я создаю программу в 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