主要内容

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

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

约束的最小化问题

对于这个问题,最小化的目标函数是一个二维变量的简单函数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
函数y = simple_objective(x) % simple_objective for PATTERNSEARCH solver %版权所有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 - 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)
优化终止:适应度值的平均变化小于选项。FunctionTolerance和约束违规小于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个变量2个非对称约束选项:CreationFcn: @gacreationuniform CrossoverFcn: @crossoverscattered SelectionFcn: @selectionstochunif MutationFcn: @ mutationadapt可行最佳最大Stall Generation funccount f(x) constraints 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和约束违规小于options. constraintolerance。

{

x =1×20.8122 - 12.3103
fval = 9.1268 e + 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: @ 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和约束违规小于options. constraintolerance。

{

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

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

参考文献

狄克逊,l.c.w., G . p。Szego (eds)。向着全球优化2。荷兰北部:爱思唯尔科学有限公司,阿姆斯特丹,1978。

相关的话题

Baidu
map