第三章 本論文演算法
3.5 禁忌演算法
禁忌演算法(Taboo Search ; TS)屬於近似求解法裡面的迭代搜尋機制,最早由 Glover (1986)提出,主要為使用可行解(feasible solution)的鄰近解來作為尋優的方 向,慢慢的朝向良好的解區域移動,且禁忌演算法並不像模擬退火法是來自於「物 理現象」的改變,也不像是螞蟻演算法來自「自然界生物體」的搜尋現象,而是 使用「人工智慧」和記憶來進行尋優動作。舉個例子來說就好像是人類天天嚐試 不同的事物已達到更好的生活品質為目標,其中嚐試過的事物會被放入在大腦記 憶之中裡面也就是稱之為「禁忌名單」(taboo list;TS)的東西,此外為了提升更 好的品質,我們又會記住人生中特別重要的抉擇,也就是稱之為「長期記憶」的 東西,在此章我們會描述禁忌演算法的概念和使用方法,但基本上本論文和 ACOFT-MWR 中使用的禁忌演算法都是來自於 Nowicki & Smutnicki (1996)所提 出的FT(fast taboo)又稱為 TSAB。
3.5.1 禁忌演算法架構
基本運作邏輯如下:首先要定義「移步」(move),通常我們稱之為由一個解 轉換到另一個解的過程,也就是說我們可以使用移步的方式對目前的解產生一群
「鄰近解」,並由鄰近解中挑選最佳的解來改變目前的解,於是乎在每一個迭代 裡面都會往更好的解和解空間移動;此外為了避免「循環」(cycle),設立了一個 叫做「禁忌名單」(taboo list)這個機制來紀錄最近曾經使用過的移步,以避免重 複走過的路徑(也就是使用過的移步),禁忌名單也稱為短期記憶(short-term memory);為了要強化特別良好解空間的搜尋,建立了一個機制稱之為長期記憶 (long-term memory),主要在紀錄程經表現過特別良好的解,期待原先搜尋路徑 部分結束後,可用於重新把曾紀錄良好的解重新作為搜尋的初始解,直到所有在 長期記憶的解空間都已經搜尋完畢即停止演算法。
3.5.2 禁忌演算法演算流程
禁忌演算法有幾個重要的元件:移步、鄰近解、禁忌名單、渴望準則、長期 記憶,下面我們會針對這些元件詳細的說明:
移步指的是由目前解(current solution)改變到另一個解的過程,其中移步的方 式會根據問題的特性來設計,通常在排程上會使用兩兩交換法 (swap)、插入法 (insert)與消去法(add/drap),不過在本演算法只有使用到 swap,也就是兩兩交換 的動作。
本論文裡面的移步使用 Nowicki & Smutnicki (1996)的定義方式:將要徑 (critical path)分為數個區塊(block),且每個區塊表示連續工件在相同的機器上作 業,換句話說就是每一區塊中包含1 到多個作業不等,且這些作業都是要徑上的 連續作業並加工於同一機台;移步的方式為交換最前面區塊的最後面兩個作業,
最後面區塊的最前面兩個作業,其他區塊則交換最前面的兩個作業和最後面的兩 個作業,也就是說如果要徑可以分為
n 個 block,則可採用的移步數目最多為
(2
n− 2
),這個數目也就是鄰近解的最大值。本研究演算法定義鄰近解為:目前解經過移步改變之後的解集合。我們使用 要徑法計算出所有鄰近解的完工時間,用以判斷目前的解要往哪一個鄰近解移動 會提升更好的解品質,通常我們會挑選品質最好的解做為移動的方向,但是必須 特別注意的是,如果所有鄰近解品質都比目前的解還要「差」時,仍必須挑選鄰 近解裡面最好品質的解做為移動的方向,也就是即使知道此改變只會讓目前的解 品質變差,我們仍要改變以求的更大的突破,就像人生有時必需忍受一時的低 潮,用來創造出另一個高峰。
禁忌名單又稱為短期記憶(short-term memory),禁忌名單是一個佇列(queue) 的資料結構(先進先出;first in first out;FIFO),禁忌裡面儲存的元素就是最近移 步的紀錄,用來避免不小心採用過去曾用過的移步而回到改變前的狀態。
簡單說如果現在有一組解確定採用移步M1(2,3),則把此移步反轉為 M1(3,2) 放到禁忌名單的最後面,並根據採取的移步修正解的狀態;禁忌名單,用以避免 再次使用移步M1(3,2)而回到之前的解狀態。必須要注意的是禁忌名單通常都會 有一長度限制,若加入新的移步造成禁忌名單過長,則必須去除禁忌名單中存在 時間最久的一筆資料。
禁忌名單的長度也是一門很大的學問,一般而言長度越長越大代表移步受到 的限制越多,可以避免重複搜尋相同解空間的狀況,但也因此限制住解空間的移 動導致容易陷入區域最佳解,此外也要付出龐大的記憶體空間來儲存禁忌名單,
此外還會增加計算時間;禁忌名單長度太短的話則是代表受到的限制不多,解空 間很容易往不同的方向去移動,容易跳脫區域最佳解,計算時間縮短,但卻會造 成解收斂速度過慢,並很容易陷入循環(cycle)之中,所以通常排程上使用 Glover (1986)所提出的魔術數字 7 為禁忌名單的長度,這也是本論文演算法所使用的長 度。
此機制主要用來打破移步在禁忌名單中所受到的限制狀況;通常在一般的情 況下,被紀錄在禁忌名單的移步是不會被採用的,但如果這組解滿足一個特別的 條件的話,就會不管禁忌名單的限制而採用此移步,稱此條件為渴望準則;在本 論文演算法之中,這個特別的條件為:採用此移步後的完工時間,小於目前最佳 解的完工時間。此時更新禁忌名單的方法是,把此移步由禁忌名單中抽取出來並 同時放入禁忌名單的最後面。
long-term memory (長期記憶),長期記憶屬於 TS 裡面的強化機制,主要目 的為再次搜尋之前有找到,但是未搜尋的良好解空間,經此強化中堂可以找到更 好的解,使用方法為先建立一個長期記憶名單(可自由設定一門檻值,本論文使 用的是當解品質超越此迭代裡面所找到的最佳解),並搜尋所有長期記憶名單的 裡的鄰近解。仔細的搜尋過長期記憶名單裡面的所有解,這種方式可以大大的提 升找到解的品質,雖然也會大大的增加演算時間,所以本論文設定的長期記憶名 單長度為3,且當長度超過 3 的時候,會移除長期記憶名單裡面存在最久的一筆 資料。所以我們的長期記憶名單會包含三種元素,第一種是扣除目前選取的移步 以外的鄰近解集合,第二種為目前的禁忌名單,第三種為目前的工件排序狀態。
本論文所使用的TS 步驟程序如下:
1. 取得一組初始解,並把此解放入長期記憶名單
LM 之中,此時 LM = 1。
2. 抽出
LM 裡面最新的一筆資料,做為往後的起始解更新解,且迭代次數 N = 0,若 LM = 0 則停止程序。
3. 根據移步,找出此目前解的鄰近解。
4. 依據所挑選的移步解,修改禁忌名單和目前此迭代最佳解(current solution)。
5. 如果所挑選出來的移步解完工時間小於此迭代最佳解,把此狀態放入
LM,並更新迭代裡的最佳解,LM = LM +1。
6. 進行迴圈測試(cycle test),如果陷入迴圈則回到步驟 2。
7. 如果已經達到迭代次數 N>3000 次,則回到步驟 2,否之
N = N + 1,並
回到步驟3。本論文所使用的迴圈測試(cycle test)為紀錄過去連續 30 個迭代解的完工時 間,並計算是否有超過6 個迭代出現相同的完工時間,如果發生此種狀況,會視 為目前的搜尋方向已經陷入迴圈,並需要停止目前的搜尋方向。