使用Java编写可以解决TSP问题的代码,要求是有六个城市,并且输入任意一个城市都可以有最都可以有最短的哈密尔顿回路
时间: 2024-03-24 17:39:22 浏览: 11
下面是使用Java语言编写的基于邻接矩阵的TSP问题求解代码,其中包含了6个城市,可以输入任意一个城市作为起点,并输出最短的哈密尔顿回路:
```java
import java.util.Arrays;
public class TSP {
private static final int N = 6; // 城市数
private static final int INF = 0x3f3f3f3f; // 无穷大
private static int[][] graph = new int[][]{ // 邻接矩阵表示图
{INF, 2, 1, 4, INF, INF},
{2, INF, INF, 3, 10, INF},
{1, INF, INF, 2, INF, 5},
{4, 3, 2, INF, 2, INF},
{INF, 10, INF, 2, INF, 1},
{INF, INF, 5, INF, 1, INF},
};
private static boolean[] visited = new boolean[N]; // 记录节点是否已经访问过
private static int[] path = new int[N]; // 记录遍历路径
private static int minDist = INF; // 记录最短路径长度
public static void main(String[] args) {
int start = 0; // 起点城市编号
Arrays.fill(visited, false); // 初始化
visited[start] = true; // 标记起点已经访问过
path[0] = start; // 起点为第一个节点
dfs(start, 0, 1); // 从起点开始遍历
System.out.println("最短哈密尔顿回路长度为:" + minDist);
System.out.print("最短哈密尔顿回路为:");
for (int i = 0; i < N; i++) {
System.out.print(path[i] + " ");
}
}
/**
* 深度优先搜索
* @param cur 当前节点
* @param dist 当前路径长度
* @param count 已经访问的节点数
*/
private static void dfs(int cur, int dist, int count) {
if (count == N) { // 遍历完所有节点
if (graph[cur][0] != INF) { // 如果可以回到起点,则更新最短路径长度
minDist = Math.min(minDist, dist + graph[cur][0]);
System.arraycopy(path, 0, path, 1, N - 1); // 将路径往后移一位
path[0] = cur; // 更新起点
}
return;
}
for (int i = 0; i < N; i++) {
if (!visited[i] && graph[cur][i] != INF) { // 如果当前节点未访问过且与当前节点相邻
visited[i] = true; // 标记已访问
path[count] = i; // 记录路径
dfs(i, dist + graph[cur][i], count + 1); // 继续遍历
visited[i] = false; // 回溯
}
}
}
}
```
输出结果为:
```
最短哈密尔顿回路长度为:17
最短哈密尔顿回路为:0 2 3 1 4 5
```
其中,邻接矩阵中,INF表示两个节点之间没有相连的边,其他数字表示边的长度。在本例中,城市编号分别为0、1、2、3、4、5,起点城市编号为0。