轉(zhuǎn)帖|行業(yè)資訊|編輯:龔雪|2015-02-06 09:29:30.000|閱讀 218 次
概述:回溯算法實(shí)際上一個(gè)類似枚舉的搜索嘗試過(guò)程,主要是在搜索嘗試過(guò)程中尋找問(wèn)題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時(shí),就“回溯”返回,嘗試別的路徑。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
回溯算法實(shí)際上一個(gè)類似枚舉的搜索嘗試過(guò)程,主要是在搜索嘗試過(guò)程中尋找問(wèn)題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時(shí),就“回溯”返回,嘗試別的路徑。
回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”。
許多復(fù)雜的,規(guī)模較大的問(wèn)題都可以使用回溯法,有“通用解題方法”的美稱。
在包含問(wèn)題的所有解的解空間樹中,按照深度優(yōu)先搜索的策略,從根結(jié)點(diǎn)出發(fā)深度探索解空間樹。當(dāng)探索到某一結(jié)點(diǎn)時(shí),要先判斷該結(jié)點(diǎn)是否包含問(wèn)題的解, 如果包含,就從該結(jié)點(diǎn)出發(fā)繼續(xù)探索下去,如果該結(jié)點(diǎn)不包含問(wèn)題的解,則逐層向其祖先結(jié)點(diǎn)回溯。(其實(shí)回溯法就是對(duì)隱式圖的深度優(yōu)先搜索算法)。
若用回溯法求問(wèn)題的所有解時(shí),要回溯到根,且根結(jié)點(diǎn)的所有可行的子樹都要已被搜索遍才結(jié)束。
而若使用回溯法求任一個(gè)解時(shí),只要搜索到問(wèn)題的一個(gè)解就可以結(jié)束。
(1)針對(duì)所給問(wèn)題,確定問(wèn)題的解空間:
首先應(yīng)明確定義問(wèn)題的解空間,問(wèn)題的解空間應(yīng)至少包含問(wèn)題的一個(gè)(最優(yōu))解。
(2)確定結(jié)點(diǎn)的擴(kuò)展搜索規(guī)則
(3)以深度優(yōu)先方式搜索解空間,并在搜索過(guò)程中用剪枝函數(shù)避免無(wú)效搜索。
(1)問(wèn)題框架
設(shè)問(wèn)題的解是一個(gè)n維向量(a1,a2,………,an),約束條件是ai(i=1,2,3,…..,n)之間滿足某種條件,記為f(ai)。
(2)非遞歸回溯框架
int a[n], i;初始化數(shù)組a[]; i = 1; while (i > 0(有路可走) and(未達(dá)到目標(biāo))) // 還未回溯到頭 { if (i > n) // 搜索到葉結(jié)點(diǎn) {搜索到一個(gè)解,輸出; } else // 處理第i個(gè)元素 { a[i]第一個(gè)可能的值; while (a[i]在不滿足約束條件且在搜索空間內(nèi)) { a[i]下一個(gè)可能的值; } if (a[i]在搜索空間內(nèi)) { 19 : 標(biāo)識(shí)占用的資源;20 : i = i + 1; // 擴(kuò)展下一個(gè)結(jié)點(diǎn) 21: } 22: else 23: { 清理所占的狀態(tài)空間; // 回溯25: i = i –1; } }
(3)遞歸的算法框架
回溯法是對(duì)解空間的深度優(yōu)先搜索,在一般情況下使用遞歸函數(shù)來(lái)實(shí)現(xiàn)回溯法比較簡(jiǎn)單,其中i為搜索的深度,框架如下:
int a[n]; try(int i) { if(i>n) 輸出結(jié)果; else { for(j = 下界; j <= 上界; j=j+1) // 枚舉i所有可能的路徑 { if(fun(j)) // 滿足限界函數(shù)和約束條件 { a[i] = j; ... // 其他操作 try(i+1); 回溯前的清理工作(如a[i]置空值等); } } } }
更多新體驗(yàn),歡迎試用JetBrains旗下的各種Web開發(fā)工具。另外還有5折限時(shí)搶購(gòu)和免費(fèi)領(lǐng)iPhone 6、iPad air等好禮!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn