【技術文檔】《算法設計與分析導論》R.C.T.Lee等·第5章 樹搜索策略

計算機中許多問題的解空間可以用一棵樹來表示,最優解就在樹中的一個分支上,因此,我們在解這類問題時可以採用樹搜索策略,最經典的問題包括0/1揹包問題、旅行商問題、哈密頓迴路問題,還有8數碼問題(就是我們小時候常玩的方格拼圖遊戲)。


在建立這顆樹(解空間)時,我們用到的方法根據搜索的次序不同可以分爲廣度優先搜索、深度優先搜索和最佳優先搜索。打個比方來說明一下它們之間的不同。我準備找王二麻子辦點事,怎麼找到他呢?如果是廣度優先搜索,我會先找我所有的朋友,如果這些朋友當中沒有王二麻子這個人,再找我所有朋友的朋友,如果還沒有,再找我所有朋友的朋友的朋友……直至找到爲止;如果是深度優先搜索,也是先找我所有的朋友,如果這些朋友當中沒有王二麻子這個人,再找我的一個朋友的所有朋友,如果還沒有,再找我這個朋友的一個朋友的所有朋友……直至找到爲止;如果是最佳優先搜索,還是先找我所有的朋友,如果這些朋友當中沒有王二麻子這個人,從我的朋友當中選出人脈最廣的那個人,找他的所有朋友,如果還沒找到,從當前找到的人中選出人脈最廣的那個人(排除已選出的人),接着找他的所有朋友……直至找到爲止。

在最佳優先搜索中有“選出人脈最廣的人”這一步,抽象成一般就是建立一個評價函數,如果將評價函數運用到深度優先搜索中的“我的一個朋友”的選擇上,就得到了深度優先搜索的變形——爬山法算法不同也體現在數據結構上,廣度優先搜索、深度優先搜索、最佳優先搜索對應的數據結構分別爲:隊列、棧、堆,其中的妙趣讀者自己去體會吧。


我們在計算機中遇到的問題往往是很龐大的,建立一個完整的解空間(樹)是很困難的,也是沒有必要的,我們利用分支限界策略能大大減小樹的分支,使問題在計算機中更容易解決。

書中在分支限界策略這節有這麼一段:“我們使用樹搜索技術解決了許多問題,這些問題都不是優化問題,使讀者感興趣的是注意到上面的方法都沒有用於解決任何優化問題,在本節中,將介紹分支限界策略,這也許是解決一大類組合問題的最有效策略之一”。如果此處“優化問題”是指“求最優解”,那我覺得這段描述有不妥之處。樹搜索策略能將所有的解表示出來,那從中找出最優解應該不是難事,而書中這段卻說樹搜索策略”不能解決任何優化問題“。我對樹搜索策略和分支限界策略的理解是:分支限界策略是樹搜索策略的補充,前者使後者能更有效的找到最優解。言歸正傳,分支限界策略是在廣度(深度、最佳)優先搜索的基礎上加上一個界限,這個“界限以至於能終止許多分支”,大大提高算法的效率,所以分支限界策略的重點是在界限的設置上,比如用分支限界策略解決人員分配問題、旅行商問題時採用了簡化代價矩陣等。


接下來,讓我們學習一下A*算法。由於A*算法比較難理解(至少在我看來是這樣的),我將這部分的內容分成了三個部分:預備知識,A*算法規則,規則真確性的證明。

預備知識A*算法通常用於解決優化問題,下面我們就用它來解決平面中最短路徑問題,先給出兩個等式:

f*(n)=g(n)+h*(n),其中f*(n)表示節點n的代價,g(n)表示從開始節點到節點n的代價,h*(n)表示節點n到目標節點的最小代價;

f(n)=g(n)+h(n),其中f(n)表示節點n的估計代價,g(n)表示從開始節點到節點n的代價,h(n)表示節點n到目標節點的估計最小代價。

A*算法規則。理解了上面的兩個等式,A*算法的規則就很簡單了:

  1. 選擇代價函數f(n)最小的點作爲擴展點
  2. 若被選擇的節點就是目標節點,則算法終止,最優解即爲該點的代價函數值;否則,返回到第一步繼續執行

規則真確性的證明。下面我們用數學語言來證明A*算法規則能最終保證結果就是最優解。

已知:t爲被選中作爲下一個做擴展的節點,也是目標節點,n爲已擴展過的節點

求證:g(t)即爲最優解

證明:

其實,對於其中“f*(n)之一必爲最優解”我是沒有想通的,如果哪位讀者明白其中的道理不妨告訴我,萬分感激!


已經學習了三大算法:貪心法、分治策略、樹搜索策略,但頭腦中還是沒有形成清晰的脈路:什麼問題用什麼策略?在接下來的學習當中,需要多加分析、總結,這樣才能在頭腦中形成問題類型與解決策略的對應關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章