流水作业

王晓东的《计算机算法设计与分析》上这一节我看的云里雾里,数学公式让我眼花缭乱。但是读懂数学公式的推导过程并不是最重要的事情。重要的是解题的思路!

  1 #include <iostream>
  2 #include <stdlib.h>
  3 using namespace std;
  4 // 动态规划 流水作业调度问题
  5 
  6 class Jobtype
  7 {
  8     public:
  9         int operator <=(Jobtype a) const
 10         {
 11             return(key<=a.key);
 12         }
 13         int key,index;
 14         bool job;
 15 };
 16 
 17 /*
 18 定义作业Jobtype类:
 19 key : 关键字
 20 index :索引值
 21 bool job : a[i]<=b[i]的归入N1类,job值为1 ; 否则为0
 22 重新定义运算符 <=
 23 */
 24 
 25 int FlowShop(int n,int a[],int b[],int c[]);
 26 void BubbleSort(Jobtype *d,int n);
 27 
 28 int FlowShop(int n,int a[],int b[],int c[])
 29 {
 30     Jobtype *d = new Jobtype[n];
 31     for(int i=0; i<n; i++)
 32     {
 33         d[i].key = a[i]>b[i]?b[i]:a[i];//按Johnson法则分别取对应的b[i]或a[i]值作为关键字
 34         d[i].job = a[i]<=b[i];//给符合条件a[i]<b[i]的放入到N1子集标记为true
 35         d[i].index = i;
 36     }
 37 
 38     BubbleSort(d,n);//对数组d按关键字升序进行排序
 39 
 40     int j = 0,k = n-1;
 41 
 42     for(int i=0; i<n; i++)
 43     {
 44         if(d[i].job)
 45         {
 46             c[j++] = d[i].index;//将排过序的数组d,取其中作业序号属于N1的从前面进入
 47         }
 48         else
 49         {
 50             c[k--] = d[i].index;//属于N2的从后面进入,从而实现N1的非减序排序,N2的非增序排序
 51         }
 52     }
 53 
 54     j = a[c[0]];
 55     k = j+b[c[0]];
 56     for(int i=1; i<n; i++)
 57     {
 58         j += a[c[i]];//M1在执行c[i]作业的同时,M2在执行c[i-1]号作业,最短执行时间取决于M1与M2谁后执行完
 59         k = j<k?k+b[c[i]]:j+b[c[i]];//计算最优加工时间
 60     }
 61 
 62     delete d;
 63     return k;
 64 }
 65 
 66 //冒泡排序
 67 void BubbleSort(Jobtype *d,int n)
 68 {
 69     int i,j,flag;
 70     Jobtype temp;
 71 
 72     for(i=0;i<n;i++){
 73         flag = 0;
 74         for(j=n-1;j>i;j--){
 75             //如果前一个数大于后一个数,则交换
 76             if(d[j]<=d[j-1]){
 77                 temp = d[j];
 78                 d[j] = d[j-1];
 79                 d[j-1] = temp;
 80                 flag = 1;
 81             }
 82         }
 83         //如果本次排序没有进行一次交换,则break,减少了执行之间。
 84         if(flag == 0){
 85             break;
 86         }
 87     }
 88 }
 89 int main()
 90 {
 91     int N; // 作业个数
 92     cout<<"请输入作业总个数n:"<<endl;
 93     cin>>N;
 94     int a[N],b[N],c[N];
 95     cout<<"请输入machine1的作业运行时间:"<<endl;
 96     for (int i=0 ; i<N ;i++)
 97     {
 98         cin >> a[i];
 99     }
100     cout<<"请输入machine2的作业运行时间:"<<endl;
101     for (int i=0 ; i<N ;i++)
102     {
103         cin >> b[i];
104     }
105     int minTime=FlowShop(N,a,b,c);
106     /*
107     a[N]:machine1的作业运行时间序列
108     b[N]:machine2的作业运行时间序列
109     c[N]:N个作业的调度顺序(编号从0开始)
110     */
111     cout<<"初始作业在机器1上的运行时间序列为:"<<endl;
112     for(int i=0; i<N; i++)
113     {
114         cout<<a[i]<<" ";
115     }
116     cout<<endl;
117 
118     cout<<"初始作业在机器2上的运行时间序列为:"<<endl;
119     for(int i=0; i<N; i++)
120     {
121         cout<<b[i]<<" ";
122     }
123     cout<<endl;
124 
125     cout<<"完成作业的最短时间为:"<<minTime<<endl;
126     cout<<"编号从0开始,作业调度的顺序为:"<<endl;
127     for(int i=0; i<N; i++)
128     {
129         cout<<c[i]<<" ";
130     }
131     cout<<endl;
132     return 0;
133 }

猜你喜欢

转载自www.cnblogs.com/twomeng/p/9509384.html