当前位置:   article > 正文

【多机调度问题——贪心算法应用(4)】_多个作业的单机调度例题分析

多个作业的单机调度例题分析
问题描述:
               设有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的处理时间为t[i]。
               任何作业可以在任何一台机器上面加工处理,但未完工之前不允许中断处理。任何作业不能   拆分成更小的  作业。
               要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。

算法分析:
               采用最长处理时间作业优先的贪心选择策略,可以设计出解多机调度问题较好的近似算法。
               分n<=m(作业数小于机器数),n>m(作业数大于机器数)求解。
               假定有7个独立作业,所需处理时间分别为{2,14,4,16,6,5,3},由三台机器M1,M2,M3加工。按照贪心算法产生的作业调度如下图所示,所需总加工时间为17.
                             
  1. #include<iostream>
  2. using namespace std;
  3. #define N 7
  4. #define M 3
  5. int s[M]={0,0,0};
  6. //求出目前处理作业的时间和 最小的机器号
  7. int min(int m){
  8. int min=0;
  9. int i;
  10. for(i=1;i<m;i++){
  11. if(s[min]>s[i]){
  12. min=i;
  13. }
  14. }
  15. return min;
  16. }
  17. //求最终结果(最长处理时间)
  18. int max(int s[],int num){
  19. int max=s[0];
  20. for(int i=1;i<num;i++){
  21. if(max<s[i])
  22. max=s[i];
  23. }
  24. return max;
  25. }
  26. //机器数大于待分配作业数
  27. int setwork1(int t[],int n){
  28. int i=0;
  29. for(;i<n;i++){
  30. s[i]=t[i];
  31. }
  32. int ma=max(s,N);
  33. return ma;
  34. }
  35. //机器数小于待分配作业数
  36. int setwork2(int t[],int n){
  37. int i;
  38. int mi=0;
  39. for(i=0;i<n;i++){
  40. mi=min(M);
  41. s[mi]=s[mi]+t[i];
  42. }
  43. int ma=max(s,M);
  44. return ma;
  45. }
  46. int main(){
  47. int time[N]={16,14,6,5,4,3,2};//处理时间按从大到小排序
  48. int maxtime=0;
  49. if(M>=N)
  50. maxtime=setwork1(time,N);
  51. else
  52. maxtime=setwork2(time,N);
  53. cout<<"最多耗费时间"<<maxtime<<endl;
  54. }
总结:采用最长处理时间作业优先的贪心选择策略,可以设计出解多机调度问题较好的近似算法。
               分n<=m(作业数小于机器数),n>m(作业数大于机器数)求解。
首先,要对各个作业数进行排序,按照递减的序列。

 
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号