詳細講解回溯演算法(一)

2021-09-02 04:25:42 字數 2413 閱讀 8743

本篇博文先不根據樣例講解演算法,我會在接下的博文中一一講解回溯法的具體運用。

這裡先詳細講解回溯演算法的原理和思路。

在了解回溯演算法之前,先對回溯演算法中涉及的知識點的概念先講解下,方便理解博文,,哈哈大家不要嫌囉嗦,可能都想直接了解什麼是回溯法,但基礎不好,後面的運用又怎能徹底掌握呢,不要嫌麻煩,多點耐心,這個其實很容易就理解的,嗷嗷嗷!!!

1.1問題的解空間

乙個複雜問題的解決方案是由若干個小的決策步驟組成的決策序列,所以乙個問題的解可以表示成解向量x=(x1,x2,.....xn),其中分量xi對應第i步的選擇,x中個分量xi所有取值的組合構成問題的解向量空間,簡稱解空間或者解空間樹(因為解空間一般用樹形式來組織),由於乙個解向量往往對應問題的某個狀態,所以解空間又稱為問題的狀態空間樹。

可行解:解空間中滿足約束條件的解空間;

最優解:解空間中使目標函式取最大或者最小值的可行解

這裡拿球陣列a的冪集,來對解空間樹進行講解;

解:解向量x=(x1,x2,x3),xi=1(1<=i<=3)表示選擇ai.xi=0表示不選擇ai。求解過程分為3步,分別對a的3個元素做決策(選擇或不選擇),對應的解空間圖如上圖所示,其中每個葉子結點都構成乙個解,例如i結點的解向量為(1,1,0),對應解是(1,-2)。

乙個問題的求解過程就是在對應的解空間中搜尋以尋找滿足目標函式的解,所以演算法的設計的關鍵點;

(1):結點是如何拓展的,例如求冪集問題中,第i層結點的擴充套件方式就是選擇ai和不選擇ai兩種;

(2):在解空間樹種按什麼方式搜尋,一種是dfs,回溯法就是這種;另一種是bfs,分枝限界法是這種;

(3):解空間樹通常是龐大的,如何高效地找打問題的解;

解空間樹有兩種型別。

子集樹:所給的問題是從n個元素的集合s中找到滿足某種性質的子集時,相應的解空間樹。如上圖

排列樹:所給的問題是確定n個元素滿足某種性質的排列時,相應的解空間樹。

需要注意的是,問題的解空間樹是虛擬的,不需要在演算法執行時構造一棵真正的樹結構。

好了,囉嗦完了,下面講解演算法。

1.2什麼是回溯法:

按照dfs演算法的策略,從跟結點出發搜尋解空間樹。首先跟結點成為活結點(指自身已生成但其孩子結點沒有全部生成的結點),同時也成為當前的擴充套件結點(指正在產生孩子結點的結點,也稱為e結點)

在當前的擴充套件結點處,搜尋向縱深方向移至乙個新結點。這個新結點就成為新的活結點,並成為當前擴充套件結點。如果在當前的擴充套件結點處不能再向縱深方向移動,則當前擴充套件結點就成了死結點(指其所有子結點均已產生的結點)。此時應往回移動(回溯)至最近的乙個活結點處,並使這個活結點成為當前的擴充套件結點。回溯法以這種方式遞迴地在解空間中搜尋,直到找到所要求的解或解空間中已無活結點為止。

所以回溯法體現出走不通就退回再走的思路。

這裡注意:

1.由於採用回溯法求解時存在退回到祖先結點的過程,所以需要儲存搜尋過的結點。通常有兩種:一:用子定義棧來儲存;二:採用遞迴方法。

2.用回溯法通常採用兩種策略避免無效搜尋。一:用約束函式在擴充套件結點處剪除不滿足約束條件的路徑;二:用限界函式剪去得不到問題的解或最優解的路徑。這兩類函式統稱為剪枝函式

這裡歸納下,用回溯法求解的一般步驟:

(1)針對給定的問題確定問題的解空間樹

(2)確定結點的擴充套件搜尋規則。

(3)以深度優先方式搜尋解空間樹,並在搜尋過程中可以採用剪枝函式來避免無效搜尋。其中,深度優先方式可以採用遞迴回溯或者非遞迴(迭代)回溯。

好了,回溯法到這裡就講完了,有看不懂的可以問我,嗯嗯嗯。。。另外,我在講點東西。

1,3回溯法與深度優先遍歷的異同。

兩者的不同點如下:

(1)訪問的次序不同:深度優先遍歷的目的是「遍歷」,本質是無序的,重要的是是否被訪問過,因此在實現上只需要對於每個位置是否被訪問就足夠了。回溯法的目的是「求解過程」,本質是有序的,也就是說必須每一步都是要求的次序。

(2)訪問次數不同:深度優先遍歷對已經訪問過的頂點不再訪問。回溯法中已經訪問過的頂點可能再次訪問。

(3)剪枝不同:深度優先遍歷不含剪枝。

實際上,除了剪枝是回溯法的乙個明顯特徵外(並非任何回溯法都包含剪枝部分),很難嚴格區分回溯法 與深度優先遍歷。因為這些演算法很多是遞迴演算法,在遞迴呼叫中隱含著狀態的自動回退和恢復。

EM演算法詳細講解

本文試圖用最簡單的例子 最淺顯的方式說明em expectation maximization 演算法的應用場景和使用方法,而略去公式的推導和收斂性的證明。以下內容翻譯自 data intensive text processing with mapreduce maximum likelihood...

Adaboost演算法 詳細講解

最近在做整合學習的時候,對adaboost非常感興趣,就自己復現了這個程式。首先提公升方法是基於這樣的乙個思想 對於乙個複雜的任務來說,通將多個專家的判斷進行適當的綜合所得到的判斷,這樣得到的結果會比單個專家的判斷要好。adaboost做法的核心問題adaboost演算法流程 假設給定乙個二分類的訓...

數字拆分問題演算法回溯 演算法講解之回溯法

回溯演算法 如迷宮問題 進入迷宮後,先隨意選擇乙個前進方向,一步步向前試探前進,如果碰到死胡同,說明前進方向已無路可走,這時,首先看其它方向是否還有路可走,如果有路可走,則沿該方向再向前試探 如果已無路可走,則返回一步,再看其它方向是否還有路可走 如果有路可走,則沿該方向再向前試探。按此原則不斷搜尋...