Я пытаюсь свернуть функцию с помощью GA, но она "видит" неверные значения пригодности.Мой скрипт GA выглядит следующим образом:
ObjectiveFunction = @FF;
ConstraintFunction = @constraints;
nvars = 5;
LB = [1e9 1e9 0.1 -1 1e9];
UB = [1.3825E+12 6.45E+11 0.272 +1 1.12E+11];
options = optimoptions('ga','PlotFcn',{@gaplotbestf, @gaplotscores},'Display','Iter','FitnessLimit',0.25,'PopulationSize',20);
[HOM_MOD,FF_val] = ga(ObjectiveFunction,nvars,[],[],[],[],LB,UB,ConstraintFunction,options);
первая и последняя строки FF (фитнес-функции) выглядят следующим образом:
function y = FF(moduli_short)
...
E = [3.73E+10 3.62E+10 3.81E+10 3.36E+09 1.83E+10];
y = abs(energies(1)-E(1))/E(1) + abs(energies(2)-E(2))/E(2) + abs(energies(3)-E(3))/E(3) + abs(energies(4)-E(4))/E(4) + abs(energies(5)-E(5))/E(5);
Когда оценивается первое поколение, графикиотображаются, но значения не имеют никакого смысла.Значения пригодности на графиках порядка -10 ^ 19, в то время как, как видно из FF, фитнес не может быть даже отрицательным.Я печатаю значения пригодности из функции FF просто для уверенности, и они всегда находятся где-то между 5 и 1000, а не -10 ^ 19.В результате этого отклонения код никогда не сходится (и продолжает оценивать функцию FF в бесполезных точках).И последнее, но не менее важное: графики не прогрессируют после 1-го поколения, а выходные данные в командном окне выглядят так:
Best Max Stall
Generation Func-count f(x) Constraint Generations
без чего-либо следующего.
Я попробовал более простойкод только с 2 входами, и он отлично работает в этом случае.У кого-нибудь есть догадки, почему я могу столкнуться с этой проблемой?