matlab 整数规划 if条件约束,整数规划的求解方法——分枝定界法

1、概述

设有最大化的整数规划问题 A ,与它相应的线性规划为问题B ,从解问题B

开始,若其最优解不符合A的整数条件,那么B的最优目标函数必是A的最优目标函数z*的上界,记作z

;而A的任意可行解的目标函数值将是z*的一个下界z 。分枝定界法就是将B的可行域分成子区域的方法。逐步减小z 和增大z

,最终求到z*。

2、求解步骤

将要求解的整数规划问题称为问题A,将与它相应的线性规划问题称为问题B。

对问题B进行求解:若B没有可行解,即A也没有可行解,则停止;若B有最优解,并符合A的整数条件,B的最优解即为A的最优解,停止计算;若B有最优解,但不适合A的整数条件,记它的目标函数值为z0;

分枝。此时在B的最优解中任选一个不条例整数条件的变量,从而构造两个约束条件;将这两个问题分别加入到问题B,不考虑整数条件,求解这两个后继问题;

定界。以每个后继问题为一分枝标明求解的结果,与其它问题的解的结果中,找出最优目标函数值最大者作为新的上界。

比较与前枝。各分枝的最优目标函数中若有小于z 者,则剪掉这枝,即以后不再考虑了。若大于z

,且不符合整数条件,则重复第一步骤。

3、Matlab实现代码

function [x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,options)

%整数线性规划分支定界法,可求解纯整数规划和混合整数规划。

%y=minf’*x s.t. G*x<=h Geq*x=heq x为全整数或混合整数列向量

%用法

%[x,y]=ILp(f,G,h,Geq,heq,lb,ub,x,id,options)

%参数说明

%lb:解的下界列向量(Default:-int)

%ub:解的上界列向量(Default:int)

%x:迭代初值列向量

%id:整数变量指标列向量,1-整数,0-实数(Default:1)

global upper opt c x0 A b Aeq beq ID options;

if

nargin<10,options=optimset({});options.Display='off';

options.LargeScale='off';end

if nargin<9,id=ones(size(f));end

if nargin<8,x=[];end

if nargin<7

|isempty(ub),ub=inf*ones(size(f));end

if nargin<6 |isempty(lb),lb=zeros(size(f));end

if nargin<5,heq=[];end

if nargin<4,Geq=[];end

upper=inf;c=f;x0=x;A=G;b=h;Aeq=Geq;beq=heq;ID=id;

ftemp=ILP(lb(:),ub(:));

x=opt;y=upper;

%下面是子函数

function ftemp=ILP(vlb,vub)

global upper opt c x0 A b Aeq beq ID options;

[x,ftemp,how]=linprog(c,A,b,Aeq,beq,vlb,vub,x0,options);

if how <=0

return;

end;

if ftemp-upper>0.00005 %in order to avoid

error

return;

end;

if max(abs(x.*ID-round(x.*ID)))<0.00005

if upper-ftemp>0.00005 %in order to avoid

error

opt=x';upper=ftemp;

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;

ftemp=IntLP(tempvlb,vub);

end;

if vlb(notintx(1,1),1)<=intx(notintx(1,1),1)

tempvub(notintx(1,1),1)=intx(notintx(1,1),1);

ftemp=IntLP(vlb,tempvub);

end;

%====================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值