整数规划_分支定界法_MATLAB程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function [x,y]=lpint(f,G,h,lb,ub,x,n,id)
% 整数线性规划分枝定界法,可求解线性全整数或线性混合整数规划
% 此程序基于Matlab优化工具箱的lp函数写成
% 此程序为GreenSim团队原创作品,转载请注明
% 欢迎访问GreenSim团队的主页/greensim
% y = min f'x subject to: Gx <= h x为整% x
% 用法
% [x,y]=lpint(f,G,h)
% [x,y]=lpint(f,G,h,lb,ub)
% [x,y]=lpint(f,G,h,lb,ub,x)
% [x,y]=lpint(f,G,h,lb,ub,x,n)
% [x,y]=lpint(f,G,h,lb,ub,x,n,id)
% 参数说明
% x: 最优解列向量
% y: 目标函数最小值
% f: 目标函数系数列向量
% G: 约束条件系数矩阵
% h: 约束条件右端列向量
% lb: 解的的下界列向量(Default: -inf)
% ub: 解的的上界列向量(Default: inf)
% x: 迭代初值列向量
% n: 等式约束数(Default: 0)
% id: 整数变量指标列向量。1-整数,0-实数(Default: 1)
% 举例
% min Z=x1+4x2
% s.t. 2x1+x2<=8
% x1+2x2>=6
% x1, x2>=0且为整数
%先将x1+2x2>=6化为 - x1 - 2x2<= -6
%》[x,y]=lpint([1;4],[2 1;-1 -2],[8;-6],[0;0])
% Y. MA & L.J. HU 1999
global upper opt c N x0 A b ID;
if nargin<8, id=ones(size(f));end
if nargin<7|isempty(n), n=0;end
if nargin<6, x=[];end
if nargin<5|isempty(ub), ub=inf*ones(size(f));end
if nargin<4|isempty(lb), lb=zeros(size(f));end
upper=inf;
c=f;N=n;x0=x;A=G;b=h;ID=id;
temp=ILP(lb(:),ub(:));
x=opt;y=upper;
%以下子函数
function y=ILP(vlb,vub)
global upper opt c N x0 A b ID;
warning off;
[x,temp,how]=lp(c,A,b,vlb,vub,x0,N,-1);
if strcmp(how,'ok')~=1
return;
end;
if c'*x-upper>0.00005 %in order to avoid error
return;
end;
if max(abs(x.*ID-round(x.*ID)))<0.00005
if upper-c'*x>0.00005 %in order to avoid error
opt=x';
upper=c'*x;
return;
else
opt=[opt;x'];
return;
end;
end;
notintx=find(abs(x-round(x))>=0.00005); %in order to avoid error intx=fix(x);
tempvlb=vlb;
tempvub=vub;
if vub(notintx(1,1),1)>=intx(notintx(1,1),1)+1
tempvlb(notintx(1,1),1)=intx(notintx(1,1),1)+1;
temp=ILP(tempvlb,vub);
end;
if vlb(notintx(1,1),1)<=intx(notintx(1,1),1)
tempvub(notintx(1,1),1)=intx(notintx(1,1),1);
temp=ILP(vlb,tempvub);
end;