日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园

發布時間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法解旅行商问题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,回溯法解旅行商问题 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。