js回溯法计算最佳旅行线路代码实例


Posted in Javascript onSeptember 11, 2019

回溯法

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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 Javascript
Raphael带文本标签可拖动的图形实现代码
Feb 20 Javascript
使用不同的方法结合/合并两个JS数组
Sep 18 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
JavaScript获取当前cpu使用率的方法
Dec 15 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
Jun 04 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
vue中created和mounted的区别浅析
Aug 13 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
Node.js API详解之 console模块用法详解
May 12 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 Javascript
vue+echarts实现动态折线图的方法与注意
Sep 01 Javascript
layer更改皮肤的实现方法
Sep 11 #Javascript
node 解析图片二维码的内容代码实例
Sep 11 #Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
Sep 11 #Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 #Javascript
JS中封装axios来管控api的2种方式
Sep 11 #Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 #Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
Sep 11 #Javascript
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP使用者状态管理功能的应用
2006/10/09 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
Symfony查询方法实例小结
2017/06/28 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
js常用代码段整理
2011/11/30 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
页面点击小红心js实现代码
2018/05/26 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
django如何自己创建一个中间件
2019/07/24 Python
django创建超级用户过程解析
2019/09/18 Python
用Python解数独的方法示例
2019/10/24 Python
Python创建数字列表的示例
2019/11/28 Python
python绘制动态曲线教程
2020/02/24 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
python的launcher用法知识点总结
2020/08/07 Python
《在山的那边》教学反思
2014/02/23 职场文书
小学班主任评语大全
2014/04/23 职场文书
大学生入党群众意见书
2015/06/02 职场文书
国情备忘录观后感
2015/06/04 职场文书
2015军训通讯稿大全
2015/07/18 职场文书
小学班级管理心得体会
2016/01/07 职场文书