主要内容

基于遗传算法的约束最小化算法

这个例子展示了如何最小化目标函数受非线性不等式约束和界限使用遗传算法。

约束最小化问题

对于这个问题,最小化的目标函数是一个简单的二维变量函数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所描述的那样,这个函数被称为“凸轮”[1]

此外,该问题具有非线性约束和边界。

X (1)* X (2) + X (1) - X(2) + 1.5 <= 0(非线性约束)10 - X (1)* X(2) <= 0(非线性约束)0 <= X(1) <= 1(边界)0 <= X(2) <= 13(边界)

编码适应度函数

创建一个名为simple_objective.m包含以下代码:

类型simple_objective
版权所有2004 The MathWorks, Inc. x1 = x(1);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

编码约束函数

创建一个名为simple_constraint.m包含以下代码:

类型simple_constraint
function [c, ceq] = simple_constraint(x) % simple_constraint非线性不等式约束。c = [1.5 + x(1)*x(2) + x(1) - x(2);-x(1)*x(2) + 10];%无非线性等式约束:ceq = [];

约束函数计算所有不等式和等式约束的值,并返回向量c而且量表信,分别。的价值c表示求解器试图使其小于或等于零的非线性不等式约束。的价值量表信表示求解器试图使其等于零的非线性等式约束。这个例子没有非线性等式约束,所以Ceq = [].详细信息请参见非线性约束

尽量减少使用遗传算法

将目标函数指定为函数句柄。

ObjectiveFunction = @simple_objective;

指定问题边界。

Lb = [0 0];%下界Ub = [1 13];%上界

将非线性约束函数指定为函数句柄。

约束函数= @simple_constraint;

指定问题变量的数量。

Nvars = 2;

调用求解器,请求最优点x和最优点的函数值fval

rng默认的%用于再现性[x,fval] = ga(ObjectiveFunction,nvars,[],[],[],[],lb,ub,ConstraintFunction)
优化终止:适应度值的平均变化小于选项。FunctionTolerance和constraint违例要小于options. constraintolerance。
x =1×20.8122 - 12.3103
Fval = 9.1268e+04

添加可视化

要观察求解器的进度,请指定选择两个绘图函数的选项。图函数gaplotbestf绘制每次迭代的最佳目标函数值,并绘制函数gaplotmaxconstr在每次迭代中绘制最大的约束违反。在单元格数组中设置这两个绘图函数。属性,在“命令窗口”中显示有关求解器的进度的信息显示选项“通路”

选项= optimoptions(“遗传算法”“PlotFcn”{@gaplotbestf, @gaplotmaxconstr},...“显示”“通路”);

运行求解器,包括选项论点。

[x, fval] = ga (ObjectiveFunction,据nvar ,[],[],[],[], 磅,乌兰巴托,...ConstraintFunction选项)
单目标优化:2变量(s) 2非线性不平等约束(s)选项:CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @ mutationadapt可行Best Max Stall Generation funcc -count f(x) constraint Generations 1 2524 91986.8 7.786e-09 0 2 4986 94677.4 00 3 10362 96929.2 00 4 16067 96006.3 00 5 23405 91267.6 0.0009898 0优化终止:适应度值的平均变化小于选项。FunctionTolerance和constraint违例要小于options. constraintolerance。

{

x =1×20.8122 - 12.3103
Fval = 9.1268e+04

使用迭代显示遗传算法提供有关问题类型以及创建、交叉、变异和选择操作符的详细信息。

非线性约束原因遗传算法在每次迭代中解决许多子问题。从图中和迭代显示中可以看出,求解过程迭代次数很少。然而,Func-count迭代显示中的列显示每次迭代的许多函数计算。

遗传算法求解器处理线性约束和边界不同于非线性约束。在整个优化过程中,所有的线性约束和边界都得到了满足。然而,遗传算法可能不能在每一代都满足所有的非线性约束。如果遗传算法收敛到一个解,非线性约束将满足该解。

遗传算法利用变异和交叉函数在每一代产生新的个体。这种方式遗传算法满足线性约束和有界约束的方法是使用只生成可行点的变异和交叉函数。例如,在前面调用遗传算法,默认的突变函数(用于无约束问题)mutationgaussian不满足线性约束遗传算法使用mutationadaptfeasible默认为函数。如果您提供了一个自定义突变函数,这个自定义函数必须只生成与线性约束和绑定约束相关的可行点。工具箱中的所有交叉函数都会生成满足线性约束和边界的点。

然而,当你的问题包含整数约束时,遗传算法强制所有迭代都满足边界和线性约束。这种可行性适用于所有的突变、交叉和创建操作符,在一个小的容忍范围内。

提供一个起点

方法中提供初始填充以加快求解程序的速度InitialPopulationMatrix选择。遗传算法使用初始填充开始其优化。指定一个行向量或矩阵,其中每行代表一个起点。

X0 = [0.8 12.5];起始点(行向量)选项。InitialPopulationMatrix = X0;[x, fval] = ga (ObjectiveFunction,据nvar ,[],[],[],[], 磅,乌兰巴托,...ConstraintFunction选项)
单目标优化:2变量(s) 2非线性不平等约束(s)选项:CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @ mutationadaptif MutationFcn: @ mutationadapt可行最佳最大Stall生成功能计数f(x)约束生成1 2500 91507.4 00 2 4950 91270.4 0.0009621 0 3 7400 91270.4 0.0009621 1 4 9850 91269.2 0.0009958 0 5 12300 91269.2 0.0009958 1优化终止:适应度值的平均变化小于选项。FunctionTolerance和constraint违例要小于options. constraintolerance。

{

x =1×20.8122 - 12.3104
Fval = 9.1269e+04

在这种情况下,提供一个起点并不会实质上改变求解器的进程。

参考文献

[1]迪克森,l.c.w, g.p。Szego (eds)。朝向全局优化2。北荷兰:爱思唯尔科学有限公司,阿姆斯特丹,1978年。

相关的话题