旅行售货员问题(回溯法实现)

 本人第一次写博客,为了把自己的一些学习中遇到的困难记录下来,有需要可以一直学习。


/**
 * 回溯算法
 * 
 * @author Ming
 * 
 */
public class BackTrackTest {


private static int n; // 图的顶点
private static int[] x; // 当前解
public static int[] bestx; // 当前最优解
public static int bestc; // 当前最优值
public static int cc; // 当前费用
public static int[][] a; // 图的邻接矩阵


// t表示当前深度
public static void backTrack(int t) {
if (t == n) {
System.out.println("执行了");


if (a[n - 1][n] != -1
&& a[n][1] != -1
&& (bestc == 10000 || cc + a[x[n - 1]][x[n]]
+ a[x[n]][x[1]] < bestc)) {        //到最后一层了,它需要回到原点,即第一层,所以做一些特殊处理


for (int i = 1; i <= n; i++) {
bestx[i] = x[i];
}
bestc = cc + a[x[n - 1]][x[n]] + a[x[n]][x[1]];
}


} else {
for (int i = t; i <= n; i++) {
if (a[x[t - 1]][x[i]] != -1
&& (bestc == 10000 || cc + a[x[t - 1]][x[i]] < bestc)) { // 剪枝条件
System.out.println("x[t]" + x[t]);
System.out.println("x[i]" + x[i]);
//swap(x[i],x[t]);
swap(x, t, i); // 不能直接传参数进去,不然x数组的数值是没有改变的(本人一开始就按参数传进去,结果没发生改变)
System.out.println("x[t]" + x[t]);
System.out.println("x[i]" + x[i]);
cc += a[x[t - 1]][x[t]]; // 已经交换了
backTrack(t + 1);
cc -= a[x[t - 1]][x[t]];
swap(x, t, i);
}
}


}


}


// 交换函数
private static void swap(int[] x, int i, int j) {
int temp = x[i];
x[i] = x[j];
x[j] = temp;
}


public static void main(String[] args) {
n = 4;
x = new int[] { 0, 1, 2, 3, 4 };
bestx = new int[n + 1];
bestc = 10000;
cc = 0;
a = new int[][] { { 0, 0, 0, 0, 0 }, { 0, -1, 30, 6, 4 },
{ 0, 30, -1, 5, 10 }, { 0, 6, 5, -1, 20 }, { 0, 4, 10, 20, -1 } };
backTrack(2); // 第一层已经确定了
System.out.println(bestc);
for (int i = 1; i <= n; i++) {
System.out.print(bestx[i] + " ");
}
}
}

你可能感兴趣的:(旅行售货员问题(回溯法实现))