ga
, Основанный на проблемеВ этом примере показано, как минимизировать функцию с несколькими минимумами с помощью генетического алгоритма в подходе, основанном на проблеме. Для двух переменных x
и y
, Функция Рэстриджина определяется следующим образом.
ras = @(x, y) 20 + x.^2 + y.^2 - 10*(cos(2*pi*x) + cos(2*pi*y));
Постройте функцию, масштабируемую по 10 в каждом направлении.
rf3 = @(x, y) ras(x/10, y/10); fsurf(rf3,[-30 30],"ShowContours","on") title("rastriginsfcn([x/10,y/10])") xlabel("x") ylabel("y")
Функция имеет много локальных минимумов и глобальное минимальное значение 0, который достигнут в x
= 0, y
= 0. Смотрите то, что глобальная оптимизация?
Создайте переменные x
оптимизации и
y
. Укажите, что переменные ограничены .
x = optimvar("x","LowerBound",-100,"UpperBound",100); y = optimvar("y","LowerBound",-100,"UpperBound",100);
Создайте задачу оптимизации с целевой функцией rastriginsfcn(x)
.
prob = optimproblem("Objective",ras(x,y));
Примечание: Если у вас есть нелинейная функция, которая не состоит из полиномов, рациональных выражений и элементарных функций, таких как exp
, затем преобразуйте функцию в выражение оптимизации при помощи fcn2optimexpr
. Смотрите преобразуют нелинейную функцию в выражение оптимизации и поддерживаемые операции для переменных и выражений оптимизации.
Создайте ga
опции, чтобы использовать gaplotbestf
функция plot.
options = optimoptions("ga","PlotFcn","gaplotbestf");
Решите задачу с помощью ga
как решатель.
rng default % For reproducibility [sol,fval] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga. Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
sol = struct with fields:
x: 0.9950
y: 0.9950
fval = 1.9899
Действительно ли получившееся значение функции является самым низким минимумом? Выполните поиск снова. Поскольку ga
стохастический алгоритм, результаты могут отличаться.
[sol2,fval2] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga. Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
sol2 = struct with fields:
x: 0.9950
y: -4.9289e-06
fval2 = 0.9950
Второе решение лучше, потому что оно имеет более низкое значение функции. Решение возвращено ga
как гарантируют, не будет глобальным решением.
ga
| fcn2optimexpr
| solve