算法設計與分析筆記 by 國科大卜東波


Lecture 1 2021.9.10 授課內容

Algorithm 算法一詞起源於 學者 Musa al-Khwarizmi(阿爾·花剌子米)。花剌子米是代數學之父,是代數和算術的創立人。算法(Algorism、Algorithm)出自「Algoritmi」,這是花剌子米(al-Khwārizmī)的拉丁文譯名。

 

基本算法策略

求解問題一般可以分為三種情況

  1. 分治(Divide&Conquer):根據問題結構划分為子問題,根據問題性質,可能能進一步優化為動態規划(DP)、貪心算法
  2. 改進(Improvement):根據問題解的關系,從一個初始解不斷改進
  3. 枚舉(Enumeration):根據問題解的形式,使用搜索樹枚舉每一種解,可能用到剪枝

 

旅行商問題(TSP)

接觸過圖論的同學應該都熟悉TSP問題,即求解一條通過圖 \(G(V, E, w)\) 上每一個節點剛好一次的最短回路。

應用上面的問題求解策略,我們分別使用三種方式來解決該問題。

 

分治

原問題:對於 \(n\) 個城市,訪問每個城市剛好一次的回路。

顯然,原問題無法被直接划分為兩個更小的子問題,因為兩個部分的城市回路無法直接合並。這里可以定義子問題為一條最短的路徑:\(M(s, S, x)\) 表示從s出發訪問城市集合S里每一個城市一次最后抵達x的最短路徑的解。

因此原問題等價於求解

\[min_{e \in V, e \neq s} M(s, V-\{e\}, e) + d_{es} \]

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種
3-OPT

 

枚舉

我們對圖上的邊編號,對於每一種方案,可以記錄每一條邊的使用情況,因此解可以表示為類似 X = [0,1,1,... 0,1]的形式,其中 \(X[i]= 1\) 表示通過第 \(i\) 條邊, \(0\) 表示不通過。

  • 暴力搜索

  • 啟發式搜索

    lower_bound: 剩余每個節點最短兩條邊之和

    best_so_far: 當前已經找到的最短路徑

    如果當前路徑長度已經大於 lower_boundbest_so_far,則停止擴展當前部分解

SolutionTree
 
對圖上的節點編號,解可以表示為 X = [x1, x2, ... xn-1, xn=x1]。同樣可以應用以上的搜索策略。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM