js回溯法计算最佳旅行线路

假如有 A,B,C,D四个城市,他们之间的距离用 G[V][E] 表示,为 无穷大,则表示两座城市不相通

现在从计算从某一个城市出发,把所有的城市不重复旅行一次,最短路径

其中G为: (Infinity表示城市不相通)

	var g = [
		[Infinity,3       ,Infinity,8		,9],
		[  3     ,Infinity,3	   ,10		,5],
		[Infinity, 3      ,Infinity,4		,3],
		[8       ,10      ,4       ,Infinity,20],
		[9       ,5       ,3       ,20		,Infinity]
	]

  

分析,如果确定从 A城市开始,则需要探索 剩下的几个城市,剩下的几个城市再往里探索,如果失败了,就废弃,回到之前的状态

var g = [
		[Infinity,3       ,Infinity,8		,9],
		[  3     ,Infinity,3	   ,10		,5],
		[Infinity, 3      ,Infinity,4		,3],
		[8       ,10      ,4       ,Infinity,20],
		[9       ,5       ,3       ,20		,Infinity]
	]

	var x = [0,1,2,3,4]; //城市的编号
	var cl = 0;			 //规划过程中记录的距离
	var bestl = Infinity; //当前最优解
	var bestx = [0,0,0,0,0]; //当前最优解的路径
	//var t = 0; //当前需要到达的城市
	var n = x.length-1;
	function Traveling(t){
		if(t > n ){
			//搜索到底部,如果满足最优解则记录
			if(g[x[n]][0] < Infinity && (cl + g[x[n]][0] < bestl)){
				for(var j = 0; j <= n; j++){
					bestx[j] = x[j];
				}
				bestl = cl + g[x[n]][0];
			}
		}else{
			for(var j =  t ; j <= n; j++){
				if(g[x[t-1]][x[j]] < Infinity && (cl + g[x[t-1]][x[j]] < bestl )){
					swap(x,t,j);				//交换位置,将j点作为 当前需要到达的城市
					cl = cl + g[x[t-1]][x[t]];  //加上选中的点
					Traveling(t+1); 			//搜索下一下节点
					cl = cl - g[x[t-1]][x[t]];  //还原搜索之前
					swap(x,t,j);				//还原
				}
			}
		}
	}
	
	function swap(arr,x,y){
		var temp = arr[x];
		arr[x] = arr[y];
		arr[y] = temp;
	}
	
	Traveling(1);
	console.log(bestx);
	console.log(bestl)

  

原文地址:https://www.cnblogs.com/muamaker/p/10169526.html