2.6.1题目描述
给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。
2.6.2程序使用说明
Java version:1.8.0_111
IDE:eclipse
eclipse右键 run,在控制台查看结果
2.6.3简要分析和设计
旅行商问题使用分支界限法求解。将问题抽象成图的问题。城市作为图的一个点,城市与城市之间的通路和距离作为图的连通线段和权重。举例说明,如果存在如下的图。
图四 图(来源于算法设计与分析基础第三版)
用分支界限法解上面图的最短路径,则需要解决一个最小下界的问题,这里用如下公式来计算下界。
公式四(来源于算法设计与分析基础第三版)
此处举例说明S,当一条路径都未确定时,上面图四中S=(1+3+3+6+1+2+3+5+2+3)
当假设边a e确定后,S=(1+8+3+6+1+2+4+6+2+8),对于此题可以确定先经过b再经过c,通过以上分析可以可以得到上面例子的空间树。如图5
图5 旅行商空间树(来源于算法设计与分析基础第三版)
可以通过程序实现分支界限法
2.6.4测试用例
测试用例一:
权重矩阵:{ {0,3,1,5,8},{3,0,6,7,9},
{1,6,0,4,2},{5,7,4,0,3},
{8,9,2,3,0}}
点:{ 'a','b','c','d','e'}
结果:
路径长度:16
路径经过顺序:a b d e c a
2.6.5源代码
目录结构:
package three.three;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
/**
* 求最短路径
* @author ym
*
*/
public class ShortestPath {
//记录路径
int[][] path=null;
HashMap<Character,Integer> chIntMap = null;
//记录状态列点表
PriorityQueue<Node> nodeQueue = null;
//构造比较函数
Comparator<Node> comparator = new Comparator<Node>() {
public int compare(Node o1, Node o2) {
return o1.getLb()-o2.getLb();
};
};
public ShortestPath(int[][] path,HashMap<Character,Integer> chIntMap){
this.path=path;
this.chIntMap = chIntMap;
this.nodeQueue = new PriorityQueue<Node&g