最优化优化工具箱.docx
《最优化优化工具箱.docx》由会员分享,可在线阅读,更多相关《最优化优化工具箱.docx(24页珍藏版)》请在冰豆网上搜索。
最优化优化工具箱
MATLAB优化工具箱
1、线性规划
1.1一般线性规划(linprog)
1.1.1数学模型
其中,,,,和为向量,和为矩阵.
1.1.2相关语法
x=linprog(f,A,b)
x=linprog(f,A,b,Aeq,beq)
x=linprog(f,A,b,Aeq,beq,lb,ub)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0)
x=linprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=linprog(…)
[x,fval,exitflag]=linprog(…)
[x,fval,exitflag,output]=linprog(…)
[x,fval,exitflag,output,lambda]=linprog(…)
1.1.3实例分析
例1、求解如下线性规划模型
代码:
f=[-2;-3;-1];
A=[122;147];
b=[4;9];
lb=[0;0;0];
[x,fval]=linprog(f,A,b,[],[],lb)
Optimizationterminated.
x=
4.0000
0.0000
0.0000
fval=
-8.0000
即原问题的最优解为,最优值为8.
例2、求解如下线性规划模型
代码:
f=[5;0;21];
A=[-11-6;-1-1-2];
b=[-2;-1];
lb=[0;0;0];
[x,fval]=linprog(f,[],[],A,b,lb)
Optimizationterminated.
x=
0.5000
0.0000
0.2500
fval=
7.7500
即原问题的最优解为,最大值为-7.75.
1.20-1线性规划(bintprog)
1.2.1数学模型
其中,,,,和为向量,和为矩阵.
1.2.2相关语法
x=bintprog(f,A,b)
x=bintprog(f,A,b,Aeq,beq)
x=bintprog(f,A,b,Aeq,beq,lb,ub)
x=bintprog(f,A,b,Aeq,beq,lb,ub,x0)
x=bintprog(f,A,b,Aeq,beq,lb,ub,x0,options)
[x,fval]=bintprog(…)
[x,fval,exitflag]=bintprog(…)
[x,fval,exitflag,output]=bintprog(…)
1.2.3实例分析
代码:
f=[-193;-191;-187;-186;-180;-185];
A=[0000-1-1;0-100-10;110000;010001;000101];
b=[-1;-1;1;1;1];
Aeq=[111111];
beq=[3];
x=bintprog(f,A,b,Aeq,beq)
Optimizationterminated.
x=
1
0
1
0
1
0
即原问题的最优解为,z=560.
1.3整数线性规划(intprog)
1.3.1数学模型
其中,,,,和为向量,和为矩阵.
1.3.2相关语法
function[x,fval,status]=intprog(f,A,B,I,Aeq,Beq,lb,ub,e)
%整数规划求解函数intprog()
%其中f为目标函数向量
%A和B为不等式约束Aeq与Beq为等式约束
%I为整数约束
%lb与ub分别为变量下界与上界
%x为最优解,fval为最优值
%例子:
%maximize20x1+10x2
%S.T.
%5x1+4x2<=24
%2x1+5x2<=13
%x1,x2>=0
%x1,x2是整数
%f=[-20,-10];
%A=[54;25];
%B=[24;13];
%lb=[00];
%ub=[infinf];
%I=[1,2];
%e=0.000001;
%[xvs]=IP(f,A,B,I,[],[],lb,ub,,e)
%x=41v=-90.0000s=1
%控制输入参数
ifnargin<9,e=0.00001;
ifnargin<8,ub=[];
ifnargin<7,lb=[];
ifnargin<6,Beq=[];
ifnargin<5,Aeq=[];
ifnargin<4,I=[1:
length(f)];
end,end,end,end,end,end
%求解整数规划对应的线性规划,判断是否有解
options=optimset('display','off');
[x0,fval0,exitflag]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options);
ifexitflag<0
disp('没有合适整数解');
x=x0;
fval=fval0;
status=exitflag;
return;
else
%采用分支定界法求解
bound=inf;
[x,fval,status]=branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
end
funtion[newx,newfval,status,newbound]
branchbound(f,A,B,I,x,fval,bound,Aeq,Beq,lb,ub,e)
%分支定界法求解整数规划
%f,A,B,Aeq,Beq,lb,ub与线性规划相同
%I为整数限制变量的向量
%x为初始解,fval为初始值
options=optimiset('display','off');
[x0,fval0,status0]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options);
%递归中的最终退出条件
%无解或者解比现在有上界大则返回原解
ifstatus0<=0||fval>=bound
newx=x;
newfval=fval;
newbound=bound;
status=status0;
return;
end
%是否为整数解,如果是整数解则返回原解
intindex=find(abs(x0(I)-round(x0(I)))>e);
ifisempty(intindex)
newx(I)=round(x0(I));
newfval=fval0;
newbound=fval0;
status=1;
return;
end
%当有非整可行解时,则进行分支求解
%此时必定会有整数解或空解
%找到第一个不满足整数要求的变量
n=I(intindex
(1));
addA=zeros(1,length(f));
addA(n)=1;
%构造第一个分支x<=floor(x(n))
A=[A;addA];
B=[B;floor(x(n))];
[x1,fval1,status1,bound1]=branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
A(end,:
)=[];
B(:
end)=[];
%解得第一个分支,若为更优解则替换,若不是则保持原状
status=status1;
ifstatus1>0&&boundnewx=x1;
newfval=fval1;
bound=fval1;
newbound=bound1;
else
newx=x0;
newfval=fval0;
newbound=bound;
end
%构造第二分支
A=[A;-addA];
B=[B;-ceil(x(n))];
[x2,fval2,status2,bound2]=branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
A(end,:
)=[];
B(:
end)=[];
%解得第二分支,并与第一分支作比较,若更忧则替换
ifstatus2>0&&bound2status=status2;
newx=x2;
newfval=fval2;
newbound=bound2;
end
1.3.3实例分析
例1、求解下列运输问题.
代码:
f=[2;9;10;7;1;3;4;2;8;4;2;5];
Aeq=[111100000000
000011110000
000000001111
100010001000
010001000100
001000100010
000100010001];
beq=[9;5;7;3;8;4;6];
I=[1:
length(f)];
lb=zeros(12,1);
[x,fval]=intprog(f,[],[],I,Aeq,beq,lb)
Optimizationterminated.
x=
300605000340
fval=
83.0000
即原问题的最优值为83.
2、非线性规划
2.1无约束非线性规划
2.1.1单变量优化(fminbnd)
2.1.1.1数学模型
其中,和为标量,为函数,返回标量.
2.1.1.2相关语法
x=fminbnd(fun,x1,x2)
x=fminbnd(fun,x1,x2,options)
x=fminbnd(fun,x1,x2,options,P1,P2,…)
[x,fval]=fminbnd(…)
[x,fval,exitflag]=fminbnd(…)
[x,fval,exitflag,output]=fminbnd(…)
2.1.1.3实例分析
例1、在区间[0,1]上求函数的最小值.
代码:
%先定义函数f(x)的M文件f1114.m
functionf=f1114(x)
f=x^5+x^3-7*x+1;
%主程序
%调用fminbnd函数
[x,fval]=fminbnd('f1114',0,1)
x=
0.9595
fval=
-4.0199
即原问题在x=0.9595处取得最小值-4.0199.
2.1.1.4常见算法
(1)二分法程序以及实例
程序:
functiony=erfen(fun,a,b,esp)
ifnargin<4
esp=1e-4;
end
iffeval(fun,a)*feval(fun,b)
n=1;
c=(a+b)/2;
whilec>esp
iffeval(fun,a)*feval(fun,c)<0
b=c;
c=(a+b)/2;
elseiffeval(fun,c)*feval(fun,b)<0
a=c;
c=(a+b)/2;
else
y=c;
es