案例求下列函数的最小值:
约束条件如下:
,的取值范围为:-100~100
,的取值范围为:0~10
MATLAB代码
1.首先创建函数optimization.m
%首先要先不等式转换为标准形式
%f:目标函数
%A,b:线性不等式约束
%lb,ub:决策变量上下界
%c,ceq:非线性不等式约束与非线性等式约束
%目标函数一定要转换为min类型的
%如果是max类型,需要把系数全部取负,并且将最后的结果*-1,得到正确的结果
functionf=optimization(x)
f=(x(1)-2)^2+(x(2)-1)^2+(x(3)-7)^2 +(x(4)-9)^2
end
%保存一下
2.开始编写约束条件变量
%%看看A和b
%min f(x) = (x1-2)^2+(x2-1)^2+(x4-9)^2
%x1-2x2+x3-x4+1>=0
%2x1+x2-2x3+x4+5>=0
%x1^2/4-x2^2+x3-x4^2+1>=0
%x1^2+x2-x3+x4=99
%x1,x2的取值范围为-100~100
%x3,x4的取值范围为0~10
A= [-1 2 -1 1;-2 1 2 -1]; % 因为原式是>=,同样也需要转换成<=的形式
b= [-1;5]; % b是线性不等式约束的右侧的值,因为移过去再乘以-1,所以相当于没变
%%Aeq和beq
%本约束条件中未出现线性等式约束,所以可赋值为空
Aeq= [];
beq= [];
%%lb和ub
%决策变量的上下界
lb= [-100 -100 0 0]; % 表示x1~x4的最小值分别为-100-100 0 0
ub= [100 100 10 10];
%%c和ceq
%非线性不等式约束和非线性等式约束我们也要放进一个专门的函数里面
3.编写非线性不等式约束和非线性等式约束代码函数myfun
function[c,ceq] = myfun(x)
%c是非线性不等式约束
c= -1*(1/4*x(1)^2-x(2)^2+x(3)-x(4)^2+1); % 转换成小于等于
%ceq是非线性等式约束
ceq= x(1)^2+x(2)-x(3)+x(4)-99;
%如果c和ceq不止一个,那么可以写成矩阵的形式:类似A= [-1 2 -1 1;-2 1 2 -1];
End
4.执行一下约束条件变量,如下图:
5.在命令行中输入optimtool打开遗传算法工具箱。
遗传算法工具箱操作
- 首先选择遗传算法
- fitness function是目标函数
- Number of variables:变量的个数
- Integer variable indices:可取整数的变量的下标,这里没有可以取变量的整数
在工具箱中输入内容如下:
- 作图可以勾选前三个,把display to command window 改为迭代
然后点击Start:
点击start之后会出现下面这个图:
在这里由于迭代次数太少导致从图中看不出什么明显的结果。然后在start下面的表格内,有最优值和各个变量的值。
然后最优值和其变量的值已经解出来了,可以多求几次求平均值,都是可以的。
遗传算法工具箱不允许规划类方程中,同时出现线性约束和整型约束的,否则特别容易得到无解,甚至不能运行。