matlab工具箱并没有intprog.m
,而在做整数规划时会用到此函数,这是代码,只需建立.m
文件放在相应目录即可调用。
代码如下:
function[x,fval,exitflag]=intprog(f,A,b,Aeq,beq,lb,ub,M,TolXInteger)
options=optimset('display','off');
bound=inf;
[x0,fval0]=linprog(f,A,b,Aeq,beq,lb,ub,[],options);
[x,fval,exitflag,b]=rec_BranchBound(f,A,b,Aeq,beq,lb,ub,x0,fval0,M,TolXInteger,bound);
function[xx,fval,exitflag,bb]=rec_BranchBound(f,A,b,Aeq,beq,lb,ub,x,v,M,TolXInteger,bound)
options=optimset('display','off');
[x0,fval0,exitflag0]=linprog(f,A,b,Aeq,beq,lb,ub,[],options);
if exitflag0<=0||fval0>bound
xx=x;
fval=v;
exitflag=exitflag0;
bb=bound;
return;
end
ind=find(abs(x0(M)-round(x0(M)))>TolXInteger);
if isempty(ind)
exitflag=1;
if fval0 x0(M)=round(x0(M));
xx=x0;
fval=fval0;
bb=fval0;
else
xx=x;
fval=v;
bb=bound;
end
return;
end
[row col]=size(ind);
br_var=M(ind(1));
br_value=x(br_var);
flag=abs(br_value-floor(br_value)-0.5);
for i=2:col
tempbr_var=M(br_var);
tempbr_value=x(br_var);
temp_flag=abs(tempbe_value-floor(tempbr_value)-0.5);
if temp_flag>flag
br_var=tempbr_var;
br_value=tempbr_value;
flag=temp_flag;
end
end
if isempty(A)
[r c]=size(Aeq);
else
[r c]=size(A);
end
A1=[A;zeros(1,c)];
A1(end,br_var)=1;
b1=[b;floor(br_value)];
A2=[A;zeros(1,c)];
A2(end,br_var)=-1;
b2=[b;-ceil(br_value)];
[x1,fval1,exitflag1,bound1]=rec_BranchBound(f,A1,b1,Aeq,beq,lb,ub,x0,fval0,M,TolXInteger,bound);
exitflag=exitflag1;
if exitflag1>0&&bound1 xx=x1;
fval=fval1;
bound=bound1;
bb=bound1;
else
xx=x0;
fval=fval0;
bb=bound;
end
[x2,fval2,exitflag2,bound2]=rec_BranchBound(f,A2,b2,Aeq,beq,lb,ub,x0,fval0,M,TolXInteger,bound);
if exitflag2>0&&bound2 exitflag=exitflag2;
xx=x2;
fval=fval2;
bb=bound2;
end