国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第六章——分枝限界法

這篇具有很好參考價值的文章主要介紹了第六章——分枝限界法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

分枝限界法概述

分枝限界法和回溯法一樣,也是一種在問題的解空間樹上搜可行解的窮舉算法。

其中“分枝”指的是“分枝限界法”搜索可行解采用的策略為廣度優(yōu)先搜索或?qū)崿F(xiàn)方法和思路類似的代價優(yōu)先搜索。

廣度優(yōu)先搜索的概念和實現(xiàn)前面已經(jīng)介紹過很多次了,這里不再做贅述;代價優(yōu)先搜索的目的是以某種定義下的優(yōu)先級,按照優(yōu)先級從高到低的順序處理所有的結(jié)點。

(從低到高和從高到低本質(zhì)上是一樣的,這里以從高到低為例)。

如果狀態(tài)結(jié)點能夠按照優(yōu)先級不嚴格(可以相等)降低的順序,在解空間樹上按照結(jié)點高度從高到低,同高度結(jié)點從左到右或從右到左的排列,那我們可以用廣度優(yōu)先搜索來達到代價優(yōu)先搜索的目的(廣度優(yōu)先搜索的搜索順序和代價優(yōu)先搜索的搜素順序相同)。

但是狀態(tài)空間樹上的狀態(tài)結(jié)點是通過決策聯(lián)系起來的,決策對于狀態(tài)優(yōu)先級相關(guān)的屬性的變化多樣(可能增大,可能減小,可能線性,可能非線性),狀態(tài)結(jié)點按照優(yōu)先級從高到低的順序在狀態(tài)空間樹上的出現(xiàn)往往會是跳躍式的,與解空間樹的結(jié)構(gòu)無關(guān)。

如果策略能夠始終保持狀態(tài)結(jié)點到子節(jié)點優(yōu)先級相關(guān)的屬性遞增或遞減(即樹上的結(jié)點從屬性數(shù)值的角度來看符合堆的性質(zhì)),我們可以在代價優(yōu)先搜索中用堆數(shù)據(jù)結(jié)構(gòu)來存儲狀態(tài)空間中未處理過的結(jié)點,處理節(jié)點過程中根據(jù)可選策略擴展結(jié)點加入容器的方法和廣度優(yōu)先搜索相同。

根據(jù)堆數(shù)據(jù)結(jié)構(gòu)的性質(zhì),我們每次取堆頂(隊首)結(jié)點進行處理,即是剩余未處理結(jié)點中優(yōu)先級最高的結(jié)點(未加入容器的子孫節(jié)點,容器中一定存在一個結(jié)點的優(yōu)先級高于該子孫節(jié)點的優(yōu)先級,所以是未處理中結(jié)點中優(yōu)先級最高的結(jié)點),這樣一直處理即是按照優(yōu)先級最高到低的順序處理所有的狀態(tài)節(jié)點。

(具體原因和用反證法證明,不做贅述)。

“限界”指的是限界函數(shù),和回溯法中的限界函數(shù)一樣,在廣度(代價)優(yōu)先搜索將被擴展的結(jié)點加入到(優(yōu)先)隊列中時,刪除掉一些不必要的子節(jié)點,從而將選擇變得更有效以加速搜索的進程。

個人歸納認為:回溯法=(狀態(tài)空間樹上的)一般深度優(yōu)先搜索+限界函數(shù),分枝限界法=(狀態(tài)空間樹上的)一般廣度(代價)優(yōu)先搜索+限界函數(shù)。

作為兩種在狀態(tài)空間書上搜索可行解的算法,我們一般考慮狀態(tài)空間樹的寬度和深度來選擇使用回溯法還是分枝限界法:存在根節(jié)點到部分葉子結(jié)點的路徑過長時,選擇分枝限界法避免進入某條過長路徑的搜索;如果可選擇的決策過多,即樹的寬度過大時,選擇回溯法來避免擴展狀態(tài)空間樹同一高度過多的狀態(tài)節(jié)點。

如果兩種情況同時存在,可以采取限定單次回溯法搜素最大深度的方法來避免回溯法搜素進入過深的分支,不斷擴大單次回溯法搜素的最大深度直到某次的回溯法尋找到可行解為止,這種策略稱為迭代加深。

如果狀態(tài)節(jié)點的屬性滿足代價優(yōu)先搜索的要求,即子節(jié)點的優(yōu)先級都高于父節(jié)點的優(yōu)先級,我們也可以用分枝限界法去尋找特定意義上的最優(yōu)解。

如果屬性值(優(yōu)先級)按照層次從上到下遞減且最優(yōu)解的“優(yōu)”指的就是按照層次從上到下遞減的優(yōu)先級,那么以代價優(yōu)先搜索為模板搜素到的第一個可行解即為我們的最優(yōu)解,在這種問題背景下不需要進行與當前最優(yōu)解比較判斷能否得到更優(yōu)解的剪枝函數(shù)。

確定可行解(最優(yōu)解)所進行的決策

即在圖(樹)的搜索問題中,求解根結(jié)點到當前結(jié)點的路徑,一般有兩種通用的策略:

第一種是對每個節(jié)點保存根節(jié)點到該節(jié)點的路徑,在擴展時通過根結(jié)點到父節(jié)點的路徑獲得根結(jié)點到子節(jié)點的路徑。

這種方法實現(xiàn)起來簡單,但是往往會浪費空間和時間。

第二種是在擴展子節(jié)點時對每個結(jié)點保存它在狀態(tài)空間上的前驅(qū)節(jié)點,即父節(jié)點,然后通過對父節(jié)點的回溯得到該節(jié)點到根節(jié)點的路徑,逆序即是根節(jié)點到該節(jié)點的路徑。

分枝限界法的時間性能

分枝限界法和回溯法本質(zhì)上都屬于窮舉法(廣度優(yōu)先搜索和深度優(yōu)先搜索),在最壞情況下與窮舉法的復(fù)雜度相同(甚至更糟,因為需要進行限界值的計算和限界函數(shù)的判斷),實際求解效率基本上由限界函數(shù)決定。


求解0/1背包問題

即前面介紹過很多遍的0/1背包問題。

重量小于規(guī)定重量的結(jié)點通過決策構(gòu)成解空間樹,由于0/1背包問題的決策保證子節(jié)點中的價值屬性一定大于等于父節(jié)點的價值屬性,結(jié)點的價值屬性用于確定結(jié)點的優(yōu)先級,我們可以通過優(yōu)先隊列式分枝限界法,即以代價優(yōu)先搜索為模板的分枝限界法求解0/1背包問題的最優(yōu)解。

代價預(yù)先搜索求解0/1背包問題,就是在解空間樹上以狀態(tài)節(jié)點的價值屬性作為優(yōu)先級高度的標準進行上的代價優(yōu)先搜索。

限界函數(shù)中的左孩子剪枝策略與回溯法中的左孩子剪枝策略一致;上一章節(jié)中提到0/1背包的右孩子剪枝相當于固定右子節(jié)點后續(xù)的策略向左,即將所有還沒有選擇的物品加入背包來得到一個價值的上界。

實際上這種價值上界的估計是比較粗糙的,因為剩余的物品我們往往無法全部加入到當前的背包中。這種上界估計的方式就相當于固定策略跳躍到右子樹最左邊的狀態(tài)節(jié)點,沒有進行真正的搜索,實際上這個擴展得到的“最左邊的狀態(tài)節(jié)點”可能并不滿足問題規(guī)范的條件,即不是一個滿足要求的可行解(實際不存在于解空間樹上),上界被估計得過高了。

那如果我們是通過實際搜索,搜索到右子樹滿足問題條件的最左狀態(tài)節(jié)點呢?即課件上的原做法:

第六章——分枝限界法
這種價值上界的估計方法在重量小價值高的物品出現(xiàn)在解空間樹下層的決策時會出現(xiàn)反例。解決的方案也很簡單,就是避免重量小價值高的物品出現(xiàn)在解空間樹的下層,或者說避免重量小價值高的物品在物品序列中出現(xiàn)在重量大價值小的物品之后,即對物品序列進行一個預(yù)處理:在進行分枝限界法之前,先按照“價值/重量”的值對物品序列進行從大到小的排序。

對應(yīng)的隊列式分枝限界法求解如下(只介紹一個框架,在能夠使用代價優(yōu)先搜索的情況下一般還是使用代價優(yōu)先搜索):文章來源地址http://www.zghlxwxcb.cn/news/detail-486977.html

//隊列中的狀態(tài)結(jié)點類型
struct NodeType{
   	
	int no;//結(jié)點編號
	int i;//當前結(jié)點在搜索空間中的層次
	int w;//搜素到當前結(jié)點的總重量
	int v;//搜素到當前結(jié)點的總價值
	int x[MAXN];//搜素到當前狀態(tài)結(jié)點進行過的決策 
	double ub;//限界函數(shù)bound預(yù)估的價值上界
};
//計算狀態(tài)結(jié)點e的價值上界
//需要對物品價值/重量的值進行一個排序
void bound(NodeType &e){
   
	//固定后續(xù)的決策向左,搜索右子樹滿足問題條件的最左狀態(tài)節(jié)點
	int i=e.i+1;
	int sumw=e.w;
	double sumv=e.v;
	while ((sumw+w[i]<=W)&&i<=n){
   	
		sumw+=w[i];	sumv+=v[i];	i++;
	}
	//如果所有剩余的物品不能全部裝入背包,對于不能完全裝入背包的物品,采用分塊極限的方式估計價值上界 
	if (i<=n) e.ub=sumv+(W-sumw)*v[i]/w[i];
	//如果所有剩余的物品都能裝入背包 
	else e.ub=sumv;
}
//將結(jié)點加入容器并通過結(jié)點的層次判斷可行解,通過比較得到最優(yōu)解 
void EnQueue(NodeType e,queue<NodeType> &qu){
   
	//通過結(jié)點的層次判斷可行解
	if (e.i==n){
   
		if (e.v>maxv){
   
			//保存最優(yōu)解的信息 
			maxv=e.v;
			for (int j=1;j<=n;j++) bestx[j]=e.x[j];
		}
	}
	else qu.push(e);//非葉子結(jié)點進隊
}
//隊列式分枝限界法求0/1背包的最優(yōu)解
void bfs(<

到了這里,關(guān)于第六章——分枝限界法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 最大團問題(MPP)之回溯法、分支限界法

    最大團問題(MPP)之回溯法、分支限界法

    給定一個無向圖 G = ( V , E ) G=(V, E) G = ( V , E ) , 其中 V V V 是圖的頂點集, E E E 是圖的邊集: 完全子圖:如果 U ? V U?V U ? V ,對任意的 u , v ∈ U u, v∈U u , v ∈ U , 有 ( u , v ) ∈ E (u, v)∈E ( u , v ) ∈ E , 則稱 U U U 是 V V V 的完全子圖 團: G G G 的完全子圖 U U U 就是 G G G 的團。

    2024年02月07日
    瀏覽(38)
  • 01背包(動態(tài)規(guī)劃,貪心算法,回溯法,分支限界法)

    01背包(動態(tài)規(guī)劃,貪心算法,回溯法,分支限界法)

    有n個物品,它們有各自的體積和價值,現(xiàn)有給定容量的背包,如何讓背包里裝入的物品具有最大的價值總和? number=4,capacity=8 物品編號(i) W(體積) V(價值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是動態(tài)規(guī)劃 1.動態(tài)規(guī)劃算法是通過拆分問題,定義問題狀態(tài)和狀態(tài)之間的關(guān)系, 使得

    2024年02月08日
    瀏覽(23)
  • 回溯法,分支限界法,動態(tài)規(guī)劃法求解0-1背包問題(c++)

    回溯法,分支限界法,動態(tài)規(guī)劃法求解0-1背包問題(c++)

    問題描述 給定n種物品和一背包。物品i的重量是wi0,其價值為vi0,背包的容量為c。問應(yīng)如何選擇裝入背包中的物品,使得裝入背包中物品的總價值最大? 搜索空間: 子集樹(完全二叉樹) 約束函數(shù)(進包用): 如果當前背包中的物品總重量是cw,前面k-1件物品都已經(jīng)決定是否進包,那

    2024年02月10日
    瀏覽(18)
  • 五種基礎(chǔ)算法小結(jié)與典型題目分享(動態(tài)規(guī)劃、分治、貪心、回溯、分支限界)

    動態(tài)規(guī)劃是用于解決多階段決策問題的算法策略。它通過用變量集合描述當前情境來定義“狀態(tài)”,進而用這些狀態(tài)表達每個階段的決策。 每個階段的狀態(tài)是基于前面的狀態(tài)經(jīng)過某種決策得到的。通過建立狀態(tài)間的遞推關(guān)系,并將其形式化為數(shù)學(xué)遞推式,得到“狀態(tài)轉(zhuǎn)移方程

    2024年01月19日
    瀏覽(24)
  • 【課設(shè)】java:迷宮小游戲(遞歸與分治、動態(tài)規(guī)劃、貪心算法、回溯法、分支限界法)

    【課設(shè)】java:迷宮小游戲(遞歸與分治、動態(tài)規(guī)劃、貪心算法、回溯法、分支限界法)

    魚弦:CSDN內(nèi)容合伙人、CSDN新星導(dǎo)師、全棧領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 、51CTO(Top紅人+專家博主) 、github開源愛好者(go-zero源碼二次開發(fā)、游戲后端架構(gòu) https://github.com/Peakchen) 遞歸與分治算法 原理: 遞歸與分治算法將問題分解為子問題,遞歸地解決每個子問題,最后將結(jié)果合并得到整

    2024年02月02日
    瀏覽(32)
  • 第六章volatile詳解

    第六章volatile詳解

    可以保證 可見性 有序性 為什么能實現(xiàn)這些功能, 其底層原理就是內(nèi)存屏障 volatile可以保證共享變量可見性,相較于普通的共享變量,使用volatile可以保證共享變量的可見性 當線程讀取的是volatile時,JMM會把該線程對應(yīng)的工作內(nèi)存設(shè)置為無效,線程直接從主

    2024年02月09日
    瀏覽(18)
  • 第六章 3D地形搭建(上)

    第六章 3D地形搭建(上)

    Unity 提供了多種工具來創(chuàng)建環(huán)境特征,例如地形和植被。 要在場景中添加地形 (Terrain) 游戲?qū)ο螅垙牟藛沃羞x擇 GameObject 3D Object Terrain 。此過程也會在 Project 視圖中添加相應(yīng)的地形資源。默認情況,場景中出現(xiàn)一個大型平坦的平面。地形的 Inspector 窗口提供了許多工具,可

    2024年02月01日
    瀏覽(23)
  • 第六章 集合引用類型

    6.1 Object ????????到目前為止,大多數(shù)引用值的示例使用的是Object類型。Object是ECMAScript中最常用的類型之一。雖然Object的實例沒有多少功能,但很適合存儲和在應(yīng)用程序間交換數(shù)據(jù)。 ????????顯式地創(chuàng)建Object的實例有兩種方式。第一種是使用new操作符和Object構(gòu)造函數(shù),

    2024年01月18日
    瀏覽(19)
  • 第六章、代理模式

    代理模式是為一個對象提供一個代用品或占位符,以便控制對它的訪問。 代理模式的關(guān)鍵是,當客戶不方便直接訪問一個對象或者不滿足需求時,提供一個替身對象來控制對這個對象的訪問,客戶實際上訪問的是替身對象。 6.1舉個栗子 小明想要對女神A表白,送鮮花,可是他

    2024年02月19日
    瀏覽(25)
  • 第六章 矩陣函數(shù)

    第六章 矩陣函數(shù)

    就是 f ( x ) 變成了 f ( A ) 就是 f(x) 變成了 f(A) 就是 f ( x ) 變成了 f ( A ) 難點在于 A k A^k A k 不好算。 解決方案是利用 J o r d a n Jordan J or d an 標準型來做。 f ( A ) = P d i a g ( f ( J 1 ) , f ( J 2 ) , … , f ( J r ) ) P ? 1 Large f(A) = Pdiag(f(J_1),f(J_2),dots,f(J_r))P^{-1} f ( A ) = P d ia g ( f ( J 1 ?

    2024年02月04日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包