回溯法 分支限界法解決旅行商TSP問題

2021-10-02 10:18:55 字數 3113 閱讀 5274

分支限界法解tsp問題(廣度優先)

結果分析

旅行商從駐地出發,經過每個需要訪問的城市一次且只有一次,並最終返回出發點。如何安排路線,使旅行總路程最短?即求解最短哈密頓迴路。

以深度優先的方式,從根節點開始,依次擴充套件樹節點,直到達到葉節點——搜尋過程中動態產生解空間

;//最優路徑

int x[num+1]

;double cw=

0.0,bestw=

99999.0

;//cw是當前路徑值,bestw是最優路徑值

double

**w;

//距離矩陣

int count=0;

//計算節點數

minheapnode* head =0;

/*堆頭*/

minheapnode* fq =0;

/*堆第乙個元素*/

minheapnode* lq =0;

/*堆最後乙個元素*/

//問題的上界

minheapnode* head =0;

/*堆頭*/

minheapnode* fq =0;

/*堆第乙個元素*/

minheapnode* lq =0;

/*堆最後乙個元素*/

void

swap

(int i,

int j)

intdeletemin

(minheapnode*

&e)//從堆中取出下乙個節點

intinsert

(minheapnode* hn)

//在堆中插入節點

else

else

tmp = tmp->next;}}

if(tmp ==

null)}

return0;

}void

up_cost

(int k,

int n)

}else

}for

(int i=k+

1;i<=n;i++)}

}}void

low_cost

(minheapnode *p,

int n)

p->lb+=min;

min=noedge;*/

for(

int i=p->s+

1;ip->lb+

=min;

min=noedge;

for(

int j=

0;j) p->lb+

=min;

min=noedge;

} p->lb/=2

;if(p->s==n-1)

p->lb+

=w[p->x[n-1]

][p->x[0]

];else

p->lb+

=min;

min=noedge;

}/*for(int i=0;ix[i]);

printf("\n%lf\n",p->lb);*/

}void

bbtsp

(int v,

int n)

//回溯法求解

else

}else

}free

(e);

}//完成結點擴充套件

deletemin

(e);

//取下一擴充套件結點

if(e ==

null

)break

;//堆已空}if

(bestw == noedge)

return

;//無迴路

明顯可以看出分支限界法求解所用的時間是少於回溯法的,畢竟前者設計上便是以空間換時間。回溯法的時間複雜度是o(n

!)o(n!)

o(n!

),而分支限界法的時間複雜度是o(n

2×2n

)\mathrm\left(n^ \times 2^\right)

o(n2×2

n)

回溯法 旅行商問題

給定無向圖g n,e 含有n個結點,m條邊。現在有以下定義 有乙個商人從1號結點出發,希望經過每個結點一次回到起點,並且他希望走權值最小的一條路徑。輸入第一行2個整數n,m 接下來m行,每行三個數,u,v,w表示u,v結點有一條權值為w的無向邊。如果不存在這種路徑,列印 1 否則列印兩行。第一行乙個...

回溯法與分支限界法 裝載問題

分支限界法和回溯法都屬於搜尋演算法,但是他們的搜尋策略是不同的。分支限界法 廣度優先搜尋 bfs 剪枝函式,回溯法 深度優先搜尋 dfs 剪枝函式 回溯法 找出滿足約束條件的所有解 分枝限界法 找出滿足約束條件的乙個解或特定意義下的最優解 裝載問題 有兩艘船,載重量分別是c1 c2,n個貨櫃,重量是...

回溯法與分支限界演算法

1 概念 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術...