一、问题描述

旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP难问题,在运筹学和理论计算机科学中非常重要。

二、解决思路

这个问题有点像地图着色问题但是是不一样的,地点之间是带权路径,地图着色相当于是节点的选择,顺序无关性,这个是顺序有关性,求解选择哪个节点,哪一个则是节点的路径选择问题。首先定义解空间。

三、代码

public class TravelPlan {

public static void main(String[] args) {

int[][] adjacencyMartix = new int[][]{

{-1, 3, -1, 8, 9},

{3, -1, 3, 10, 5},

{-1, 3, -1, 4, 3},

{8, 10, 4, -1, 20},

{9, 5, 3, 20, -1}};

Scanner scanner = new Scanner(System.in);

int originNode = scanner.nextInt();

int[] currentValueStatus = new int[]{-1, -1, -1, -1, -1};

// 设置源点已经被访问过

currentValueStatus[originNode - 1] = 1;

int[] bestValueStatus = new int[adjacencyMartix.length];

System.out.println(calc(adjacencyMartix, originNode - 1, currentValueStatus, bestValueStatus, Integer.MAX_VALUE, 0, 1, originNode - 1));

System.out.println(Arrays.toString(bestValueStatus));

}

/**

* 进行计算

*

* @param adjacencyMatrix 记录城市间关系

* @param lastCityIndex 记录上个城市的索引 也是起始城市节点

* @param currentValue 此路径城市到访状态维护

* @param bestValueStatus 最好结果城市最好路径记录

* @param bestValue 最好的结果

* @param currentValue 当前结果值

* @param loopIndex 第几次路径选择

* @param originNode 起始节点因为最后要回到起始节点所以需要记录下

*/

public static Integer calc(int[][] adjacencyMatrix, int lastCityIndex, int[] currentValueStatus, int[] bestValueStatus, int bestValue, int currentValue, int loopIndex, int originNode) {

/**

* 收集 到达链路的终点

*/

if (loopIndex > currentValueStatus.length - 1) {

//最后一个城市和起始点有边

if (currentValue + adjacencyMatrix[lastCityIndex][originNode] < bestValue && adjacencyMatrix[lastCityIndex][originNode] != -1) {

// 记录最优的解 再加上回到原点的值

bestValue = currentValue + adjacencyMatrix[lastCityIndex][originNode];

for (int j = 0; j < currentValueStatus.length; j++) {

bestValueStatus[j] = currentValueStatus[j];

}

}

return bestValue;

} else {

//搜索 这里如果用交换的算法可以较少遍历 也就是将状态维护为到访区间和未到访区间 KISS原则怎么容易看怎么来

// 这里由于起源节点已经被设置为访问过,所以不会再访问

for (int j = 0; j < adjacencyMatrix.length; j++) {

// 起始节点最后到达叶子处理

if (j == originNode) {

continue;

}

// 上一节点和当前节点是通路并且 到达当前节点后的值还是小于最优值才可以继续 当前节点没有被访问过

if ((adjacencyMatrix[lastCityIndex][j] != -1 && adjacencyMatrix[lastCityIndex][j] + currentValue < bestValue && currentValueStatus[j] == -1)) {

// 标记为已经到访 -.- loop代表访问的第几个节点

loopIndex += 1;

currentValueStatus[j] = loopIndex;

// 值累加 前一个节点到当前节点的距离

currentValue += adjacencyMatrix[lastCityIndex][j];

// 递归向下走 j节点变成前一个几点

bestValue = calc(adjacencyMatrix, j, currentValueStatus, bestValueStatus, bestValue, currentValue, loopIndex, originNode);

//回溯当前节点累加的值

currentValueStatus[j] = -1;

loopIndex -= 1;

currentValue -= adjacencyMatrix[lastCityIndex][j];

}

}

return bestValue;

}

}

}

四、优化空间

