旅行售货员问题——分支限界法实现
(1)题目需求分析
某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小。
旅行售货员问题的解空间树是一颗排序树。与前面关于子集树的讨论类似,实现对排列树搜索的优先队列式分支限界法也可以用两种不同的实现方式。一种是仅使用一个优先队列来存储活结点。优先队列中的每个活结点都存储从根到该活结点的相应路径。另一种是用优先队列来存储活结点,并同时存储当前已构造出的部分排列树。在这种方式下,优先队列中的活结点不必再存储从根到该活结点的相应路径,这条路径可在必要时从存储的部分排列树中获得。
(2)程序功能代码(JAVA实现):
public class BBTSP {
float[][] a;//图G的邻接矩阵
public BBTSP(float[][] a){
this.a=a;
}
public static class HeapNode implements Comparable{
float lcost;//子树费用的下界
float cc;//当前费用
float rcost;//x[s:n-1]中顶点最小出边费用和
int s;//根节点到当前节点的路径为x[0:s]
int[] x;//需要进一步搜索的顶点是x[s+1:n-1]
//构造方法
public HeapNode(float lc,float ccc,float rc,int ss,int[] xx){
lcost=lc;
cc=ccc;
s=ss;
x=xx;
}
public int compareTo(Object x){
float xlc=((HeapNode) x).lcost;
if(lcost<xlc) r