matlab循环次数多就不停止,【求助】Matlab分支定界循环一定次数后不再继续运行了...

好吧。不过程序挺长,还包括了三个自编的函数,算法也是一个不很通用的算法。而且,刚学的matlab,编的程序可能比较幼稚。就麻烦各位高手了。

主程序(开始的几个矩阵是一个很小规模的,出问题的是一个大规模的矩阵,没办法贴上来):

clear;

time=cputime;

%定义任务数,机器种类及个数,时间长度

n=5;K=2;T=5;M=[2,3];

%定义原问题

f=sparse([14        14        4        4        5        5        14        14        14        14        10        10        0        0        0        0        0]);

m=length(f);

a=sparse([1        1        0        0        0        0        0        0        0        0        0        0        -2        0        0        0        0

0        0        1        1        0        0        0        0        0        0        0        0        0        -2        0        0        0

0        0        0        0        1        1        0        0        0        0        0        0        0        0        -2        0        0

0        0        0        0        0        0        1        1        1        1        0        0        0        0        0        -4        0

0        0        0        0        0        0        0        0        0        0        1        1        0        0        0        0        -2

0        0        0        0        0        0        1        0        0        0        0        0        0        0        0        0        0

0        0        0        0        0        0        2        0        0        0        2        0        0        0        0        0        0

1        0        0        0        0        0        0        1        0        0        0        0        0        0        0        0        0

2        0        0        0        0        0        0        2        0        0        0        2        0        0        0        0        0

0        1        0        0        0        0        0        0        1        0        0        0        0        0        0        0        0

0        2        0        0        0        0        0        0        2        0        0        0        0        0        0        0        0

0        0        1        0        0        0        0        0        0        1        0        0        0        0        0        0        0

0        0        0        0        1        0        0        0        0        2        0        0        0        0        0        0        0

0        0        0        1        0        0        0        0        0        0        0        0        0        0        0        0        0

0        0        0        0        0        1        0        0        0        0        0        0        0        0        0        0        0]);

b=sparse([0 0 0 0 0 2 3 2 3 2 3 2 3 2 3]);

e=-ones(1,n+K*T);e(1:n)=zeros(1,n);e=sparse(e);

u=ones(1,m);

extx=zeros(m,T);extx=sparse(extx);

[rmpobj,x]=rmp_solve(n,K,T,M,extx,f,a,b,e);

%以下为对变量分支定界程序

s=1;

if (round(x)==x)

optx=x;

optobj=rmpobj;

return

else     %若松弛问题解不为整数,则开始对变量xj分支定界

upb=rmpobj;

lowb=greedy(f,a,b,m,n,K,T);

indbou=find(min(abs(x(end-n+1:end)-0.5))==abs(x(end-n+1:end)-0.5),1,'first');

var_br=sparse(zeros(1,n));var_br(1,indbou)=1; %储存在这一节哪些变量被分支;用于blpa的判数

var2_br=sparse(zeros(2,n));var2_br(1,indbou)=1;%储存在这一节哪些变量被定为1,哪些被定为0,用于blpb和extx的判断

var2=find(var2_br(s,:)==1);

blpf=f;

blpa=a;blpa(indbou,m-n+indbou)=0;

blpb=[b;b]; blpb(s,indbou)=-a(indbou,m-n+indbou);

blpe=e;

blpu=u;

%     blp(s)=lp_maker(blpf,blpa,blpb(s,:),blpe,[],blpu,[],1);

extx=sparse(zeros(m,2*T));extx(:,1:T)=iex1(n,K,T,m,M,a,var2);

if extx(:,1:T)==-ones(m,T)

blpobj(s)=-1;

blpx(:,s)=zeros(m,1);

pool(s)=0;

else

pool(s)=s;

end

s=s+1;

%     blp(s)=lp_maker(blpf,blpa,blpb(s,:),blpe,[],blpu,[],1);

pool(s)=s;

s=s+1;

while(nnz(pool)>0)

bpool=max(pool);spool=bpool-1;

for i=spool:bpool

if i==spool  %判断该用哪个blpb

j=1;

else

j=2;

end

[blpobj(i),blpx(:,i)]=rmp_solve(n,K,T,M,extx(:,(j-1)*T+1:j*T),blpf,blpa,blpb(j,:),blpe);

if blpx(:,i)~=zeros(m,1)   %以防无解

blpx(m-n+indbou,i)=1;

end

pool(i)=0;

end

if round(blpx(:,spool))==blpx(:,spool)

if blpobj(spool)>lowb

lowb=blpobj(spool);

end

end

if round(blpx(:,bpool))==blpx(:,spool)

if blpobj(bpool)>lowb

lowb=blpobj(bpool);

end

end

if max(blpobj)>lowb

branch=find(max(blpobj)==blpobj,1,'first');

upb=blpobj(branch);

blpobj(branch)=-blpobj(branch);   %一旦其被分支,将其值设为负值以确保以后选择分支时其不会被选中

indbou=find(min(abs(blpx(end-n+1:end,branch)-0.5))==abs(blpx(end-n+1:end,branch)-0.5),1,'first');

var_br((s+1)/2,:)=var_br(ceil(branch/2),:);var_br((s+1)/2,indbou)=1;

var=find(var_br((s+1)/2,:)==1);

blpa=a;blpa(var,m-n+var)=0;blpa=sparse(blpa);

var2_br(s,:)=var2_br(branch,:);var2_br(s,indbou)=1;

var2=find(var2_br(s,:)==1);

blpb(1,:)=b;blpb(1,var2)=nonzeros(-a(var2,m-n+var2));

%             blp(s)=lp_maker(blpf,blpa,blpb(1,:),blpe,[],blpu,[],1);

extx(:,1:T)=iex1(n,K,T,m,M,a,var2);

if extx(:,1:T)==-ones(m,T)

blpobj(s)=-1;

blpx(:,s)=zeros(m,1);

pool(s)=0;

else

pool(s)=s;

end

s=s+1;

var2_br(s,:)=var2_br(branch,:);

var2=find(var2_br(s,:)==1);

blpb(2,:)=b;blpb(2,var2)=nonzeros(-a(var2,m-n+var2));

%             blp(s)=lp_maker(blpf,blpa,blpb(2,:),blpe,[],blpu,[],1);

extx(:,T+1:2*T)=iex1(n,K,T,m,M,a,var2);

pool(s)=s;

s=s+1;

end

end

end

r=cputime-time;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值