好吧。不过程序挺长,还包括了三个自编的函数,算法也是一个不很通用的算法。而且,刚学的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;