ga
, Основанный на проблемеВ этом примере показано, как минимизировать целевую функцию согласно нелинейным ограничениям неравенства и границам, с помощью ga
в подходе, основанном на проблеме. Для основанной на решателе версии этой проблемы смотрите, что Ограниченная Минимизация Использует Генетический алгоритм.
Для этой проблемы функция фитнеса, чтобы минимизировать является простой функцией 2D переменных X
и Y
.
camxy = @(X,Y)(4 - 2.1.*X.^2 + X.^4./3).*X.^2 + X.*Y + (-4 + 4.*Y.^2).*Y.^2;
Эта функция описана в Диксоне и Сзего [1].
Кроме того, проблема имеет нелинейные ограничения и границы.
x*y + x - y + 1.5 <= 0 (nonlinear constraint) 10 - x*y <= 0 (nonlinear constraint) 0 <= x <= 1 (bound) 0 <= y <= 13 (bound)
Постройте нелинейную область ограничений на объемной поверхностной диаграмме функции фитнеса. Ограничения ограничивают решение небольшой области выше обеих красных кривых.
x1 = linspace(0,1); y1 = (-x1 - 1.5)./(x1 - 1); y2 = 10./x1; [X,Y] = meshgrid(x1,linspace(0,13)); Z = camxy(X,Y); surf(X,Y,Z,"LineStyle","none") hold on z1 = camxy(x1,y1); z2 = camxy(x1,y2); plot3(x1,y1,z1,'r-',x1,y2,z2,'r-') xlim([0 1]) ylim([0 13]) zlim([0,max(Z,[],"all")]) hold off
Чтобы настроить эту проблему, создайте переменные x
оптимизации и
y
. Установите границы, когда вы создадите переменные.
x = optimvar("x","LowerBound",0,"UpperBound",1); y = optimvar("y","LowerBound",0,"UpperBound",13);
Создайте цель как выражение оптимизации.
cam = camxy(x,y);
Создайте задачу оптимизации с этой целевой функцией.
prob = optimproblem("Objective",cam);
Создайте два нелинейных ограничения неравенства и включайте их в проблему.
prob.Constraints.cons1 = x*y + x - y + 1.5 <= 0; prob.Constraints.cons2 = 10 - x*y <= 0;
Рассмотрите проблему.
show(prob)
OptimizationProblem : Solve for: x, y minimize : (((((4 - (2.1 .* x.^2)) + (x.^4 ./ 3)) .* x.^2) + (x .* y)) + (((-4) + (4 .* y.^2)) .* y.^2)) subject to cons1: ((((x .* y) + x) - y) + 1.5) <= 0 subject to cons2: (10 - (x .* y)) <= 0 variable bounds: 0 <= x <= 1 0 <= y <= 13
Решите задачу, задав ga
решатель.
[sol,fval] = solve(prob,"Solver","ga")
Solving problem using ga. Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
sol = struct with fields:
x: 0.8122
y: 12.3103
fval = 9.1268e+04
Чтобы наблюдать прогресс решателя, задайте опции тот выбор две функции построения графика. Функция построения графика gaplotbestf
строит лучшее значение целевой функции в каждой итерации и функцию построения графика gaplotmaxconstr
строит максимальное нарушение ограничений в каждой итерации. Установите эти две функции построения графика в массиве ячеек. Кроме того, информация об отображении о прогрессе решателя в Командном окне путем установки Display
опция к 'iter'
.
options = optimoptions(@ga,... 'PlotFcn',{@gaplotbestf,@gaplotmaxconstr},... 'Display','iter');
Запустите решатель, включая options
аргумент.
[sol,fval] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga. Single objective optimization: 2 Variable(s) 2 Nonlinear inequality constraint(s) Options: CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @mutationadaptfeasible Best Max Stall Generation Func-count f(x) Constraint Generations 1 2520 91357.8 0 0 2 4982 91324.1 4.55e-05 0 3 7914 97166.6 0 0 4 16145 91268.4 0.0009997 0 Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
sol = struct with fields:
x: 0.8123
y: 12.3103
fval = 9.1268e+04
Нелинейные ограничения вызывают ga
решить много подпроблем в каждой итерации. Как показано и в графиках и в итеративном отображении, процесс решения имеет немного итераций. Однако Func-count
столбец в итеративном отображении показывает много вычислений функции на итерацию.
Если ваши объективные или нелинейные ограничительные функции не поддерживаются (см. Поддерживаемые Операции для Переменных и выражений Оптимизации), используйте fcn2optimexpr
преобразовывать их в форму, подходящую для подхода, основанного на проблеме. Например, предположите это вместо ограничения , у вас есть ограничение , где модифицированная Функция Бесселя besseli(1,x)
. (Функции Бесселя не являются поддерживаемыми функциями.) Создают это ограничение с помощью fcn2optimexpr
. Во-первых, создайте выражение оптимизации для .
bfun = fcn2optimexpr(@(t,u)besseli(1,t) + besseli(1,u),x,y);
Затем замените ограничение cons2
с ограничением bfun >= 10
.
prob.Constraints.cons2 = bfun >= 10;
Решите задачу. Решение отличается, потому что область ограничений отличается.
[sol2,fval2] = solve(prob,"Solver","ga","Options",options)
Solving problem using ga. Single objective optimization: 2 Variable(s) 2 Nonlinear inequality constraint(s) Options: CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @mutationadaptfeasible Best Max Stall Generation Func-count f(x) Constraint Generations 1 2512 974.044 0 0 2 4974 960.998 0 0 3 7436 963.12 0 0 4 12001 960.83 0.0009335 0 Optimization terminated: average change in the fitness value less than options.FunctionTolerance and constraint violation is less than options.ConstraintTolerance.
sol2 = struct with fields:
x: 0.4999
y: 3.9979
fval2 = 960.8300
[1] Диксон, L. C. W. и G.P. Szego (редакторы).. К глобальной оптимизации 2. Северная Голландия: Elsevier Science Ltd., Амстердам, 1978.
ga
| solve
| fcn2optimexpr