分支界限演算法 旅行商問題2

2021-10-02 08:37:10 字數 2387 閱讀 5504

假期 2020.01

.22

見回溯演算法–旅行商問題1

此篇採用分支界限演算法解決該問題,相比較前一篇的回溯演算法–旅行商問題1,此處使用bfs搜尋加優先佇列的方式。

注:優先佇列容器與佇列一樣,只能從隊尾插入元素,從隊首刪除元素。但是它有乙個特性,就是佇列中最大的元素總是位於隊首,所以出隊時,並非按照先進先出的原則進行,而是將當前佇列中最大的元素出隊。而此處設定最小的每次先出佇列。

設定二維陣列儲存關係

初始化解向量,即選擇方案都為零,並且將最優值賦值為無窮

定義優先佇列:

int operator <

(const node& a,

const node& b)

//優先佇列,從小到大

判定結束條件,所有景點都走完時

當前距離已經大於最優值時,直接跳過該次迴圈,執行下乙個景點的安排

if

(current_node.current_dist >= best_distance)

//不滿足最優值時

continue

;

當前距離可能存在最優解時,將符合要求的各個景點依次放入佇列中

重複步驟4到6的操作直到結束即可。

#include

#include

#include

#include

using namespace std;

constexpr auto max_size =

0x7fffffff

;double map[

100]

[100];

//鄰接矩陣

double best_distance = max_size;

//當前最優路徑長度

int choiced[

100]

;//記錄當前最優路徑

int vertex_count, edge_count;

//景點個數,邊數

struct node

node

(double _current_dist,

int _id)};

int operator <

(const node& a,

const node& b)

//優先佇列,從小到大

void

bfs();

for(

int i =

1; i <= vertex_count; i++

)//初始化

new_node.choiced[i]

= i;

q.push

(new_node)

;//壓入乙個初始節點

while

(!q.

empty()

)//佇列不為空時

}continue;}

else

if(current_node.current_dist >= best_distance)

//大於最優值

continue

;for

(int j = current; j <= vertex_count; j++);

for(

int i =

1; i <= vertex_count; i++

) new_node.choiced[i]

= current_node.choiced[i]

;swap

(new_node.choiced[current]

, new_node.choiced[j]);

q.push

(new_node);}

}}}return;}

intmain()

bfs();

cout <<

"旅行的最短距離是:"

<< best_distance << endl;

cout <<

"選擇方案是: "

實現有所參考《趣學演算法》

旅行商問題

旅行商問題 乙個商人從城市a出發,訪問bcde等城市各一次最後回到a,問行程如何使得路程或費用最低。這是個np 非多項式可解,但一般驗證容易 問題,假設中間有4個城市,那麼全排列為4!24種,沒有很好的演算法,基本只能窮舉了。class vertex 4 public class lianxi pu...

旅行商問題

一銷售商從n個城市中的某一城市出發,不重複地走完其餘n 1個城市並回到原出發點,在所有可能的路徑中求出路徑長度最短的一條。本題假定該旅行商從第1個城市出發。對每個測試例,第1行有兩個整數 n 4 n 10 和m 4 m 20 n是結點數,m是邊數。接下來m行,描述邊的關係,每行3個整數 i,j le...

旅行商問題

題意 旅行商問題,即從 1 走到 n 不重不漏,然後求最小距離。題解 狀態壓縮dp,顯然的是,要從某種狀態到某種狀態並且合法,然後取 min 然後全部遍歷。所以設 dp 的含義是,最後乙個點是 i 點,然後走過了 j 這個 01 串的有 1 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 ...