回溯法解旅行商问题java,回溯法-旅行商问题
一、问题描述
旅行推销员问题(英语: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,回溯法-旅行商问题相关推荐
- 回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园
第一次编写,格式写的比较混乱.先把源码上来吧.这个源码是模仿教材上的(本人学生一枚 ).分析过程在下面. #include using namespace std; class Traveling{ ...
- java穷举法解方程_枚举法(穷举法)_Java语言程
枚举法(穷举法)_Java语言程 3.5.1 枚举法(穷举法) 枚举法就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. [例3-20] 百元买百鸡:用一百元钱买一百只鸡.已知公鸡5元/ ...
- python回溯法解9*9数独
文章目录 前言 一.回溯法解数独代码 总结 前言 看了labuladong算法小抄里的回溯法,照着模板,加入自己的理解,用python做了个解9*9数独的回溯法,. 一.回溯法解数独代码 直接上代码: ...
- 回溯法,回溯法解装载问题
一.回溯法有"通用的解题法"之称,可以系统的搜索一个问题的所有解或任一解.它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树.算法搜索至解空间树的任一节点时,先判断该节点 ...
- Java回溯详解(组合、排列、装载问题)
回溯算法有"通用的解题法"之称,但是往往在学习的过程中会有这样几个困惑: 1.无法理解其精髓之要 2.理解之后不能写出代码 3.能写出代码之后又不能推广 本篇文章将详细讲解回溯的思 ...
- python回溯算法_什么是回溯法,Python解法交流?
只有去多做题,才能慢慢掌握.力扣leetcode-cn.com LeetCode 上的解释 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就 ...
- 回溯法基本思想_LeetCode--回溯法心得
这两天在刷LeetCode37题解数独时,被这个回溯法折腾的不要不要的,于是我疼定思疼发誓一定要找个能解决这类回溯法的套路出来,方便以后快速解决此类题目.于是我在网上找了两个很经典的回溯法题目--八皇 ...
- c语言 用回溯算法解决01背包问题,回溯法解决01背包问题
<回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...
- 回溯算法解子集、组合、排序
转载labuladong:力扣 代码方面,回溯算法的框架: result = [] def backtrack(路径, 选择列表):if 满足结束条件:result.add(路径)returnfor ...
最新文章
- opencv的K近邻算法
- 计算机硬件系统设计mooc,计算机硬件系统设计MOOC答案
- 线程的退出 java_(转)Java结束线程的三种方法
- Python virtualenv激活与退出虚拟环境
- 知道接口地址 如何传数据_如何选显示器连接线?四种主流接口要知道
- influxdb mysql对比_InfluxDB读写性能测试
- 贝叶斯优化混合核极限学习机回归预测
- PS中预设画笔并为路径描边
- 计算机网络原理恺撒密码/列置密码总结
- JS判断数组是否包含某个元素
- 行人重识别论文阅读5-基于换衣服的行人重识别
- win7调整屏幕亮度_win7系统设置护眼色后,不生效怎么办?
- C++引用、取地址符
- 计算机课程成绩认定管理办法,全日制普通本科生课程学分成绩对接认定管理办法...
- PS批量处理批量裁减不同尺寸图片教程(超详细教程 非常实用)-photoshop
- Q1财报之后,美团继续看未来
- STM32学习笔记1(初识STM32)
- 酷睿i7 1165g7相当于什么水平 i71165g7属于哪个档次
- 手把手教你扩展个人微信号(2)
- 多项式的余数定理及其应用
热门文章
- 显示画面 大华摄像头_大华乐橙新品发布会:首发3D结构光AI人脸识别视频锁
- preg_match与preg_match_all区别
- 小米盒子 android 版本,小米盒子刷成原生安卓系统操作步骤详解
- 关于共享单车的一点思考
- delphi 操作Excel插入图片
- DDR布线规则与过程——见过最简单的DDR布线教程
- EfficientDeRain
- 从网页采集图片,生成PPT文件
- python高德地图api调用实例_Python 利用高德地图api实现经纬度与地址的批量转换...
- 细读:关于搜索引擎及其开发,我的疑问和思考