回溯演算法
① 回溯法、貪心演算法,有什麼缺點
回溯的速度太慢,而貪心有時無法得到全局上的最優解的數據。
② 回溯演算法的基本思想及其在軟體開發中的應用
回溯演算法其實就是簡單的枚舉,只不過是加了一點技巧。回溯演算法一般是已經完成的都是合法的,後續的操作不需要考慮先前已經完成的。短時間內通過文字也說不太明白,建議從一些題目去體會,八皇後、全排列。並綜合遞歸去理解這樣的話應該會有比較深刻的理解。
至於在軟體開發中的應用,演算法思想可以用在任何方面,最近甚至比較流行,將一些演算法用到硬體中,演算法提供的是一種思想,認真體會就會發現它會應用在任何方面。
希望能幫助到你。
③ 回溯演算法,用c語言實現
這個演算法應該不難,基本和全排列的演算法類似,只不過判斷條件不是n=1, 而是在判斷已經取得的數的和>=M為終止條件。
具體的演算法,我給個大概流程吧
int lst[N]; //保存選取的數
int index = 0; //lst中最後的一個數的位置
func(W, N)
{
if(N == 0) //遍歷完畢 返回
return;
for(i=0 to N)
{
if( W[i][1] != -1 ) //判斷是否已經讀取當前值
{
lst[index++] = W[i][0] //當前值加入到保存數組
W[i][1] = -1; //設置當前值已經讀取,不可再讀
if(check() == 0)
{
func(W, N-1); //大小不夠M,繼續往下讀
}
else if(check() == 1)
{
print(lst); //和為M,輸出
}
lst[--index] = 0; //回溯,尋找下一組解
W[i][1] = 0;
}
}
}
check()
{
if(sum(lst) > W)
return -1;
if(sum(lst) < W)
return 0;
return 1;
}
④ 24點問題,回溯演算法
回溯演算法也叫試探法,它是一種系統地搜索問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為: 1、定義一個解空間,它包含問題的解。 2、利用適於搜索的方法組織解空間。 3、利用深度優先法搜索解空間。 4、利用限界函數避免移動到不可能產生解的子空間。 問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯演算法的一個重要特性。1.跳棋問題:33個方格頂點擺放著32枚棋子,僅中央的頂點空著未擺放棋子。下棋的規則是任一棋子可以沿水平或成垂直方向跳過與其相鄰的棋子,進入空著的頂點並吃掉被跳過的棋子。試設計一個演算法找出一種下棋方法,使得最終棋盤上只剩下一個棋子在棋盤中央。演算法實現提示利用回溯演算法,每次找到一個可以走的棋子走動,並吃掉。若走到無子可走還是剩餘多顆,則回溯,走下一顆可以走動的棋子。當吃掉31顆時說明只剩一顆,程序結束。2.中國象棋馬行線問題:中國象棋半張棋盤如圖1(a)所示。馬自左下角往右上角跳。今規定只許往右跳,不許往左跳。比如圖4(a)中所示為一種跳行路線,並將所經路線列印出來。列印格式為:0,0->2,1->3,3->1,4->3,5->2,7->4,8…演算法分析:如圖1(b),馬最多有四個方向,若原來的橫坐標為j、縱坐標為i,則四個方向的移動可表示為:1: (i,j)→(i+2,j+1); (i<3,j<8) 2: (i,j)→(i+1,j+2); (i<4,j<7)3: (i,j)→(i-1,j+2); (i>0,j<7) 4: (i,j)→(i-2,j+1); (i>1,j<8)搜索策略:S1:A[1]:=(0,0);S2:從A[1]出發,按移動規則依次選定某個方向,如果達到的是(4,8)則轉向S3,否則繼續搜索下一個到達的頂點;S3:列印路徑。演算法設計:procere try(i:integer); var j:integer;beginfor j:=1 to 4 do if 新坐標滿足條件 thenbegin記錄新坐標;if 到達目的地 then print else try(i+1); 退回到上一個坐標,即回溯;end;end;
⑤ 什麼是回溯演算法
回溯演算法也叫試探法,它是一種系統地搜索問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為: 1、定義一個解空間,它包含問題的解。 2、利用適於搜索的方法組織解空間。 3、利用深度優先法搜索解空間。 4、利用限界函數避免移動到不可能產生解的子空間。 問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯演算法的一個重要特性。 1.跳棋問題: 33個方格頂點擺放著32枚棋子,僅中央的頂點空著未擺放棋子。下棋的規則是任一棋子可以沿水平或成垂直方向跳過與其相鄰的棋子,進入空著的頂點並吃掉被跳過的棋子。試設計一個演算法找出一種下棋方法,使得最終棋盤上只剩下一個棋子在棋盤中央。 演算法實現提示 利用回溯演算法,每次找到一個可以走的棋子走動,並吃掉。若走到無子可走還是剩餘多顆,則回溯,走下一顆可以走動的棋子。當吃掉31顆時說明只剩一顆,程序結束。 2.中國象棋馬行線問題: 中國象棋半張棋盤如圖1(a)所示。馬自左下角往右上角跳。今規定只許往右跳,不許往左跳。比如 圖4(a)中所示為一種跳行路線,並將所經路線列印出來。列印格式為: 0,0->2,1->3,3->1,4->3,5->2,7->4,8… 演算法分析: 如圖1(b),馬最多有四個方向,若原來的橫坐標為j、縱坐標為i,則四個方向的移動可表示為: 1: (i,j)→(i+2,j+1); (i<3,j<8) 2: (i,j)→(i+1,j+2); (i<4,j<7) 3: (i,j)→(i-1,j+2); (i>0,j<7) 4: (i,j)→(i-2,j+1); (i>1,j<8) 搜索策略: S1:A[1]:=(0,0); S2:從A[1]出發,按移動規則依次選定某個方向,如果達到的是(4,8)則轉向S3,否則繼續搜索下 一個到達的頂點; S3:列印路徑。 演算法設計: procere try(i:integer); {搜索} var j:integer; begin for j:=1 to 4 do {試遍4個方向} if 新坐標滿足條件 then begin 記錄新坐標; if 到達目的地 then print {統計方案,輸出結果} else try(i+1); {試探下一步} 退回到上一個坐標,即回溯; end; end;
⑥ 回溯演算法的基本思想
回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。八皇後問題就是回溯演算法的典型,第一步按照順序放一個皇後,然後第二步符合要求放第2個皇後,如果沒有位置符合要求,那麼就要改變第一個皇後的位置,重新放第2個皇後的位置,直到找到符合條件的位置就可以了。回溯在迷宮搜索中使用很常見,就是這條路走不通,然後返回前一個路口,繼續下一條路。回溯演算法說白了就是窮舉法。不過回溯演算法使用剪枝函數,剪去一些不可能到達 最終狀態(即答案狀態)的節點,從而減少狀態空間樹節點的生成。回溯法是一個既帶有系統性又帶有跳躍性的的搜索演算法。它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。演算法搜索至解空間樹的任一結點時,總是先判斷該結點是否肯定不包含問題的解。如果肯定不包含,則跳過對以該結點為根的子樹的系統搜索,逐層向其祖先結點回溯。否則,進入該子樹,繼續按深度優先的策略進行搜索。回溯法在用來求問題的所有解時,要回溯到根,且根結點的所有子樹都已被搜索遍才結束。而回溯法在用來求問題的任一解時,只要搜索到問題的一個解就可以結束。這種以深度優先的方式系統地搜索問題的解的演算法稱為回溯法,它適用於解一些組合數較大的問題。
⑦ 誰能解釋一下回溯演算法
回溯演算法也叫試探法,它是一種系統地搜索問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。
初識回溯演算法是在解決8皇後問題時候,第一步按照順序放一個皇後,然後第二步符合要求放第2個皇後,如果沒有符合位置符合要求,那麼就要改變第一個皇後的位置,重新放第2個皇後的位置,直到找到符合條件的位置就可以了
回溯在迷宮搜索中使用很常見,就是這條路走不通,然後返回前一個路口,繼續下一條路。
⑧ c語言回溯演算法
if(n==7||a[n+1][i]!=1&&a[n+1][i+1]!=1&&a[n+1][i-1]!=1)
這行的代碼是判斷是否可以放皇後的句子。如果可以就將所在位置置 1 。後面也就是這樣做判斷的。這個程序應當有問題,其中try應當是C語言中一個關鍵字啊,不可以這么用。
就我的看法:八皇後的問題應當用遞歸加回溯會都到更好的代碼,我寫過,不過也快忘了。
⑨ 回溯演算法的介紹
回溯演算法也叫試探法,它是一種系統地搜索問題的解的方法。回溯演算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。用回溯演算法解決問題的一般步驟為:1、定義一個解空間,它包含問題的解。2、利用適於搜索的方法組織解空間。3、利用深度優先法搜索解空間。4、利用限界函數避免移動到不可能產生解的子空間。問題的解空間通常是在搜索問題的解的過程中動態產生的,這是回溯演算法的一個重要特性。