python實(shí)現(xiàn)分支限界算法的案例

分支限界法的基本思想:

求解目標(biāo):分支限界法的求解目標(biāo)則是找出滿(mǎn)足約束條件的一個(gè)解,或是在滿(mǎn)足約束條件的解中找出在某種意義下的最優(yōu)解。

搜索方式:以廣度優(yōu)先或以最小耗費(fèi)優(yōu)先的方式搜索解空間樹(shù)。分支限界法常以廣度優(yōu)先或以最小耗費(fèi)(最大效益)優(yōu)先的方式搜索問(wèn)題的解空間樹(shù)统捶。

在分支限界法中呈昔,每一個(gè)活結(jié)點(diǎn)只有一次機(jī)會(huì)成為擴(kuò)展結(jié)點(diǎn)」掖拢活結(jié)點(diǎn)一旦成為擴(kuò)展結(jié)點(diǎn),就一次性產(chǎn)生其所有兒子結(jié)點(diǎn)服赎。在這些兒子結(jié)點(diǎn)中葵蒂,導(dǎo)致不可行解或?qū)е路亲顑?yōu)解的兒子結(jié)點(diǎn)被舍棄,其余兒子結(jié)點(diǎn)被加入活結(jié)點(diǎn)表中重虑。

此后践付,從活結(jié)點(diǎn)表中取下一結(jié)點(diǎn)成為當(dāng)前擴(kuò)展結(jié)點(diǎn),并重復(fù)上述結(jié)點(diǎn)擴(kuò)展過(guò)程缺厉。這個(gè)過(guò)程一直持續(xù)到找到所需的解或活結(jié)點(diǎn)表為空時(shí)為止永高。

分支限界法示例:

單源最短路徑:

問(wèn)題:給定一個(gè)帶權(quán)有向圖G=(V,E)隧土,其中每條邊的權(quán)是一個(gè)實(shí)數(shù)。另外乏梁,還給定V中的一個(gè)頂點(diǎn)次洼,稱(chēng)為源。現(xiàn)在要計(jì)算從源到其他所有各頂點(diǎn)的最短路徑長(zhǎng)度遇骑。這里的長(zhǎng)度就是指路上各邊權(quán)之和卖毁。

圖一

分析:

分支限界法的步驟如下:

1)按寬度優(yōu)先策略遍歷解空間樹(shù)

2)在遍歷過(guò)程中,對(duì)處理的每個(gè)結(jié)點(diǎn)i落萎,根據(jù)界限函數(shù)亥啦,估計(jì)沿該結(jié)點(diǎn)向下搜索所可能達(dá)到的完全解的目標(biāo)函數(shù)的可能取值范圍—界限bound(i)=[dow(i), up(i)]

3)?從中選擇使目標(biāo)函數(shù)取的極小值的結(jié)點(diǎn)優(yōu)先進(jìn)行寬度優(yōu)先搜索,從而不斷調(diào)整搜索方向练链,盡快找到問(wèn)題解翔脱。

在每次分支后,對(duì)凡是界限超出已知可行解值那些子集不再做進(jìn)一步分支媒鼓。這樣届吁,解的許多子集(即搜索樹(shù)上的許多結(jié)點(diǎn))就可以不予考慮了,從而縮小了搜索范圍绿鸣。

將這個(gè)圖轉(zhuǎn)化成樹(shù)的形式疚沐,如下所示:

圖二

創(chuàng)建隊(duì)列。 1.節(jié)點(diǎn)1入隊(duì)列潮模,Q={1}亮蛔。

我們?nèi)〕鲫?duì)頭節(jié)點(diǎn),作為擴(kuò)散節(jié)點(diǎn)擎厢,更新他的后代的值究流。此題中更新節(jié)點(diǎn)2,3动遭,4 的距離芬探,并將他們加入隊(duì)列,Q={1厘惦,2灯节,3,4}绵估。 完成后節(jié)點(diǎn)1出隊(duì)。Q={2卡骂,3国裳,4}。

2.同樣全跨,重復(fù)1的步驟缝左,Q={3,4,5渺杉,6}蛇数;

3.當(dāng)我們?nèi)〉焦?jié)點(diǎn)3時(shí),我們發(fā)現(xiàn)源點(diǎn)->節(jié)點(diǎn)3->節(jié)點(diǎn)6的距離為11是越,大于1-2-6這條路徑的權(quán)重耳舅,所以1-3-6這條路徑之后我們不再考慮。 這就是“限界”(稱(chēng)為”剪枝“)的思想倚评。

4. 重復(fù)步驟浦徊,直到Q為空。優(yōu)先隊(duì)列法方法和FIFO方法類(lèi)似天梧,區(qū)別在于優(yōu)先隊(duì)列每次取隊(duì)列元素中到源點(diǎn)距離最短的點(diǎn)盔性。

# -*- coding: utf-8 -*-

"""

Created on Sun Mar? 7 19:03:09 2021

@author: iron

"""

# Author:Iron

# 初始化圖參數(shù) 用字典初始初始化這個(gè)圖

G = {1: { 2: 4, 3: 2,4:5},

? ? 2: { 5: 7, 6: 5},

? ? 3: {6: 9},

? ? 4: {5: 2, 7: 7},

? ? 5: {8: 4},

? ? 6: {10:6},

? ? 7: {9: 3},

? ? 8: {10:7},

? ? 9: {10:8},

? ? 10:{}

? ? }

inf=9999

#保存源點(diǎn)到各點(diǎn)的距離,為了讓頂點(diǎn)和下標(biāo)一致呢岗,前面多了一個(gè)inf不用在意冕香。