回溯法解旅行商问题java,回溯法-旅行商问题相关推荐

  1. 回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园

    第一次编写,格式写的比较混乱.先把源码上来吧.这个源码是模仿教材上的(本人学生一枚 ).分析过程在下面. #include using namespace std; class Traveling{ ...

  2. java穷举法解方程_枚举法(穷举法)_Java语言程

    枚举法(穷举法)_Java语言程 3.5.1 枚举法(穷举法) 枚举法就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. [例3-20] 百元买百鸡:用一百元钱买一百只鸡.已知公鸡5元/ ...

  3. python回溯法解9*9数独

    文章目录 前言 一.回溯法解数独代码 总结 前言 看了labuladong算法小抄里的回溯法,照着模板,加入自己的理解,用python做了个解9*9数独的回溯法,. 一.回溯法解数独代码 直接上代码: ...

  4. 回溯法,回溯法解装载问题

    一.回溯法有"通用的解题法"之称,可以系统的搜索一个问题的所有解或任一解.它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树.算法搜索至解空间树的任一节点时,先判断该节点 ...

  5. Java回溯详解(组合、排列、装载问题)

    回溯算法有"通用的解题法"之称,但是往往在学习的过程中会有这样几个困惑: 1.无法理解其精髓之要 2.理解之后不能写出代码 3.能写出代码之后又不能推广 本篇文章将详细讲解回溯的思 ...

  6. python回溯算法_什么是回溯法,Python解法交流?

    只有去多做题,才能慢慢掌握.力扣​leetcode-cn.com LeetCode 上的解释 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...

  7. 回溯法基本思想_LeetCode--回溯法心得

    这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能解决这类回溯法的套路出来,方便以后快速解决此类题目.于是我在网上找了两个很经典的回溯法题目--八皇 ...

  8. c语言 用回溯算法解决01背包问题,回溯法解决01背包问题

    <回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...

  9. 回溯算法解子集、组合、排序

    转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...

最新文章

  1. opencv的K近邻算法
  2. 计算机硬件系统设计mooc,计算机硬件系统设计MOOC答案
  3. 线程的退出 java_(转)Java结束线程的三种方法
  4. Python virtualenv激活与退出虚拟环境
  5. 知道接口地址 如何传数据_如何选显示器连接线?四种主流接口要知道
  6. influxdb mysql对比_InfluxDB读写性能测试
  7. 贝叶斯优化混合核极限学习机回归预测
  8. PS中预设画笔并为路径描边
  9. 计算机网络原理恺撒密码/列置密码总结
  10. JS判断数组是否包含某个元素
  11. 行人重识别论文阅读5-基于换衣服的行人重识别
  12. win7调整屏幕亮度_win7系统设置护眼色后,不生效怎么办?
  13. C++引用、取地址符
  14. 计算机课程成绩认定管理办法,全日制普通本科生课程学分成绩对接认定管理办法...
  15. PS批量处理批量裁减不同尺寸图片教程(超详细教程 非常实用)-photoshop
  16. Q1财报之后,美团继续看未来
  17. STM32学习笔记1(初识STM32)
  18. 酷睿i7 1165g7相当于什么水平 i71165g7属于哪个档次
  19. 手把手教你扩展个人微信号(2)
  20. 多项式的余数定理及其应用

热门文章

  1. 显示画面 大华摄像头_大华乐橙新品发布会:首发3D结构光AI人脸识别视频锁
  2. preg_match与preg_match_all区别
  3. 小米盒子 android 版本,小米盒子刷成原生安卓系统操作步骤详解
  4. 关于共享单车的一点思考
  5. delphi 操作Excel插入图片
  6. DDR布线规则与过程——见过最简单的DDR布线教程
  7. EfficientDeRain
  8. 从网页采集图片,生成PPT文件
  9. python高德地图api调用实例_Python 利用高德地图api实现经纬度与地址的批量转换...
  10. 细读:关于搜索引擎及其开发,我的疑问和思考