在jsp問題中,關鍵路徑決定著車間作業的完工時間,通過引入基於關鍵路徑的鄰域規則,使鄰域解大大減少,從而大大減少優化過程的複雜度。
關鍵塊是關鍵路徑中工序在同一臺機器連續組成的工序集合。
已知:
int o = new int[n][m]; //o代表工序,值為各工序編號,i為工件編號,j為該工件工序編號
int u = new int[n][m]; //工件i的第j個工序是第幾台機器
int p = new int[n][m]; //工件i的第j個工序的處理時間
int starttime = new int[n][m]; //starttime儲存第i個工件的第j個工序的開始時間
int finishtime = new int[n][m]; //finished儲存第i個工件的第j個工序的完成時間
演算法:
step 1: 根據最大完工時間,求得最大完工時間所在的工序編號,並將該工序編號加入到關鍵路徑鍊錶中,該工序表示為o
step 2: 求prejob(o), premac(o)
step 3: 若prejob(o) != null && premac(o) != null,取50%概率選擇其一,將新的工序加入插入到關鍵路徑鍊錶,並將該工序表示為o
否則若prejob(o) != null,將prejob(o)插入到關鍵路徑鍊錶,並將該工序表示為o
否則若premac(o) != null,將premac(o)插入到關鍵路徑鍊錶,並將該工序表示為o
step 4: 判斷當前關鍵工序的開始時間是否等於0,如果不是,轉step2, 否則結束
說明:prejob(o):工序o在本工件上的前一工序,且該工序的結束時間等於o的開工時間
premac(o): 工序o所在機器在o前面緊挨的工序,即該工序的結束時間等於o的開工時間
實現**:
//接下來計算關鍵路徑
//求得最大時間所在的工序編號
int maxindex = 0;
for(int i = 0; i < n; ++i)
} //將這個工序加入關鍵路徑鍊錶中
arraylistkeypath = new arraylist();
keypath.add(0, maxindex);
int index_i = maxindex / n;
int index_j = maxindex % m;
//開始遞推尋找,直到首工序
while(starttime[index_i][index_j] != 0)
for(int i = 0; i < n; ++i)
} if(prejobindex != -1 && premacindex != -1)
else
} else if(prejobindex != -1)
else if(premacindex != -1)
}
//接下來對關鍵路徑的工序進行分塊
//思路**於文件倒排索引的reduce實現
kpb = new arraylist();
int premac = -1;
kpblock kpblock = new kpblock();
for(int i = 0; i < keypath.size(); ++i)
premac = curmac;
kpblock.block.add(curope);
}kpb.add(kpblock); //加上最後一塊
class kpblock
Dijkstra最短路徑演算法的java實現
迪傑斯特拉演算法是由荷蘭計算機科學家狄克斯特拉於1959 年提出的,因此又叫狄克斯特拉演算法。是從乙個頂點到其餘各頂點的最短路徑演算法,解決的是有向圖中最短路徑問題。迪傑斯特拉演算法主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。如下圖 令graph v,e 為乙個帶權無向圖。gr...
Java中this關鍵字原理及作用
一 this關鍵字的作用 當方法的區域性變數和類的變數名重名時,在不使用this的情況下會有什麼結果?person string name 定義當前person名字 引數name是目標名字 成員變數name是自己名字 public void sayhello string name demo01pe...
JSP中如何使用JQuery及相對路徑問題
首先引入jquery對應的js檔案,然後引入自己的js檔案,這裡要注意先後順序 在引入這兩個js檔案的時候,遇到相對路徑的問題 問題描述 在新建立的jsp頁面中,自動會生成如下 string path request.getcontextpath string basepath request.ge...