0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

分支限界法與回溯法算法的詳細資料概述

算法與數(shù)據結構 ? 來源:未知 ? 作者:易水寒 ? 2018-06-12 19:40 ? 次閱讀

分支限界法與回溯法

(1)求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優(yōu)解。 (2)搜索方式的不同:回溯法以深度優(yōu)先的方式搜索解空間樹,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹。

分支限界法的基本思想

分支限界法常以廣度優(yōu)先或以最小耗費(最大效益)優(yōu)先的方式搜索問題的解空間樹。在分支限界法中,每一個活結點只有一次機會成為擴展結點?;罱Y點一旦成為擴展結點,就一次性產生其所有兒子結點。在這些兒子結點中,導致不可行解或導致非最優(yōu)解的兒子結點被舍棄,其余兒子結點被加入活結點表中。 此后,從活結點表中取下一結點成為當前擴展結點,并重復上述結點擴展過程。這個過程一直持續(xù)到找到所需的解或活結點表為空時為止。

常見的兩種分支限界法

(1)隊列式(FIFO)分支限界法 按照隊列先進先出(FIFO)原則選取下一個結點為擴展結點。 (2)優(yōu)先隊列式分支限界法 按照優(yōu)先隊列中規(guī)定的優(yōu)先級選取優(yōu)先級最高的結點成為當前擴展結點。

一、單源最短路徑問題

1、問題描述

在下圖所給的有向圖G中,每一邊都有一個非負邊權。要求圖G的從源頂點s到目標頂點t之間的最短路徑。

分支限界法與回溯法算法的詳細資料概述

下圖是用優(yōu)先隊列式分支限界法解有向圖G的單源最短路徑問題產生的解空間樹。其中,每一個結點旁邊的數(shù)字表示該結點所對應的當前路長。

分支限界法與回溯法算法的詳細資料概述

找到一條路徑:

分支限界法與回溯法算法的詳細資料概述

目前的最短路徑是8,一旦發(fā)現(xiàn)某個結點的下界不小于這個最短路進,則剪枝:

分支限界法與回溯法算法的詳細資料概述

同一個結點選擇最短的到達路徑:

分支限界法與回溯法算法的詳細資料概述

分支限界法與回溯法算法的詳細資料概述

2.剪枝策略

算法擴展結點的過程中,一旦發(fā)現(xiàn)一個結點的下界不小于當前找到的最短路長,則算法剪去以該結點為根的子樹。

在算法中,利用結點間的控制關系進行剪枝。從源頂點s出發(fā),2條不同路徑到達圖G的同一頂點。由于兩條路徑的路長不同,因此可以將路長長的路徑所對應的樹中的結點為根的子樹剪去。

3.算法思想

解單源最短路徑問題的優(yōu)先隊列式分支限界法用一極小堆來存儲活結點表。其優(yōu)先級是結點所對應的當前路長。

算法從圖G的源頂點s和空優(yōu)先隊列開始。結點s被擴展后,它的兒子結點被依次插入堆中。此后,算法從堆中取出具有最小當前路長的結點作為當前擴展結點,并依次檢查與當前擴展結點相鄰的所有頂點。如果從當前擴展結點i到頂點j有邊可達,且從源出發(fā),途經頂點i再到頂點j的所相應的路徑的長度小于當前最優(yōu)路徑長度,則將該頂點作為活結點插入到活結點優(yōu)先隊列中。這個結點的擴展過程一直繼續(xù)到活結點優(yōu)先隊列為空時為止。

實現(xiàn)

* 作者:chinazhangjie

* 郵箱:chinajiezhang@gmail.com

* 開發(fā)語言:C++

* 開發(fā)環(huán)境:Mircosoft Virsual Studio 2008

* 時間: 2010.11.01

*/

#include

#include

#include

#include

using namespacestd;

structnode_info

{

public:

node_info(inti,intw)

: index(i),weight(w){}

node_info()

: index(0),weight(0){}

node_info(constnode_info & ni)

: index(ni.index),weight(ni.weight){}

friend

booloperator < (constnode_info& lth,constnode_info& rth){

returnlth.weight > rth.weight;// 為了實現(xiàn)從小到大的順序

}

public:

intindex;// 結點位置

intweight;// 權值

};

structpath_info

{

public:

path_info()

: front_index(0),weight(numeric_limits::max()){}

public:

intfront_index;

intweight;

};

// single source shortest paths

classss_shortest_paths

{

public:

ss_shortest_paths(constvector >& g,intend_location)

:no_edge(-1),end_node(end_location),node_count(g.size()),graph(g)

{}

// 打印最短路徑

voidprint_spaths()const{

cout << "min weight : " << shortest_path << endl;

cout << "path: ";

copy(s_path_index.rbegin(),s_path_index.rend(),

ostream_iterator (cout," "));

cout << endl;

}

// 求最短路徑

voidshortest_paths(){

vector path(node_count);

priority_queue > min_heap;

min_heap.push(node_info(0,0));// 將起始結點入隊

while(true){

node_info top = min_heap.top();// 取出最大值

min_heap.pop();

// 已到達目的結點

if(top.index == end_node){

break;

}

// 未到達則遍歷

for(inti = 0;i < node_count; ++ i){

// 頂點top.index和i間有邊,且此路徑長小于原先從原點到i的路徑長

if(graph[top.index][i] != no_edge &&

(top.weight + graph[top.index][i]) < path[i].weight){

min_heap.push(node_info(i,top.weight + graph[top.index][i]));

path[i].front_index = top.index;

path[i].weight = top.weight + graph[top.index][i];

}

}

if(min_heap.empty()){

break;

}

}

shortest_path = path[end_node].weight;

intindex = end_node;

s_path_index.push_back(index);

while(true){

index = path[index].front_index;

s_path_index.push_back(index);

if(index == 0){

break;

}

}

}

private:

vector >graph;// 圖的數(shù)組表示

intnode_count;// 結點個數(shù)

constintno_edge;// 無通路

constintend_node;// 目的結點

vectors_path_index;// 最短路徑

intshortest_path;// 最短路徑

};

intmain()

{

constintsize = 11;

vector > graph(size);

for(inti = 0;i < size; ++ i){

graph[i].resize(size);

}

for(inti = 0;i < size; ++ i){

for(intj = 0;j < size; ++ j){

graph[i][j] = -1;

}

}

graph[0][1] = 2;

graph[0][2] = 3;

graph[0][3] = 4;

graph[1][2] = 3;

graph[1][5] = 2;

graph[1][4] = 7;

graph[2][5] = 9;

graph[2][6] = 2;

graph[3][6] = 2;

graph[4][7] = 3;

graph[4][8] = 3;

graph[5][6] = 1;

graph[5][8] = 3;

graph[6][9] = 1;

graph[6][8] = 5;

graph[7][10] = 3;

graph[8][10] = 2;

graph[9][8] = 2;

graph[9][10] = 2;

ss_shortest_paths ssp(graph,10);

ssp.shortest_paths();

ssp.print_spaths();

return0;

}

測試數(shù)據(圖)

分支限界法與回溯法算法的詳細資料概述

測試結果

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4587

    瀏覽量

    92499
  • fifo
    +關注

    關注

    3

    文章

    386

    瀏覽量

    43492
  • 回溯法
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6117

