Lecture 1 2021.9.10 授課內容
Algorithm 算法一詞起源於 學者 Musa al-Khwarizmi(阿爾·花剌子米)。花剌子米是代數學之父,是代數和算術的創立人。算法(Algorism、Algorithm)出自「Algoritmi」,這是花剌子米(al-Khwārizmī)的拉丁文譯名。
基本算法策略
求解問題一般可以分為三種情況
- 分治(Divide&Conquer):根據問題結構划分為子問題,根據問題性質,可能能進一步優化為動態規划(DP)、貪心算法
- 改進(Improvement):根據問題解的關系,從一個初始解不斷改進
- 枚舉(Enumeration):根據問題解的形式,使用搜索樹枚舉每一種解,可能用到剪枝
旅行商問題(TSP)
接觸過圖論的同學應該都熟悉TSP問題,即求解一條通過圖 \(G(V, E, w)\) 上每一個節點剛好一次的最短回路。
應用上面的問題求解策略,我們分別使用三種方式來解決該問題。
分治
原問題:對於 \(n\) 個城市,訪問每個城市剛好一次的回路。
顯然,原問題無法被直接划分為兩個更小的子問題,因為兩個部分的城市回路無法直接合並。這里可以定義子問題為一條最短的路徑:\(M(s, S, x)\) 表示從s出發訪問城市集合S里每一個城市一次最后抵達x的最短路徑的解。
因此原問題等價於求解
M(s, S, x)也很容易划分為更小的子問題
# Held-Karp algorithm [1962]
function TSP(D)
return mine∈V,e̸=s M(s, V − {e}, e) + des;
function M(s, S, x)
if S = {v} then
M(s, S, x) = dsv + dvx;
return M(s, S, x);
end if
return mini∈S, i̸=xM(s, S − {i}, i) + dxi;
提升
提升策略關注問題解之間的關系。可以設計以下通用的提升算法流程:
# Improvement strategy
function GenericImprovement(V, D)
# Let s be an initial tour;
while TRUE do
Select a new tour s′ from the neighbourhood of s;
if s′ is shorter than s then
s = s′;
end if
if stopping(s) then
return s;
end if
end while
如果我們已經找到任意一條便利每一個城市的回路,如何改進使回路總距離縮短呢?現在問題轉化為上述neighbourhood的定義。
2-OPT:對於一條回路,可以選擇兩條邊上(只改變一條邊是不可能的)的四個端點,交換其中兩個端點連邊,從而形成一條新的回路。
2-OPT可以擴展為3-OPT,這樣新的轉化方案總共有7種
枚舉
我們對圖上的邊編號,對於每一種方案,可以記錄每一條邊的使用情況,因此解可以表示為類似 X = [0,1,1,... 0,1]的形式,其中 \(X[i]= 1\) 表示通過第 \(i\) 條邊, \(0\) 表示不通過。
-
暴力搜索
-
啟發式搜索
lower_bound
: 剩余每個節點最短兩條邊之和best_so_far
: 當前已經找到的最短路徑如果當前路徑長度已經大於
lower_bound
或best_so_far
,則停止擴展當前部分解
對圖上的節點編號,解可以表示為 X = [x1, x2, ... xn-1, xn=x1]。同樣可以應用以上的搜索策略。