回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园
第一次編寫,格式寫的比較混亂。先把源碼上來吧。這個源碼是模仿教材上的(本人學生一枚
)。分析過程在下面。
#include
using namespace std;
class Traveling{
private:
friend int TSP(int**,int*,int,int);
void backTrack(int i);
int city;
int* x;//當前旅行策略
int* bestx;//最優旅行策略
int** a;
int current_cost;//當前代價
int bestc;//存放最小代價值
int NoEdge;//不連通的標志,這里設為-1
};
void Traveling::backTrack(int i)
{
if(i==city){
if(a[x[city-1]][x[city]]!=NoEdge &&
a[x[city]][1]!=NoEdge &&
(current_cost+a[x[city-1]][x[city]]+a[x[city]][1]
{
bestc=current_cost+a[x[city-1]][x[city]]+a[x[city]][1];
for(int j=1;j<=city;j++)
bestx[j]=x[j];
}
}else{
for(int j=1;j<=city;j++)
if(a[x[i-1]][x[j]]!=NoEdge &&
(current_cost+a[x[i-1]][x[i]]
{
swap(x[i],x[j]);
current_cost+=a[x[i-1]][x[i]];
backTrack(i+1);
current_cost-=a[x[i-1]][x[i]];
swap(x[i],x[j]);
}
}
}
int TSP(int** a,int* bestPath,int city,int NoEdge)
{
Traveling Y;
Y.x=new int[city+1];
for(int i=1;i<=city;i++)
Y.x[i]=i;
Y.a=a;
Y.city=city;
Y.bestc=NoEdge;
Y.bestx=bestPath;
Y.current_cost=0;
Y.NoEdge=NoEdge;
Y.backTrack(2);
delete[] Y.x;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
cout<
}
cout<
}
cout<
for(int i=1;i<=city;i++)
{
cout<
}
cout<
return Y.bestc;
}
void main()
{
int **map;
int * bestpath;
map = new int*[5];
for(int i=0;i<5;i++)
{
map[i] = new int[5];
}
int a[5][5]=
{0,1,2,3,4,
1,-1,30,6,4,
2,30,-1,5,10,
3,6,5,-1,20,
4,4,10,20,-1};
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
map[i][j] = a[i][j];
}
}
bestpath = new int[5];
memset(bestpath,0,sizeof(bestpath));
cout<
}
測試數據的臨界矩陣:
0
1
2
3
4
1
0
30
6
4
2
30
0
5
10
3
6
5
0
20
4
4
10
20
0
一、回溯法解旅行商問題
(1)??????????問題重述
某銷售員要到若干城市去推銷商品,已知各城市之間的路線(或旅費)。他要選定一條從駐地出發,經過每個城市一遍,最后回到駐地的路線(即哈密頓回路),使總的路程(或總旅費)最小。給定一個有n個頂點V={1,2,……,n}的帶權圖G=(V,E),旅行商問題就是要在圖G中找出一條有最小費用的周游路線(哈密頓回路,即經過V中每一個頂點的簡單回路)。
(2)
旅行商問題的解空間是一顆排列樹。對于排列樹的回溯搜索與生成1,2,3,……,n的所有列的遞歸算法Perm類似。開始時x=[1,2,…,n],則相應的排列樹由x[1:n]的所有排列構成。在backTrack函數中算法的主要流程可以歸結如下:
①?????i=n?時,當前擴展結點是排列樹的葉節點的父節點。此時算法檢測圖G是否存在一條從頂點x[n-1]到頂點x[n]的邊和一條從頂點x[n]到頂點1的邊。如果這兩條邊都存在,則找到一條回路。此時算法還需要判斷這條回路的代價是否優于已找到的當前最優回路的代價。如果是則更新當前解。
②?????i
(3)????? 運行結果
旅行策略13241,最小旅行代價25
總結
以上是生活随笔為你收集整理的回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片采集器-网页图片批量采集器免费
- 下一篇: 键盘锁定程序