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 相关文章推荐
简单的无缝滚动程序-仅几行代码
May 08 Javascript
js使用函数绑定技术改变事件处理程序的作用域
Dec 26 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
Oct 24 Javascript
JS cookie中文乱码解决方法
Jan 28 Javascript
Bootstrap每天必学之日期控制
Mar 07 Javascript
如何利用模板将HTML从JavaScript中抽离
Oct 08 Javascript
bootstrap fileinput 插件使用项目总结(经验)
Feb 22 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
Nov 15 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
Aug 30 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
基于JS实现视频上传显示进度条
May 12 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
PHP入门学习笔记之一
2010/10/12 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
JavaScript生成的动态下雨背景效果实现方法
2015/02/25 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Bootstrap零基础学习第一课之模板
2016/07/18 Javascript
用AngularJS的指令实现tabs切换效果
2016/08/31 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Python with用法实例
2015/04/14 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
python字典DICT类型合并详解
2017/08/17 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
广告学专业自荐信范文
2014/02/24 职场文书
铁路安全事故反思
2014/04/26 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
民事上诉状范文
2015/05/22 职场文书
2015个人年度工作总结范文
2015/05/28 职场文书
公司员工管理制度
2015/08/04 职场文书
社区服务活动感想
2015/08/11 职场文书