算法之多机调度问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法之多机调度问题

用贪心法解决多机调度问题

(1)问题的描述

设有n个独立的作业{1, 2, …, n},由m台相同的机器{M1, M2, …, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

(2)算法设计思想

解多机调度问题的贪心策略是最长处理时间作业优先,即把处理时间最长的作业分配给最先空闲的机器,这样可以保证处理时间长的作业优先处理,从而在整体上获得尽可能短的处理时间。

(3)数据及解题过程

设7个独立作业{1, 2, 3, 4, 5, 6, 7}由3台机器{M1, M2, M3}加工处理,各作业所需的处理时间分别为{2, 14, 4, 16, 6, 5, 3}。贪心法产生的作业调度如下:

(4)程序使用C++运行测试

(5)代码如下:

#include

#include

using namespace std;

//冒泡法对作业时间 t 降序排列,作业编号 p 的顺序也随 t 的顺序改变而改变,这点很重要!

void Dsc_Order_By_t(int t[],int p[],int n) //注意:数组元素下标从1开始

{ // 你的代码

int i,j;

for (i=1;i<=n;i++)

{

for (j=1;j<=n-i;j++)

{

if (t[j]

{

int b=t[j+1];

t[j+1]=t[j];

t[j]=b;

int g=p[j+1];

p[j+1]=p[j];

p[j]=g;

}

}

}

for (i=1;i<=n;i++)

{

cout<

}

cout<

for (i=1;i<=n;i++)

{

cout<

}

cout<

}

void Processing(int p[],int t[],int n,int s[],int d[],int m)

{ // 你的代码,根据书中伪代码编写,P154,算法7.9

// 其中s[i]={p[i]} 用位集合表示,代码是: s[i]|=(1<<(p[i]-1))

// s[j]=s[j]+{p[i]} 实际代码是:s[j]|=(1<<(p[i]-1)) 不懂问我,把它搞清楚!

int i;

int j;

for(i=1;i<=m;i++)

{

s[i]|=(1<<(p[i]-1));

d[i]=t[i];

}

for(i=m+1;i<=n;i++)

{

for(int k=1;k

{

int o=d[k];

if (o>d[k+1])

{

o=d[k+1];

j=k+1;

}

}

s[j]|=(1<<(p[i]-1));

d[j]=d[j]+t[i];

}

}

void Output(int *p,int n,int *s,int *d,int m) //阅读并理解这个函数

{

int max=0,k=1;

cout<

for(int i=1;i<=m;i++)

{

cout<<"机器"<

for(int j=1;j<=n;j++) if((s[i]>>(p[j]-1))&1) cout<<"作业"<

cout<<" 总耗时:"<

if(max

}

cout<<"\n"<

int main()

{

int p[]={0,1, 2,3, 4,5,6,7}, //作业编号,p[0]不用

t[]={0,2,14,4,16,6,5,3}, //对应作业时间,t[0]不用

s[]={0,0,0,0}, //机器处理的作业集合,如:s[1]存放机器处理过的作业号,s[0]不用

d[]={0,0,0,0}; //机器处理作业的总时间,如:d[2]存放机器处理过的作业的总时间,d[0]不用

int n=sizeof(p)/sizeof(int)-1,m=sizeof(s)/sizeof(int)-1; //n--作业总数,m--机器台数

Dsc_Order_By_t(t,p,n); //对作业根据运行时间t进行降序排列Processing(p,t,n,s,d,m); //用最长运行时间优先算法处理作业

Output(p,n,s,d,m); //输出结果

_getch();

return 0;

}

运行结果图:

相关文档
最新文档