length=[inf,0,inf,inf,inf,inf,inf,inf,inf,inf,inf]

Q=[]

#FIFO隊(duì)列實(shí)現(xiàn)

def branch(G,v0):

? ? Q.append(v0)

? ? dict=G[1]

? ? while len(Q)!=0:

? ? ? ? ? #隊(duì)列頭元素出隊(duì)

? ? ? ? ? head=Q[0]

? ? ? ? ? #松弛操作,并且滿(mǎn)足條件的后代入隊(duì)

? ? ? ? ? for key in dict:

? ? ? ? ? ? ? if length[head]+G[head][key]<=length[key]:

? ? ? ? ? ? ? ? ? ? length[key]=length[head]+G[head][key]

? ? ? ? ? ? ? ? ? ? Q.append(key)

? ? ? ? #松弛完畢后豫,隊(duì)頭出列

? ? ? ? ? del Q[0]

? ? ? ? ? if len(Q)!=0:

? ? ? ? ? ? ? dict=G[Q[0]]

'''

#優(yōu)先隊(duì)列法實(shí)現(xiàn)

def branch(G, v0):

? ? Q.append(v0)

? ? while len(Q) != 0:

? ? ? ? ? min=99999

? ? ? ? ? flag=0

? ? ? ? ? #找到隊(duì)列中距離源點(diǎn)最近的點(diǎn)

? ? ? ? ? for v in Q:

? ? ? ? ? ? ? if min > length[v]:

? ? ? ? ? ? ? ? ? ? min=length[v]

? ? ? ? ? ? ? ? ? ? flag = v

? ? ? ? ? head = flag

? ? ? ? ? dict=G[head]

? ? ? ? ? #找到擴(kuò)散點(diǎn)后進(jìn)行松弛操作

? ? ? ? ? for key in dict:

? ? ? ? ? ? ? if length[head] + G[head][key] <= length[key]:

? ? ? ? ? ? ? ? ? ? length[key] = length[head] + G[head][key]

? ? ? ? ? ? ? ? ? ? Q.append(key)

? ? ? ? ? #松弛完畢后悉尾,該擴(kuò)散點(diǎn)出隊(duì)

? ? ? ? ? Q.remove(head)

'''

branch(G,1)

print(length)

運(yùn)行結(jié)果:[9999, 0, 4, 2, 5, 7, 9, 12, 11, 15, 15]。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硬贯,一起剝皮案震驚了整個(gè)濱河市焕襟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饭豹,老刑警劉巖鸵赖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異拄衰,居然都是意外死亡它褪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)翘悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茫打,“玉大人,你說(shuō)我怎么就攤上這事妖混±铣啵” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵制市,是天一觀的道長(zhǎng)抬旺。 經(jīng)常有香客問(wèn)我,道長(zhǎng)祥楣,這世上最難降的妖魔是什么开财? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任汉柒,我火速辦了婚禮,結(jié)果婚禮上责鳍,老公的妹妹穿的比我還像新娘碾褂。我一直安慰自己,他們只是感情好历葛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布正塌。 她就那樣靜靜地躺著,像睡著了一般啃洋。 火紅的嫁衣襯著肌膚如雪传货。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天宏娄,我揣著相機(jī)與錄音问裕,去河邊找鬼。 笑死孵坚,一個(gè)胖子當(dāng)著我的面吹牛粮宛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卖宠,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼巍杈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扛伍?” 一聲冷哼從身側(cè)響起筷畦,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎刺洒,沒(méi)想到半個(gè)月后鳖宾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逆航,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年鼎文,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片因俐。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拇惋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抹剩,到底是詐尸還是另有隱情撑帖,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布澳眷,位于F島的核電站胡嘿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏境蔼。R本人自食惡果不足惜灶平,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望箍土。 院中可真熱鬧逢享,春花似錦、人聲如沸吴藻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)沟堡。三九已至侧但,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間航罗,已是汗流浹背禀横。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粥血,地道東北人柏锄。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像复亏,于是被迫代替她去往敵國(guó)和親趾娃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一缔御、基本思路 與回溯法一樣抬闷,分支限界法也是在問(wèn)題的解空間樹(shù)上搜索問(wèn)題的解的一種算法。 二耕突、分支限界法與回溯法的區(qū)別...
    無(wú)問(wèn)o閱讀 12,765評(píng)論 0 4
  • 引言:?jiǎn)卧醋疃搪窂絾?wèn)題笤成,是算法問(wèn)題里面最最常提到的一問(wèn)題,今天我們我們講解的是通過(guò)分支限界法來(lái)求解單源最短路徑問(wèn)題...
    cp_insist閱讀 11,940評(píng)論 2 4
  • 分支限界法的基本思想: 求解目標(biāo):分支限界法的求解目標(biāo)則是找出滿(mǎn)足約束條件的一個(gè)解有勾,或是在滿(mǎn)足約束條件的解中找出在...
    曲鐘人散閱讀 474評(píng)論 0 0
  • 廣(寬)度優(yōu)先搜索 + 剪枝疹启。分支限界法的求解目標(biāo)則是找出滿(mǎn)足約束條件的一個(gè)解,或是在滿(mǎn)足約束條件的解中找出在某種...
    Tenloy閱讀 5,815評(píng)論 0 4
  • 定義:分支限界算法是按照廣度優(yōu)先的方式對(duì)解空間樹(shù)(狀態(tài)空間樹(shù))進(jìn)行搜索蔼卡,從而求得最優(yōu)解的算法喊崖。在搜索的過(guò)程中,采用...
    游阿游閱讀 1,058評(píng)論 0 0