您的位置:首页 > 其它

任务调度问题

2008-10-10 15:50 232 查看
/**
* 用两台处理机A和B处理n个作业。设第i个作业交给机器A处理时需要时间ai,若
* 由机器B来处理,则需要时间bi.感觉各作业的特点和机器的性能关系,很可能对
* 于某些i,有ai>=bi,而对于某些j,j!=i,有aj<bj.即不能将一个作业分开两
* 台机器来处理,也没有一台机器能同时处理两个作业。设计一个动态规划算法使得
* 这两台机器处理完这n个作业的时间最短。研究一个实例(a1,a2,a3,a4,a5,a6)
* ={2,5,7,10,5,2};{b1,b2,b3,b4,b5,b6}={3,8,4,11,3,4}
* 分析与解答:
* 首先计算出m=max{max{ai}1<=i<n,max{bi}1<=i<=n}
* 设布尔变量p(i,j,k)表示前k个作业可以在处理机A用时不超过i且处理机B用时不
* 超过j内完成。用动态规划计算p(i,j,k)=p(i-ak,j,k-1)||p(i,j-bk,k-1)
* 根据以上结果可以计算处理时间:0<=i<=nm.0<=j<=nm,p(i,j,k)=true 时
* max{max{i,j}}
*/
package dynamic;

/**
* @author Administrator
*
*/
public class Task {
/**
* 私有变量
*/
private int[] a;
private int[] b;
private int num;
private boolean[][][] p;
private int mn;
/**
* 构造函数
*/
public Task(int[] a,int[] b,int num) {
// TODO Auto-generated constructor stub
this.a=a;
this.b=b;
this.num=num;
mn=a[0];
for(int i=0;i<num;i++)
{
if(a[i]>mn)
{
mn=a[i];
}
if(b[i]>mn)
{
mn=b[i];
}
}
mn*=num;
p=new boolean[mn+1][mn+1][num+1];
}
/**
* 动态规划解决问题
*/
public void dyns()
{
int i,j,k;
for(i=0;i<=mn;i++)
{
for(j=0;j<=mn;j++)
{
p[i][j][0]=true;
for(k=1;k<=num;k++)
{
p[i][j][k]=false;
}
}
}
for(k=1;k<=num;k++)
{
for(i=0;i<=mn;i++)
{
for(j=0;j<=mn;j++)
{
if(i-a[k-1]>=0)
{
p[i][j][k]=p[i-a[k-1]][j][k-1];
}
if(j-b[k-1]>=0)
{
p[i][j][k]=(p[i][j][k]||p[i][j-b[k-1]][k-1]);
}
}
}
}
int opt=mn;
for(i=0;i<=mn;i++)
{
for(j=0;j<=mn;j++)
{
if(p[i][j][num])
{
int temp=(i>j)?i:j;
if(temp<opt)
{
opt=temp;
}
}
}
}
System.out.println(opt);
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a={2,5,7,10,5,2};
int[] b={3,8,4,11,3,4};
Task ts=new Task(a,b,6);
ts.dyns();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: