一、线性规划
目标函数以及约束条件均为线性函数,则属于线性规划问题。
c=[-5;-4;-6];
a=[1,-1,1;3,2,4;3,2,0];
b=[20;42;30];
lb=zeros(3,1);
[x,y]=linprog(c,a,b,[],[],lb)
线性规划的标准型为
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS),其中c为所求等式的未知数系数;A是各个不等式左边未知数前系数;b是不等式右边的值;Aeq,beq是对应等式约束AX=b;LB与UB分别是变量x的下界和上界;X0是x的初始值;options是控制参数。
这里是求最大,在计算时,c应改为-c。
也有一种方法:在计算前将所给出的式子全部化成标准的形式,小于等于以及求最小值。
形同:
二、非线性规划
目标函数与约束条件中包含非线性函数,则属于非线性规划问题。
x=fmincon(fun,x0,A,B,Aeq,Beq,LB,UB,NONLCON,OPTIONS):返回值向量x;其中fun是所求函数;x0是初始值;Aeq,Beq定义了线性约束Ax<=B;LB,UB是变量x的下界和上界,NONLCON是非线性向量函数。
fun1.m:
function f=fun1(x);
f=x(1)^2+x(2)^2+8;
fun2.m:
function[g,h]=fun2(x);
g=-x(1)^2+x(2);
h=-x(1)-x(2)^2+2;
command:
options=optimset;
[x,y]=fmincon('fun1',rand(2,1),[],[],[],[],zeros(2,1),[],'fun2',options)
其中rand(2,1)是生成二行一列的随机数。
三、二次规划
目标函数为自变量x的二次函数,约束条件又全是线性的,为二次规划。
[x,fval]=quadprog(h,f,a,b,Aeq,beq,LB,UB,X0,OPTIONS)
h=[4,-4;-4,8];
f=[-6;-3];
a=[1,1;4,1];
b=[3;9];
[x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))
四、整数规划
规划中的变量(部分或全部)限制为整数时,则为整数规划。
五、0-1整数规划
方法:使用枚举法
六、随机取样计算法
针对非线性整数规划使用。
mengte.m:
function [f,g]=mengte(x);
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5);
g(1)=sum(x)-400;
g(2)=x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800;
g(3)=2*x(1)+x(2)+6*x(3)-200;
g(4)=x(3)+x(4)+5*x(5)-200;
command:
rand('state',sum(clock));
p0=0;
tic
for i=1:10^5
x=99*rand(5,1);
x1=floor(x);x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc
其中sum(g<=0)==4表示的是g(n)函数满足全部小于等于0。另外一种理解就是要满足开始给出的条件,然后g函数有4个。
rand(‘state’,sum(clock))是为了避免rand每次给出的随机初值一样,所以经常在程序前运行或加命令rand(‘state’,sum(clock)),这样重启matlab,运行随机数生成值就不同了。
结果: