王晓东的《计算机算法设计与分析》上这一节我看的云里雾里,数学公式让我眼花缭乱。但是读懂数学公式的推导过程并不是最重要的事情。重要的是解题的思路!
我读懂了“流水作业”的题目要求,以及最优子结构性质
动态规划——流水作业调度问题
这里有流水作业的具体实例,很好地展示了自底向上的动规过程,C++代码
0018算法笔记——【动态规划】流水作业调度问题与Johnson法则
Java 代码,注释写的很详细
动态规划之流水作业调度Johnson法则
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 }
原文:https://www.cnblogs.com/twomeng/p/9509384.html