12.4 Matlab遗传算法函数
1.遗传算法使用规则
遗传算法是一种基于自然选择、生物进化过程来求解问题的方法。在每一步中,遗传算法随机地从当前种群中选择若干个体作为父辈,并且使用它们产生下一代的子种群。在连续若干代之后,种群朝着优化解的方向进化。可以用遗传算法求解各种不适宜用标准算法求解的优化问题,包括目标函数不连续、不可微、随机或高度非线性的问题。
遗传算法在每一步使用下列三类规则从当前种群来创建下一代:
- 选择规则:选择对下一代种群有贡献的个体(称为父辈)。
- 交叉规则:将两个父辈结合起来构成下一代的子辈种群。
- 变异规则:施加随机变化用父辈个体来构成子辈。
遗传算法与标准优化算法主要在两个方面有所不同,它们的比较情况归纳于表12.4中。
表12.4 遗传算法与标准优化算法比较
标准算法 | 遗传算法 |
---|---|
每次迭代产生一个单点,点的序列逼近一个优化解 | 每次迭代产生一个种群,种群逼近一个优化解 |
通过确定性的计算在该序列中选择下一个点 | 通过随机进化选择计算来选择下一代种群 |
2.遗传算法函数
遗传算法函数ga调用格式如下:
[x,fval]=ga(fun,nvars,A,b,Aeq,beq,LB,UB,nonlcon,options)
其中:fun
是目标函数,nvars
是目标函数中独立变量的个数,options
是一个包含遗传算法选项参数的数据结构,其他参数的含义与非线性规划fmincon
中的参数相同。
返回值x
为所求函数的局部极小点,这里x
为行向量,fval
为目标函数的极小值。
例12.1 求下列问题的解
maxf(x)=2x1+3x12+3x2+x22+x3,s.t.{x1+2x12+x2+2x22+x3≤10,x1+x12+x2+x22−x3≤50,2x1+x12+2x2+x3≤40,x12+x3=2,x1+2x2≥1,x1≥0,x2,x3不约束.
\max f(x)=2x_1+3x_1^2+3x_2+x_2^2+x_3,\\
s.t.
\left\{\begin{aligned}
& x_1+2x_1^2+x_2+2x_2^2+x_3\leq 10,\\
& x_1+x_1^2+x_2+x_2^2-x_3\leq 50,\\
& 2x_1+x_1^2+2x_2+x_3\leq 40,\\
& x_1^2+x_3=2,\\
& x_1+2x_2\geq 1,\\
& x_1\geq 0,x_2,x_3不约束.
\end{aligned}\right.
maxf(x)=2x1+3x12+3x2+x22+x3,s.t.⎩⎨⎧x1+2x12+x2+2x22+x3≤10,x1+x12+x2+x22−x3≤50,2x1+x12+2x2+x3≤40,x12+x3=2,x1+2x2≥1,x1≥0,x2,x3不约束.
解 遗传算法程序的运行结果每一次都是不一样的,要运行多次,找一个最好的结果。
f=@(x) 2*x(1)+3*x(1)^2+3*x(2)+x(2)^2+x(3);
nvars=3;
A=[-1,-2,0;-1,0,0];b=[-1,0]';
[x,fval]=ga(f,nvars,A,b,[],[],[],[],@constr)
function [con1,con2]=constr(x)
con1=[x(1)+2*x(1)^2+x(2)+2*x(2)^2+x(3)-10;x(1)+x(1)^2+x(2)+x(2)^2-x(3)-50;2*x(1)+x(1)^2+2*x(2)+x(3)-40];
con2=x(1)^2+x(3)-2;
end
因为书里的遗传算法太抽象了,于是这里先介绍简单的ga函数。打算之后用python练一下,毕竟python有vscode带的插件和cursor,会比较容易。