假期 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 的點。然後要想的是順序問題,那麼我們必然是從上乙個點推到 ...