算法之多机调度问题
d[i]=t[i];
}
for(i=m+1;i<=n;i++)
{
for(int k=1;k<m;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) //阅读并理解这个函数
Dsc_Order_By_t(t,p,n); //对作业根据运行时间t进行降序排列
Processing(p,t,n,s,d,m); //用最长运行时间优先算法处理作业
Output(p,n,s,d,m); //输出结果
_getch();
return 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--机器台数
算法之多机调度问题
用贪心法解决多机调度问题
(1)问题的描述
设有n个独立的作业{1, 2,…, n},由m台相同的机器{M1, M2,…, Mm}进行加工处理,作业i所需的处理时间为ti(1≤i≤n),每个作业均可在任何一台机器上加工处理,但不可间断、拆分。多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
cout<<"总耗时:"<<d[i]<<endl;
if(max<d[i]) { max=d[i]; k=i;}
}
cout<<"\n"<<n<<"个作业在"<<m<<"台机器上执行完毕最少需要时间"<<d[k]<<endl;}
int main()
{
int p[]={0,1, 2,3, 4,5,6,7}, //作业编号,p[0]不用
(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 <iostream>
#include <conio.h>
using namespace std;
//冒泡法对作业时间t降序排列,作业编号p的顺序也随t的顺序改变而改变,这点很重要!
void Dsc_Order_By_t(int t[],int p[],int n) //注意:数组元素下标从1开始{ //你的代码
{
int max=0,k=1;
cout<<endl<<"作业在各台机器上的安排如下:"<<endl;
for(int i=1;i<=m;i++)
{
cout<<"机器"<<i<<":";
for(int j=1;j<=n;j++) if((s[i]>>(p[j]-1))&1) cout<<"作业"<<p[j]<<" "; //理解位值运算!
{
cout<<t[i]<<"\t";
}
cout<<endl;
for (i=1;iቤተ መጻሕፍቲ ባይዱ=n;i++)
{
cout<<p[i]<<"\t";
}
cout<<endl;
}
void Processing(int p[],int t[],int n,int s[],int d[],int m)
{ //你的代码,根据书中伪代码编写,P154,算法7.9
int i,j;
for (i=1;i<=n;i++)
{
for (j=1;j<=n-i;j++)
{
if (t[j]<t[j+1])
{
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++)
//其中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));