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

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


在創建這顆樹(解空間)時,咱們用到的方法根據搜索的次序不一樣能夠分爲廣度優先搜索、深度優先搜索和最佳優先搜索。打個比方來講明一下它們之間的不一樣。我準備找王二麻子辦點事,怎麼找到他呢?若是是廣度優先搜索,我會先找我全部的朋友,若是這些朋友當中沒有王二麻子這我的,再找我全部朋友的朋友,若是尚未,再找我全部朋友的朋友的朋友……直至找到爲止;若是是深度優先搜索,也是先找我全部的朋友,若是這些朋友當中沒有王二麻子這我的,再找個人一個朋友的全部朋友,若是尚未,再找我這個朋友的一個朋友的全部朋友……直至找到爲止;若是是最佳優先搜索,仍是先找我全部的朋友,若是這些朋友當中沒有王二麻子這我的,從個人朋友當中選出人脈最廣的那我的,找他的全部朋友,若是還沒找到,從當前找到的人中選出人脈最廣的那我的(排除已選出的人),接着找他的全部朋友……直至找到爲止。數據結構

在最佳優先搜索中有「選出人脈最廣的人」這一步,抽象成通常就是創建一個評價函數,若是將評價函數運用到深度優先搜索中的「個人一個朋友」的選擇上,就獲得了深度優先搜索的變形——登山法算法不一樣也體如今數據結構上,廣度優先搜索、深度優先搜索、最佳優先搜索對應的數據結構分別爲:隊列、棧、堆,其中的妙趣讀者本身去體會吧。函數


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

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


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

相關文章
相關標籤/搜索