算法之多机调度问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; } 运行结果图: