最优批处理问题

最优批处理问题

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];
}

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

hnu哈哈

请接受直女的么么哒????

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

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

打赏作者

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

抵扣说明:

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

余额充值