任务调度问题
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();
}
}
* 用两台处理机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();
}
}
相关文章推荐
- 【编程素质】算法-独立任务最优调度问题(双机调度问题)
- 华为软件编程题:操作系统任务调度问题
- 操作系统任务调度问题
- 华为2014校园招聘软件编程题:操作系统任务调度问题
- 在spring中使用quartz进行任务调度遇到的问题
- uCOS-II中的任务切换-图解多种任务调度时机与问题
- 操作系统任务调度问题(华为一上机题,自己写的答案)
- 王晓东 独立任务最优调度问题
- [华为机试真题]72.操作系统任务调度问题
- 关于任务调度的几个问题
- 【华为上机】操作系统任务调度问题
- 南邮 OJ 1220 独立任务最优调度问题
- 华为机试——03操作系统任务调度问题
- 华为机试题--任务调度问题
- 独立任务最优调度问题
- 操作系统对系统任务和用户任务调度问题
- 如何解决数据一致性、任务调度、流水号生成等问题?
- 操作系统任务调度问题
- 华为:操作系统任务调度问题
- 算法导论 第十六章:贪心算法之单任务调度问题