1. 程式人生 > >流水作業排程(動態規劃)

流水作業排程(動態規劃)

瞭解性質,重在理解演算法和設計邏輯

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=0int 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; } } }