matlab的intprog函数,解决整数规划问题(matlab本身不带,需自己创建函数)

本文介绍了一种在Matlab中没有内置的intprog函数的解决方案,通过linprog和自定义的rec_BranchBound函数实现整数规划。重点讲解了如何通过递归和分支搜索优化算法来求解整数优化问题。
摘要由CSDN通过智能技术生成

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
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好饿呀~~~

我这么菜,配得上你的打赏吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值