当前位置:   article > 正文

贪心算法——多机调度问题_6-1 求解多机调度问题(贪心法)

6-1 求解多机调度问题(贪心法)

问题描述:

下面用一道2013上半年软件设计师的软考题来说明这个问题。

      设有 M 台完全相同的机器运行 N 个独立的任务(任务不可分割),运行任务 i 所需要的时间为t_{i}要求确定一个调度方案,使得完成所有任务所需要的时间最短,任务运行时独占机器。

      这里要求定义的变量如下,所有数组的下标皆从0开始:

      设m是机器数,n 是任务数,t[ ] 的长度为 n,其中每个元素表示各个任务的运行时间

      s[ ][ ]长度为 mn,下标从0开始,其中 s[ i ][ j ] 表示机器 i 运行的任务 j 。

      d[ ]长度为 m,其中 d[ i ]表示机器i运行的时间。

      count[ ]长度为 m,其中元素 count[ i ] 表示机器i运行 的任务数。

      max 为完成所有任务的时间。min,i,j,k 为临时定义变量,无意义。

输入样例:

机器数:5

任务数:7

每个任务的运行时间(从大到小):16   14   6   5   4   3   2

输出样例:

完成所有任务需要的时间为:16
各个机器执行的耗时一览:
机器0: 16
机器1: 14
机器2:  6
机器3:  5   2
机器4:  4   3

运行截图 :

程序代码: 

  1. #include <iostream>
  2. using namespace std;
  3. void schedule(int m, int n, int t[]) {
  4. int i, j, k, max = 0;//i表示机器编号,j表示任务,max表示机器最大运行时间
  5. int d[100], s[100][100], count[100];
  6. for (i = 0; i < m; i++) {//循环设置s数组和d数组
  7. d[i] = 0;
  8. for (j = 0; j < n; j++) {
  9. s[i][j] = -1;//-1代表不执行任何任务,不与0号任务混淆
  10. }
  11. }
  12. /*机器数大于任务数*/
  13. if (m > n) {
  14. cout << "完成所有任务需要的时间:" << t[0] << endl;
  15. for (i = 0; i < m; i++) { // 循环输出机器执行的耗时
  16. s[i][0] = i;// 判断是否有任务运行
  17. d[i] += t[i];//运行时间
  18. }
  19. cout << "各个机器执行的耗时一览:" << endl;
  20. for (i = 0; i < m; i++) {
  21. if (i + 1 > n) {
  22. cout << "机器" << i << ":没有任务运行!" << endl;
  23. }
  24. else {
  25. cout << "机器" << i << ":" << t[i] << endl;
  26. }
  27. }
  28. }
  29. /*任务数大于机器数*/
  30. else {//分配前m个任务,必然是每个机器先分别接受1个任务
  31. for (i = 0; i < m; i++) {
  32. s[i][0] = i;
  33. d[i] += t[i];//累计运行时间
  34. count[i] = 1;//计数
  35. }
  36. /*判断哪个机器任务耗时最少,让其接受任务,尽可能地并行、平均分配任务,使得每台机器最后的运行时间接近*/
  37. for (i = m; i < n; i++) {
  38. int min = d[0];
  39. k = 0;
  40. for (j = 1; j < m; j++) {//确定空闲机器,实质是在求当期任务总时间最少的机器
  41. if (min > d[j]) {
  42. min = d[j];
  43. k = j;//机器k空闲
  44. }
  45. }
  46. s[k][count[k]] = i;//在机器k的执行队列添加第i号任务
  47. count[k] += 1;//机器k的任务数+1
  48. d[k] += t[i];//机器k的任务执行时间+t[i],也就是+第i号任务的耗时
  49. }
  50. for (i = 0; i < m; i++) {//确定完成所有任务需要的时间,实质是求分配完所有任务之后耗时最多的机器的运行时间
  51. if (max < d[i]) {
  52. max = d[i];
  53. }
  54. }
  55. cout << "完成所有任务需要的时间:" << max << endl;
  56. cout << "各个机器执行的耗时一览:" << endl;
  57. for (i = 0; i < m; i++) {
  58. cout << "机器" << i << ":";
  59. for (j = 0; j < n; j++) {
  60. if (s[i][j] == -1) {
  61. break;
  62. }
  63. cout << t[s[i][j]] << "\t";
  64. }
  65. cout << endl;
  66. }
  67. }
  68. }
  69. int main() {
  70. int num_t, num_mach;//任务数,机器数
  71. cout << "请输入机器数num_mach:";
  72. cin >> num_mach;
  73. cout << "请输入任务数num_t:";
  74. cin >> num_t;
  75. int* time = new int[num_t];//使用动态内存分配声明时间数组来表示各个任务的执行所需时间
  76. cout << "请输入任务所需执行时间(从大到小):";
  77. for (int i = 0; i < num_t; i++) {
  78. cin >> time[i];
  79. }
  80. schedule(num_mach, num_t, time);
  81. delete[] time; // 释放动态分配的内存
  82. return 0;
  83. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/707150
推荐阅读
相关标签
  

闽ICP备14008679号