一、动态规划

import java.util.ArrayList;

/**

* @author xifeng.yang

*/

public class TSPEngine {

private ArrayList outputArray = new ArrayList<>();

private int dp[][]; //重叠子问题的记忆, 表示由i出发、途径集合j中的元素、再回到起始点0的最短长度;

private int path[][]; //表示在所选路径最优的情况下, 下一步要到达的点;

private int distance[][];

private int nPow, N;

public static long time;

public ArrayList computeTSP(int[][] inputArray, int n) {

long start = System.nanoTime();

N = n;

nPow = (int) Math.pow(2, n);

dp = new int[n][nPow];

path = new int[n][nPow];

distance = inputArray;

int i, j;

for (i = 0; i < n; i++) {

for (j = 0; j < nPow; j++) {

dp[i][j] = -1;

path[i][j] = -1;

}

}

/* 从i出发, 直接到达起始点0的长度. */

for (i = 0; i < n; i++) {

dp[i][0] = inputArray[i][0];

}

outputArray.add(0);

int result = tsp(0, nPow - 2);

getPath(0, nPow - 2);

outputArray.add(result);

long end = System.nanoTime();

time = (end - start) / 1000;

return outputArray;

}

/**

* 从start出发, 途径集合set中的元素(由二进制中的非0位来表示), 再回到起始点时的最短长度, 即:

* tsp(start, set) = min{start-> {set} -> 0)}.

*

* @param start

* @param set

* @return

*/

private int tsp(int start, int set) {

int masked, mask, result = -1, temp;

if (dp[start][set] != -1) {

return dp[start][set];

} else {

for (int x = 0; x < N; x++) {

mask = nPow - 1 - (int) Math.pow(2, x);

masked = set & mask;

//过滤掉set中未置1的元素.

if (masked != set) {

temp = distance[start][x] + tsp(x, masked);

if (result == -1 || result > temp) {

//更新result的同时, 也更新path.

result = temp;

path[start][set] = x;

}

}

}

dp[start][set] = result;

return result;

}

}

private void getPath(int start, int set) {

if (path[start][set] == -1) {

return;

}

int x = path[start][set];

int mask = nPow - 1 - (int) Math.pow(2, x);

int masked = set & mask;

outputArray.add(x);

getPath(x, masked);

}

public static void main(String[] args) {

int[][] inputArray = {{0, 12, 11, 16}, {15, 0, 15, 10}, {8, 14, 0, 18}, {9, 11, 17, 0}};

TSPEngine tspEngine = new TSPEngine();

System.out.println("result:" + tspEngine.computeTSP(inputArray, 4));

}

}

模拟退火算法解决TSP问题:

思路:

参数选取,包括初始温度、冷却系数(coolingFactor, 一般选取0.98或0.99);

随机选取某个旅行顺序作为起始值;

开始退火过程,步骤如下:

3.1 随机交换当前旅行顺序中的两个元素,计算出新的路径值newEnergy,与现有的currentEnergy作对比:

① 如果newEnergy < currentEnergy,则接受新的方案;

② 如果exp((currentEnergy - newEnergy) / temperature) > Random(0, 1),则接受新的方案。temperature越大,越有可能接受较差的值。

3.2 降温冷却,temperature = temperature * coolingFactor。当温度冷却至1度以下时,结束循环,否则重复执行步骤3。

旅行商问题动态规划matlab,旅行商问题的解法相关推荐

  1. matlab解决多旅游商问题,多旅行商问题的matlab程序

    %多旅行商问题的matlab程序 function varargout = mtspf_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog ...

  2. 旅行商问题(动态规划_爬山算法_遗传算法)

    问题描述 ​ 旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离,i,j=1, ...

  3. 一节双曲型方程基于MATLAB的求解,双曲方程基于matlab的数值解法

    <双曲方程基于matlab的数值解法>由会员分享,可在线阅读,更多相关<双曲方程基于matlab的数值解法(9页珍藏版)>请在人人文库网上搜索. 1.双曲型方程基于MATLAB ...

  4. 常微分方程数值解matlab欧拉,matlab 常微分方程数值解法 源程序代码

    matlab 常微分方程数值解法 源程序代码 所属分类:其他 开发工具:matlab 文件大小:16KB 下载次数:41 上传日期:2019-02-13 11:03:29 上 传 者:XWLYF 说明 ...

  5. 0-1背包问题动态规划模型的Python解法

    0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...

  6. 【机械仿真】基于matlab简化几何解法六轴机械臂位置规划【含Matlab源码 2128期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab简化几何解法六轴机械臂位置规划[含Matlab源码 2128期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  7. python 动态规划 旅行商问题_旅行商问题动态规划解法(python版)

    2019年华为实习生第二场笔试第二题是个旅行商问题,虽然只有5个点可以import itertools产生排列遍历5!=120情况求解(当然也可以写个递归自己生成排列),还是查了下动态规划的解法. 原 ...

  8. 【路径规划-TSP问题】基于粒子群结合蚁群算法求解旅行商问题附matlab代码

    1 内容介绍 一种基于粒子群优化的蚁群算法求解TSP问题的方法.该方法在求解TSP问题时,利用粒子群优化的思想,对蚁群算法的参数取值进行优化并选择.在粒子群算法中,将蚁群算法的5个参数(q,α,β,ρ ...

  9. 【路径规划-TSP问题】基于蚁群算法求解实际地图旅行商问题含Matlab源码

    1 内容介绍 旅行商问题的传统求解方法是遗 传算法,此算法收敛速度慢,并不能获得问题的最优解.为了求取旅行商问题的最优解,本文在阐述蚁群算法的基本原理,模型以及在旅行商问题中的实现过程的基 础上,提出 ...

最新文章

  1. linux c 监控文件内容改变,如何让程序监视C ++中的文件修改?
  2. 移动基于Percona XTRADB Cluster的大数据解决方式
  3. CSS高度塌陷问题-清除浮动
  4. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )
  5. PIC单片机入门_8位AD转换器
  6. 318. Maximum Product of Word Lengths
  7. 揭秘阿里云EB级大数据计算引擎MaxCompute
  8. vue pdfjs 在线预览
  9. Flowable 数据库表结构 ACT_RE_DEPLOYMENT
  10. android反射开启通知_Android中反射的简单应用
  11. mysql 8.0远程连接_安装mysql 8.0.17并配置远程访问的方法
  12. 骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
  13. c语言高效编程pdf,C语言高效编程的四大绝招
  14. logging 模块 与 logging 固定模块
  15. 如何确定恶意软件是否在自己的电脑中执行过?
  16. win7 64位共享打印机
  17. flog和flag,FLAG标签和3xFLAG标签的序列
  18. 2021届西农计算机复试工作方案(学院)
  19. web-天下武功唯快不破
  20. 单机 elasticsearch 7.12 索引状态yellow问题解决

热门文章

  1. 为什么说Java是2021年最值得学的技术?
  2. Python中的函数递归
  3. Spring Boot 集成测试
  4. wxWidgets:wxGauge类用法
  5. 验证 Boost.Optional 复制构造函数不会尝试调用从模板化参数初始化构造函数的元素类型
  6. boost::math::relative_difference相关用法的测试程序
  7. boost::hana::just用法的测试程序
  8. boost::hana::metafunction用法的测试程序
  9. boost::lexical_cast模块将创建一个to_long_double方法,将 Boost.Variant 的值转换为long double
  10. boost::hana::Comparable用法的测试程序