这个例子展示了如何使用遗传算法最小化一个受非线性不等式约束和边界的目标函数。
对于这个问题,要最小化的目标函数是一个二维变量的简单函数x
.
simple_objective (x) = (4 - 2.1 * (1) ^ 2 + x (1) ^ 4/3) * x (1) ^ 2 + x (1) * (2) + (4 + 4 * x (2) ^ 2) * x (2) ^ 2;
正如L.C.W. Dixon和G.P. Szego所描述的,这种功能被称为“cam”[1].
此外,该问题具有非线性约束和边界。
10 - X (1)* X(2) <= 0(非线性约束)0 <= X(1) <= 1(约束)0 <= X(2) <= 13(约束)
创建一个MATLAB文件名为simple_objective.m
包含以下代码:
类型simple_objective
function y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有x2 = x (2);y = (4 - 2.1 * x1。^ 2 + x1。^ 4. / 3)。* x1。^ 2 + x1。* x2 + (4 + 4 * x2。^ 2)。* x2。^ 2;
连接器等遗传算法
接受单个输入x
,在那里x
元素的数量与问题中变量的数量相同。目标函数计算目标函数的标量值,并在其单个输出参数中返回y
.
创建一个MATLAB文件名为simple_constraint.m
包含以下代码:
类型simple_constraint
函数[c, ceq] = simple_constraint(x) %c = [1.5 + x(1)*x(2) + x(1) - x(2);x - x (1) * (2) + 10);%无非线性等式约束:ceq = [];
约束函数计算所有不等式和等式约束的值,并返回向量c
和量表信
,分别。的价值c
表示求解器试图使之小于或等于零的非线性不等式约束。的价值量表信
表示求解器试图使其等于零的非线性等式约束。这个例子没有非线性等式约束,所以测查= []
.有关详细信息,请参见非线性约束.
遗传算法
将目标函数指定为函数句柄。
ObjectiveFunction = @simple_objective;
指定问题的边界。
Lb = [0 0];%下界Ub = [1 13];%上界
将非线性约束函数指定为函数句柄。
ConstraintFunction = @simple_constraint;
指定问题变量的数量。
据nvar = 2;
呼叫解算器,请求最佳点x
函数在最优点处的值fval
.
rng默认的%的再现性[x, fval] = ga (ObjectiveFunction,据nvar ,[],[],[],[], 磅,乌兰巴托,ConstraintFunction)
优化终止:适应度值的平均变化小于选项。函数容忍度和约束违背小于options. constraintolerance。
x =1×20.8122 - 12.3103
fval = 9.1268 e + 04
要观察求解器的进程,请指定选择两个绘图函数的选项。绘制函数gaplotbestf
绘制每次迭代的最佳目标函数值,并绘制函数gaplotmaxconstr
绘制每个迭代的最大约束违背。在单元格数组中设置这两个绘图函数。控件,在命令窗口中显示有关求解器进度的信息显示
选项“通路”
.
选择= optimoptions (“遗传算法”,“PlotFcn”{@gaplotbestf, @gaplotmaxconstr},...“显示”,“通路”);
运行求解器,包括选项
论点。
[x, fval] = ga (ObjectiveFunction,据nvar ,[],[],[],[], 磅,乌兰巴托,...ConstraintFunction选项)
单目标优化:2变量(s) 2非线性不等式约束(s)@mutationadaptfeasible Best Max Stall Generation Func-count f(x) Constraint Generations 1 2520 91342.3 00 2 4982 91324.1 4.605e-05 0 3 7914 97166.5 00 4 16157 96997.8 00 5 20675 91267.2 0.0009994 0优化终止:适应度值的平均变化小于选项。函数容忍度和约束违背小于options. constraintolerance。
x =1×20.8123 - 12.3103
fval = 9.1267 e + 04
通过迭代显示遗传算法
提供有关问题类型和创建、交叉、变异和选择操作符的详细信息。
非线性约束的原因遗传算法
在每次迭代中解决许多子问题。从图和迭代显示中可以看出,求解过程的迭代次数很少。然而,Func-count
列在迭代显示中显示每个迭代的许多函数求值。
的遗传算法
求解器处理线性约束和边界不同于非线性约束。在整个优化过程中,所有的线性约束和界限都得到满足。然而,遗传算法
可能不满足每一代的所有非线性约束。如果遗传算法
收敛于一个解,非线性约束将在该解处得到满足。
遗传算法
利用突变和交叉功能在每一代产生新的个体。的方式遗传算法
满足线性和有界约束的是使用突变和交叉函数,只生成可行点。例如,在前面的调用中遗传算法
,默认突变函数(对于无约束问题)mutationgaussian
不满足线性约束等等遗传算法
使用mutationadaptfeasible
函数。如果您提供自定义突变函数,则该自定义函数必须仅生成相对于线性和有界约束可行的点。工具箱中的所有交叉函数生成满足线性约束和边界的点。
然而,当你的问题包含整数约束时,遗传算法
强制所有迭代满足边界和线性约束。这种可行性发生在所有的变异、交叉和创建操作符,在一个小的容忍范围内。
为加快求解器的速度,可以在InitialPopulationMatrix
选择。遗传算法
使用初始种群开始优化。指定行向量或矩阵,其中每一行表示一个起点。
X0 = [0.8 12.5];起始点(行向量)选项。InitialPopulationMatrix = X0;[x, fval] = ga (ObjectiveFunction,据nvar ,[],[],[],[], 磅,乌兰巴托,...ConstraintFunction选项)
单目标优化:2变量(s) 2非线性不等式约束(s)@mutationadaptfeasible Best Max Stall Generation function -count f(x) Constraint Generations 1 2500 92164.1 00 2 4950 91289.2 0.0009729 0 3 7400 91267.4 0.0009877 0 4 9850 91267.3 0.0009912 0 5 12300 91267.3 0.0009912 1优化终止:适应度值的平均变化小于选项函数容忍度和约束违背小于options. constraintolerance。
x =1×20.8122 - 12.3103
fval = 9.1267 e + 04
在这种情况下,提供一个起点并不会实质上改变求解程序的进程。
L. C. W.迪克森和G . p。Szego (eds)。面向全局优化北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978。