流水作業排程(動態規劃)
阿新 • • 發佈:2018-12-02
瞭解性質,重在理解演算法和設計邏輯
package flowShop;
import java.util.Arrays;
//主要是Johnson法則的理解,程式碼很簡單
public class FlowShop {
public static int flowShop(int a[],int b[],int c[])
{
int n=a.length-1;
Element d[]=new Element[n];
for(int i=0;i<n;i++){
int key=a[i]>b[i]? b[i]:a[i];//找作業在兩臺機器上處理時間最小的那個作業處理時間
boolean job = a[i]<=b[i];
d[i]=new Element(key,i,job);
}
Arrays.sort(d);//將所有作業的key進行從小到大排序
int j=0,int k = n-1;
//將作業按照Johnson法則排序放入c中
for(int i=0;i<n;i++){
if(d[i].job) c[j++]=d[i].index;//如果ai<=bi,將其作業序號放入c陣列中(從頭開始放)
else c[k--]=d[i].index;//否則
}
//真正的動態規劃部分!
j=a[c[0]];//第一個作業在M1上的處理時間
k=j+b[c[0]];//第一個作業處理完所需時間
for(int i=1;i<n;i++){
j+=a[c[i]];//第i個作業在機器上加工完成所需時間
k=j<k? k+b[c[i]]:j+b[c[i]];/*如果此作業在M1上加工完成時間
(包含前面作業在M1上的所用時間和)小於上一個作業全部完成時間(還得等M2做完),則此作業所需時間
為k+b[c[i]],否則為j+b[c[i]]*/
}
return k;
}
public static class Element{
public int key;
public int index;
public boolean job;
private Element(int kk,int ii,boolean jj)
{
key=kk;
index=ii;
job=jj;
}
}
}