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