原文標題:分支限界法

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求allegro高速信號蛇形走線和10度線的走詳細資料

    求高速信號蛇形走線和10度線的走詳細資料,先謝謝啦?。?!
    發(fā)表于 07-06 02:26

    調制解調器和積分器算法程序的詳細資料概述

    本文的主要內容介紹的是調制解調器和積分器算法程序的詳細資料概述
    發(fā)表于 04-28 10:20 ?11次下載
    調制解調器和積分器<b class='flag-5'>算法</b>程序的<b class='flag-5'>詳細資料</b><b class='flag-5'>概述</b>

    五大常用算法回溯

    回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發(fā)現(xiàn)已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。
    的頭像 發(fā)表于 05-02 16:50 ?5916次閱讀
    五大常用<b class='flag-5'>算法</b>之<b class='flag-5'>回溯</b><b class='flag-5'>法</b>

    TI的基于DSP兼容的第三方算法協(xié)議的詳細資料概述

    本文的主要內容介紹的是TI的基于DSP兼容的第三方算法協(xié)議的詳細資料概述
    發(fā)表于 05-07 17:04 ?8次下載
    TI的基于DSP兼容的第三方<b class='flag-5'>算法</b>協(xié)議的<b class='flag-5'>詳細資料</b><b class='flag-5'>概述</b>

    PID程序算法詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是PID程序算法詳細資料概述免費下載
    發(fā)表于 07-24 08:00 ?36次下載

    SV601187的詳細資料合集包括了電路圖,原理圖和介紹等詳細資料概述

    本文檔的主要內容詳細介紹的是SV601187的詳細資料合集包括了電路圖,原理圖和介紹等詳細資料概述。
    發(fā)表于 07-30 08:00 ?18次下載
    SV601187的<b class='flag-5'>詳細資料</b>合集包括了電路圖,原理圖和介紹等<b class='flag-5'>詳細資料</b><b class='flag-5'>概述</b>

    十一個經典的濾波算法的介紹和示例程序詳細資料免費下載

    本文檔的主要內容詳細介紹的是十一個經典的濾波算法詳細資料免費下載主要內容包括了:1、限幅濾波(又稱程序判斷濾波)2、中位值濾波
    發(fā)表于 11-06 19:35 ?20次下載
    十一個經典的濾波<b class='flag-5'>算法</b>的介紹和示例程序<b class='flag-5'>詳細資料</b>免費下載

    線性系統(tǒng)的頻域分析頻率特性詳細資料免費下載

    本文檔的主要內容詳細介紹的是線性系統(tǒng)的頻域分析頻率特性詳細資料免費下載。
    發(fā)表于 11-22 08:00 ?5次下載
    線性系統(tǒng)的頻域分析頻率特性<b class='flag-5'>法</b>的<b class='flag-5'>詳細資料</b>免費下載

    5500極譜DO探頭校準及維護的資料說明

    本文檔的主要內容詳細介紹的是HACH SC200+5500 極譜DO探頭校準及維護的詳細資料免費下載。
    發(fā)表于 01-03 08:00 ?0次下載
    5500極譜<b class='flag-5'>法</b>DO探頭校準及維護的<b class='flag-5'>資料</b>說明

    單片機有哪些常用濾波算法詳細資料說明

    本文檔的主要內容詳細介紹的是單片機有哪些常用濾波算法詳細資料說明包括了:1、限幅濾波,2、中位值濾波,3、算術平均濾波
    發(fā)表于 07-29 17:36 ?4次下載
    單片機有哪些常用濾波<b class='flag-5'>算法</b><b class='flag-5'>詳細資料</b>說明

    分形插值算法詳細資料說明

    本文檔的主要內容詳細介紹的是分形插值算法詳細資料說明包括了:1.插值,2.隨機中點位移生成山,3.分形插值算法生成云和山。
    發(fā)表于 06-05 08:00 ?0次下載
    分形插值<b class='flag-5'>算法</b>的<b class='flag-5'>詳細資料</b>說明

    龍格-庫塔的MATLAB代碼及含義的詳細資料說明

    本文檔的主要內容詳細介紹的是龍格-庫塔的MATLAB代碼及含義的詳細資料說明。
    發(fā)表于 07-17 17:02 ?6次下載

    python的內置函數(shù)詳細資料概述

    本文檔的主要內容詳細介紹的是python的內置函數(shù)詳細資料概述。
    發(fā)表于 11-18 08:00 ?0次下載

    EMC HF墊圈的詳細資料概述

    本文檔的主要內容詳細介紹的是EMC HF墊圈的詳細資料概述免費下載。
    發(fā)表于 09-07 08:00 ?0次下載
    EMC HF墊圈的<b class='flag-5'>詳細資料</b><b class='flag-5'>概述</b>

    如何使用回溯實現(xiàn)網絡設計問題算法的設計

    中網絡設計問題對石油傳輸網絡最少增壓器的問題有了詳細的描述,再次,我們選用回溯來解決這個問題,并對時間復雜度進行了分析和討論。
    發(fā)表于 12-11 08:00 ?7次下載
    如何使用<b class='flag-5'>回溯</b><b class='flag-5'>法</b>實現(xiàn)網絡設計問題<b class='flag-5'>算法</b>的設計