Основная ошибка состояла в том, что вход для линейного масштабирования уже должен быть положительным (по определению), тогда как я выбирал его также отрицательными значениями.
Речь идет об отрицательных значениях не о вводе в алгоритм, а о выводе (масштабированных значениях) из алгоритма.Проверка состоит в том, чтобы обработать этот случай, а затем исправить его, чтобы не создавать отрицательных масштабированных значений.
if(p->min > (p->scaleFactor * p->avg - p->max)/
(p->scaleFactor - 1.0)) { /* if nonnegative smin */
d = p->max - p->avg;
p->scaleConstA = (p->scaleFactor - 1.0) * p->avg / d;
p->scaleConstB = p->avg * (p->max - (p->scaleFactor * p->avg))/d;
} else { /* if smin becomes negative on scaling */
d = p->avg - p->min;
p->scaleConstA = p->avg/d;
p->scaleConstB = -p->min * p->avg/d;
}
На изображении ниже, если f'min отрицательно, перейдите к предложению else и обработайте этот случай.
Хорошо, тогда решение заключается в предварительном масштабировании вышеупомянутой функции, поэтому она дает только положительные значения.Как предположил Гиперборей, это можно сделать, добавив наименьшее возможное значение
u = 5 - (2*5.12^2)
Лучше всего, если мы отделим реальные значения пригодности , которые мы пытаемся максимизировать от масштабированных значений пригодности значения, которые вводятся в selection phase
GA.