整数规划_分支定界法_MATLAB程序

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档