• 沒有找到結果。

演算法設計(隨機重啟爬山法)

3.3.1 隨機生成盤面

由於隨機生成盤面並不需要先條列所有依提示所能產生的組合,必要的資訊 只有列提示及題目的維度即可,計算每個列提示能夠自由放置的留空格子個數,

便能以 rand()函式隨機生成盤面,為列提示中的每個線段指定索引位置,包含 起始位置及終止位置,這兩個索引位置就表示這條線段所佔的行範圍,圖 3-3 中 標示為灰色線段所佔的行範圍為第 1 行至第 3 行,所以它的起始索引位置記錄為 1,終止位置記錄為 3。

圖 3- 3 圖中標示為灰色線段所佔的行範圍為第 1 行至第 3 行

同時記錄兩種索引位置,在計算可以橫向移動範圍時能立即判斷是否超出邊 界。

3.3.2 局部搜索最佳解

當初始盤面生成好了之後,下一個階段就是要隨機挑選這些在上一小節已經 指定好索引位置的線段,判斷這個線段可以橫向移動的範圍,計算每一個位置是 否能夠讓目前盤面上的行提示更接近於題目所定義的,圖 3-4 表示灰色線段的移 動位置和移動後所造成的行提示變化(標記為網底)。可以看出在位移過程中,

線段在位移前後有重疊的部分它的行提示不變,只有在非重疊區域才有改變。

圖 3- 4 灰色線段的移動位置和移動後所造成的行提示變化(標記為網底)

(左圖為目前盤面狀態,中圖及右圖分別為由左圖移動線段後的狀態)

因此在計算線段於不同位置上行提示的變化,和題目所定義的行提示之間的 差值,只需要處理沒有重疊的部分。

除了線段的選擇使用隨機方式外,線段移動的位置取決於在所有能夠減少差 值的位置中,隨機選定其中一種。

3.3.3 計算提示差值與全域最佳解

計算線段於不同位置上行提示的變化,和題目所定義的行提示之間的差值的 方法如下:

Case 1:當兩方的行提示的數目相等時,將每個相對應位置的數值相減取平 方再加總。

例:{1, 2, 2} 與 {1, 1, 1}

(1 − 1)2+ (2 − 1)2+ (2 − 1)2 = 2

Case 2:當兩方的行提示的數目不相等時,將每個相對應位置的數值相減取 平方再加總,若沒有對應的數值時,則直接取平方(將對應的數值

以 0 計算)。

例:{1, 2, 2} 與 {1}

(1 − 1)2+ (2 − 0)2+ (2 − 0)2 = 8

上述方法對於 Case 2 來說,對於找到全域最佳解是沒問題的,但是會造成 容易陷入局部最佳解的問題,因為對應位置之間的關係所造成的差別。

至於全域最佳解的判斷,則是當盤面上行提示和題目所定義的行提示相同時,

表示兩者的差值為 0,因此要由初始盤面開始,先計算目前盤面上行提示與題目 所定義的行提示之間的差值,設定此為要減少的目標差值,再隨機移動各條線段,

讓目標差值逐步減少至 0。

3.3.4 重啟機制

避免陷入局部最佳解,需要設定重啟盤面的觸發條件,有三種判斷方式,第 一種方式會比較貼近於實際情形下對區域最佳解的判斷,圖 3-5 表示了當陷入區 域最佳解會導致目標值反復的在區域最佳解附近震盪,使得進展停滯。

圖 3- 5 陷入區域最佳解時目標值會在區域最佳解附近震盪

第二種方法是當隨機選擇線段時,沒有線段能夠讓差值降下來,所以沒有任 何線段可以選擇。

第三種方式是根據盤面的維度,以及列提示的數目大小來決定能夠位移線段 的次數總和。當盤面越大,或列提示的數目越小時,線段的移動範圍變大,因此 需要讓線段位移的次數變多才有機會得到解答。

3.3.5 改進方案

本次實作使用的是隨機重啟爬山演算法,相較於爬山演算法改良版的

Simulated Annealing(模擬退火法)來說,因為爬山演算法一旦在鄰近區域找不 到比現有更好的解時,很容易困在區域最佳解;而模擬退火法的作法類似爬山演 算法,但它有時會接受比目前還差的解,所以能跳脫區域最佳解。當附近有較佳 的解時,就會無條件地改變目前的狀態,但是當鄰近沒有比目前更好的解時,會 先考慮鄰近解比現在差多少程度,同時考慮目前的系統溫度是多少,高溫時有比 較大的機會能接受較差的解,經由降溫的過程控制收斂的幅度。

相關文件