最优批处理问题
1.问题描述:在一台超级计算机上,编号为1,2……n的n个作业等待批处理。批处理的任务就是将这n个作业分成若干批,每批包含相邻的若干作业。从时刻0开始,分批加工这些作业。在每批作业开始前,机器需要启动时间s,而完成这批作业所需的时间是单独完成批中各个作业需要时间的总和。单独完成第i个作业所需的时间是ti,所需的费用是它的完成时刻乘以一一个费用系数fi。同一批作业将在同一时刻完成。
例如,如果在时刻T开始一批作业x,x+1,,x+k,则这一~批作业的完成时刻均为T+S+(tx, +tx+1 +...+tx+k)。最优批处理问题就是要确定总费用最小的批处理方案。
例如,假定有5个作业等待批处理,且S = 1,(t,t2,ts,t4,t)=(1,3,4,2,1),(f1,f2,f3,f4,f5)=(3,2,3,3,4)如果采用批处理方案{1,2},{3},{4,5},则各作业的完成时间分别为(5,5,10,14,14),各作业的费用分别为(15,10,30,42,56),因此,这个批处理方案总费用是153。
算法设计:对于给定的待批处理的n个作业,计算其总费用最小的批处理方案。
2.最优子结构:
完成n份作业的最优调度已经确定为S批次,第一批次有k份作业,后S-1批次的方案就是后n-k份作业的最优调度。
3.状态转移方程
C(begin,i) 是在开始时间为begin时,完成i~n号作业的最小费用,k是它的最优调度中第一批次的编号最大的作业:
第一批次作业处理完的时间为:Ti=(begin+S+∑ti)
C(begin,i)=min{ Ti*(∑fi) +C( Ti ,k+1)} i=<k<=n
(开始时间+开机时间+第一批次作业总共时间)*∑第一批次作业的费用系数 +k+1~n份作业的最小开销
4.代码:
int MinCost(int S,int n,int t[],int f[]){
int i,j,k,maxt=0,cost,ff,tt;
for(i=0;i<n;i++){
maxt+=t[i];
}
maxt+=n*S;
int C[n+1][maxt+1];
for(i=n;i>0;i--){
for(j=maxt;j>=0;j--){
C[i][j]=MaxInt;
}
}
for(i=n;i>0;i--){//i~n个物品
for(j=maxt;j>=0;j--){//j时刻开始
ff=0;tt=S+j;
for(k=i;k<=n;k++){//[i,k]
ff+=f[k-1];tt+=t[k-1];
cost=ff*tt;
if(k!=n) cost+=C[k+1][tt];//如果没有完成全部的作业,其后还有作业 k+1~n
if(cost<C[i][j])
C[i][j]=cost
}
}
}
return C[1][0];
}