回溯法解旅行商问题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,回溯法-旅行商问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab特征检测,sift特征检测的
- 下一篇: 怎么申请icp备案?怎么查询icp备案是