n个作业组成的作业集,可由m台相同机器加工处理。要求给出一种作业调度方案,
使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。作业不能拆分成
更小的子作业;每个作业均可在任何一台机器上加工处理。这个问题是NP完全问
题,还没有有效的解法(求最优解),但是可以用贪心选择策略设计出较好的近似
算法(求次优解)。当n<=m时,只要将作业时间区间分配给作业即可;当n>m时,首
先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说
从剩下的作业中,选择需要处理时间最长的,然后依次选择处理时间次长的,直到
所有的作业全部处理完毕,或者机器不能再处理其他作业为止。如果我们每次是将
需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处
理完了只剩所需时间最长的作业在处理的情况,这样势必效率较低。这里没有讨论
使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。作业不能拆分成
更小的子作业;每个作业均可在任何一台机器上加工处理。这个问题是NP完全问
题,还没有有效的解法(求最优解),但是可以用贪心选择策略设计出较好的近似
算法(求次优解)。当n<=m时,只要将作业时间区间分配给作业即可;当n>m时,首
先将n个作业从大到小排序,然后依此顺序将作业分配给空闲的处理机。也就是说
从剩下的作业中,选择需要处理时间最长的,然后依次选择处理时间次长的,直到
所有的作业全部处理完毕,或者机器不能再处理其他作业为止。如果我们每次是将
需要处理时间最短的作业分配给空闲的机器,那么可能就会出现其它所有作业都处
理完了只剩所需时间最长的作业在处理的情况,这样势必效率较低。这里没有讨论
n和m的大小关系,因为这两种情况可合并。
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(const int &x, const int &y)//引用之间进行比较
{
return x > y;//从大到小的排列
}
int main()
{
int N = 7, m = 3;//N个作业。m个机器
int speed[7] = { 2,4,3,6,9,5,7 };//每项任务需要的处理时间
int mintime[7] = { 0 };
sort(speed, speed + N, cmp);//按任务时间长短排序,由大到小
for (int i=0;i<N;i++)
{
//找最小的元素,把处理时间加到里面(分派任务) //把N 个任务分给这m台机器
*min_element(mintime, mintime + m) += speed[i];//选择机器里面的运行时间最小的,再往里填任务
}
//输出添加后的时间当中最大的那个,就是处理所有事件需要的总时间。
cout << "需要处理的时间是:"<<*max_element(mintime, mintime + m)<<" 小时" << endl;
system("pause");
return 0;
}