旅行商问题动态规划matlab,旅行商问题的解法
一、動態規劃
import java.util.ArrayList;
/**
* @author xifeng.yang
*/
public class TSPEngine {
private ArrayList outputArray = new ArrayList<>();
private int dp[][]; //重疊子問題的記憶, 表示由i出發、途徑集合j中的元素、再回到起始點0的最短長度;
private int path[][]; //表示在所選路徑最優的情況下, 下一步要到達的點;
private int distance[][];
private int nPow, N;
public static long time;
public ArrayList computeTSP(int[][] inputArray, int n) {
long start = System.nanoTime();
N = n;
nPow = (int) Math.pow(2, n);
dp = new int[n][nPow];
path = new int[n][nPow];
distance = inputArray;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < nPow; j++) {
dp[i][j] = -1;
path[i][j] = -1;
}
}
/* 從i出發, 直接到達起始點0的長度. */
for (i = 0; i < n; i++) {
dp[i][0] = inputArray[i][0];
}
outputArray.add(0);
int result = tsp(0, nPow - 2);
getPath(0, nPow - 2);
outputArray.add(result);
long end = System.nanoTime();
time = (end - start) / 1000;
return outputArray;
}
/**
* 從start出發, 途徑集合set中的元素(由二進制中的非0位來表示), 再回到起始點時的最短長度, 即:
* tsp(start, set) = min{start-> {set} -> 0)}.
*
* @param start
* @param set
* @return
*/
private int tsp(int start, int set) {
int masked, mask, result = -1, temp;
if (dp[start][set] != -1) {
return dp[start][set];
} else {
for (int x = 0; x < N; x++) {
mask = nPow - 1 - (int) Math.pow(2, x);
masked = set & mask;
//過濾掉set中未置1的元素.
if (masked != set) {
temp = distance[start][x] + tsp(x, masked);
if (result == -1 || result > temp) {
//更新result的同時, 也更新path.
result = temp;
path[start][set] = x;
}
}
}
dp[start][set] = result;
return result;
}
}
private void getPath(int start, int set) {
if (path[start][set] == -1) {
return;
}
int x = path[start][set];
int mask = nPow - 1 - (int) Math.pow(2, x);
int masked = set & mask;
outputArray.add(x);
getPath(x, masked);
}
public static void main(String[] args) {
int[][] inputArray = {{0, 12, 11, 16}, {15, 0, 15, 10}, {8, 14, 0, 18}, {9, 11, 17, 0}};
TSPEngine tspEngine = new TSPEngine();
System.out.println("result:" + tspEngine.computeTSP(inputArray, 4));
}
}
模擬退火算法解決TSP問題:
思路:
參數選取,包括初始溫度、冷卻系數(coolingFactor, 一般選取0.98或0.99);
隨機選取某個旅行順序作為起始值;
開始退火過程,步驟如下:
3.1 隨機交換當前旅行順序中的兩個元素,計算出新的路徑值newEnergy,與現有的currentEnergy作對比:
① 如果newEnergy < currentEnergy,則接受新的方案;
② 如果exp((currentEnergy - newEnergy) / temperature) > Random(0, 1),則接受新的方案。temperature越大,越有可能接受較差的值。
3.2 降溫冷卻,temperature = temperature * coolingFactor。當溫度冷卻至1度以下時,結束循環,否則重復執行步驟3。
總結
以上是生活随笔為你收集整理的旅行商问题动态规划matlab,旅行商问题的解法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晚上搞什么副业能挣钱 选择真的很多大家都
- 下一篇: 什么是债转股