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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

回溯法解旅行商问题java,回溯法-旅行商问题

發布時間:2024/1/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法解旅行商问题java,回溯法-旅行商问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、問題描述

旅行推銷員問題(英語:Travelling salesman problem, TSP)是這樣一個問題:給定一系列城市和每對城市之間的距離,求解訪問每一座城市一次并回到起始城市的最短回路。它是組合優化中的一個NP難問題,在運籌學和理論計算機科學中非常重要。

二、解決思路

這個問題有點像地圖著色問題但是是不一樣的,地點之間是帶權路徑,地圖著色相當于是節點的選擇,順序無關性,這個是順序有關性,求解選擇哪個節點,哪一個則是節點的路徑選擇問題。首先定義解空間。

三、代碼

public class TravelPlan {

public static void main(String[] args) {

int[][] adjacencyMartix = new int[][]{

{-1, 3, -1, 8, 9},

{3, -1, 3, 10, 5},

{-1, 3, -1, 4, 3},

{8, 10, 4, -1, 20},

{9, 5, 3, 20, -1}};

Scanner scanner = new Scanner(System.in);

int originNode = scanner.nextInt();

int[] currentValueStatus = new int[]{-1, -1, -1, -1, -1};

// 設置源點已經被訪問過

currentValueStatus[originNode - 1] = 1;

int[] bestValueStatus = new int[adjacencyMartix.length];

System.out.println(calc(adjacencyMartix, originNode - 1, currentValueStatus, bestValueStatus, Integer.MAX_VALUE, 0, 1, originNode - 1));

System.out.println(Arrays.toString(bestValueStatus));

}

/**

* 進行計算

*

* @param adjacencyMatrix 記錄城市間關系

* @param lastCityIndex 記錄上個城市的索引 也是起始城市節點

* @param currentValue 此路徑城市到訪狀態維護

* @param bestValueStatus 最好結果城市最好路徑記錄

* @param bestValue 最好的結果

* @param currentValue 當前結果值

* @param loopIndex 第幾次路徑選擇

* @param originNode 起始節點因為最后要回到起始節點所以需要記錄下

*/

public static Integer calc(int[][] adjacencyMatrix, int lastCityIndex, int[] currentValueStatus, int[] bestValueStatus, int bestValue, int currentValue, int loopIndex, int originNode) {

/**

* 收集 到達鏈路的終點

*/

if (loopIndex > currentValueStatus.length - 1) {

//最后一個城市和起始點有邊

if (currentValue + adjacencyMatrix[lastCityIndex][originNode] < bestValue && adjacencyMatrix[lastCityIndex][originNode] != -1) {

// 記錄最優的解 再加上回到原點的值

bestValue = currentValue + adjacencyMatrix[lastCityIndex][originNode];

for (int j = 0; j < currentValueStatus.length; j++) {

bestValueStatus[j] = currentValueStatus[j];

}

}

return bestValue;

} else {

//搜索 這里如果用交換的算法可以較少遍歷 也就是將狀態維護為到訪區間和未到訪區間 KISS原則怎么容易看怎么來

// 這里由于起源節點已經被設置為訪問過,所以不會再訪問

for (int j = 0; j < adjacencyMatrix.length; j++) {

// 起始節點最后到達葉子處理

if (j == originNode) {

continue;

}

// 上一節點和當前節點是通路并且 到達當前節點后的值還是小于最優值才可以繼續 當前節點沒有被訪問過

if ((adjacencyMatrix[lastCityIndex][j] != -1 && adjacencyMatrix[lastCityIndex][j] + currentValue < bestValue && currentValueStatus[j] == -1)) {

// 標記為已經到訪 -.- loop代表訪問的第幾個節點

loopIndex += 1;

currentValueStatus[j] = loopIndex;

// 值累加 前一個節點到當前節點的距離

currentValue += adjacencyMatrix[lastCityIndex][j];

// 遞歸向下走 j節點變成前一個幾點

bestValue = calc(adjacencyMatrix, j, currentValueStatus, bestValueStatus, bestValue, currentValue, loopIndex, originNode);

//回溯當前節點累加的值

currentValueStatus[j] = -1;

loopIndex -= 1;

currentValue -= adjacencyMatrix[lastCityIndex][j];

}

}

return bestValue;

}

}

}

四、優化空間

總結

以上是生活随笔為你收集整理的回溯法解旅行商问题java,回溯法-旅行商问题的全部內容,希望文章能夠幫你解決所遇到的問題。

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