某售货员到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条路线,经过每个城市一遍最后回到驻地的路线,使得总的路程(或总旅费)最小(默认从1号城市开始)。
输入:城市的数目n,城市a,b,以及其之间的路程d。
输出:最短的路程,最短的路径方案。
运行结果:
旅行售货员问题的解空间是一颗排列数,对于排列数的回溯搜索与生成1,2,...,n的所有排列的递归算法Perm类似。开始时x=[1,2,...n]。则相应的排列树由x[1:n]的所有排列构成。
在递归算法Backtrack中,当i=n时,当前扩展结点是排列树的叶结点的父结点。此时算法检测图G是否存在一条从顶点x[n-1]到顶点x[n]的边和一条从顶点x[n]到顶点1的边,如果这两条边都存在,则找到一条旅行售货员回路。此时,算法还需判断这条回路的费用是否优于已找到的当前最优回路的费用bestc。如果是,则必须更新当前最优值bestc和当前最优解bestx。
当i<n时,当前扩展结点位于排列数的第i-1层,图G中存在从顶点x[i-1]到顶点x[i]的边时,x[1:i]构成图G的一条路径,且当x[1:i]的费用小于当前最优值时算法进入排列树的第i层,