旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

环境:程序使用语言java,jdk版本1.8,程序中用到的jar包:poi-3.17

jar包下载地址:Apache Download Mirrors

程序中使用的数据:下载地址:TSPLIB数据:att48_蚁群算法TSP问题-Java文档类资源-CSDN下载

项目导入:

3.实验主要源代码

City.java//城市类,结构体

package TSP;public class city {private int name;private double X;private double Y;public city(int name, double x, double y) {super();this.name = name-1;X = x;Y = y;}public int getName() {return name;}public void setName(int name) {this.name = name;}public double getX() {return X;}public void setX(double x) {X = x;}public double getY() {return Y;}public void setY(double y) {Y = y;}@Overridepublic String toString() {return"city [name=" + name + ",X=" + X + ", Y=" + Y + "]";}
}

inputData.Java//导入数据类

package TSP;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class inputData {@SuppressWarnings("resource")public static List<city> input_att48(File file){List<city> cityList = new ArrayList<city>();try {HSSFWorkbook wookbook = new HSSFWorkbook(new FileInputStream(file));HSSFSheet sheet = wookbook.getSheet("Sheet1");int rows = sheet.getPhysicalNumberOfRows();for(int i=1; i<rows; i++){HSSFRow row = sheet.getRow(i);if(row!=null){city cy = new city(i, row.getCell(1).getNumericCellValue(), row.getCell(2).getNumericCellValue());cityList.add(cy);}}} catch (FileNotFoundException e) {System.out.println("File not fount!");} catch (IOException e) {System.out.println("IO exception!");}return cityList;}}

DP.Java//核心代码

package TSP;import java.io.File;
import java.util.List;
import java.util.Scanner;public class DP {//V集合表示已经旅行后的点的集合。
//n点经过集合V中所有点到达起始点的最短距离;1<<(n-1)代表一个二进制串,
//1代表该位置的城市在V集合例,反之不在。static double INF = Double.MAX_VALUE;static double[][] DT = null;static double[][] DP = null;// static int n = 0;static void init(int n) {File file = new File("E:\\Java\\arithmetic\\src\\resource\\att48.xls");List<city> cityList = inputData.input_att48(file);System.out.println("city [城市编号   城市X坐标    城市Y坐标]");for(int i=0; i<n; i++) {System.out.println(cityList.get(i).toString());}DT = new double[n][n];DP = new double[n][1<<(n-1)];for(int i=0; i<n; i++) {for(int j=i; j<n; j++) {if(i==j) DT[i][j] = 0;else {double dertX = cityList.get(i).getX()-cityList.get(j).getX();double dertY = cityList.get(i).getY()-cityList.get(j).getY();DT[i][j] = Math.sqrt(dertX*dertX + dertY*dertY);DT[j][i] = DT[i][j];}}}// for(int i=0; i<n; i++) {
// for(int j=0; j<n; j++) {
// System.out.print(DT[i][j]);
// System.out.print(" ");
// }
// System.out.println();
// }//V集合为空的情况,初始化第i点直接回到起点s的距离for(int i=1; i<n; i++) {DP[i][0] = DT[i][0];}}static void solve(int n) {double minDt = INF;double temp = 0;for(int j=1; j<1<<(n-1); j++){//j的二进制表示V集合。for(int i=1; i<n; i++){//n个点减去起点还有n-1个点,遍历n-1个点选一个不在集合V中的点。if((1<<(i-1)&j)==0){//(1<<(i-1))&j==0表示i不在集合v中minDt = INF;for(int k=1; k<n; k++){if(((1<<(k-1))&j)!=0){//(1<<(k-1))&j==1表示k在集合V中temp = DT[i][k] + DP[k][j-(1<<(k-1))];if(temp < minDt) minDt = temp;}}}DP[i][j] = minDt;}} minDt = INF;for(int k=1; k<n; k++){//1<<(9)=1000000000,((1<<(n-1))-1)=111111111111...temp = DT[0][k] + DP[k][((1<<(n-1))-1)-(1<<(k-1))];if(temp < minDt){minDt = temp;}}System.out.print("最短路径长:");System.out.println(minDt);}@SuppressWarnings("resource")public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("----------------动态规划解决TSP问题----------------");Scanner in = new Scanner(System.in);while(true) {System.out.println();System.out.println("请输入城市数:");int n = in.nextInt();if(n>24) {System.out.println("城市数过多,请使用其他算法!");return;}init(n);solve(n);}}
}

输入输出:

用动态规划算法解决TSP问题相关推荐

  1. 【算法】模拟退火算法解决TSP问题的matlab实现

    [算法]模拟退火算法解决TSP问题的matlab实现 参考文章: (1)[算法]模拟退火算法解决TSP问题的matlab实现 (2)https://www.cnblogs.com/wenyehoush ...

  2. MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题

    MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题 目录 输出结果 实现代码 输出结果 实现代码 %SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题--Jas ...

  3. 粒子群算法tsp java_粒子群算法解决TSP问题汇总.doc

    PAGE \* MERGEFORMAT 14 河南理工大学计算机科学与技术学院课程设计报告 2014- 2015学年第一学期 课程名称 Java语言程序设计 设计题目 利用粒子群算法解决TSP问题 姓 ...

  4. 粒子群算法tsp java_粒子群算法解决TSP问题

    1. 粒子群算法简介 粒子群算法(particle swarm optimization,PSO)由Kennedy和Eberhart在1995年提出,属于进化算法的一种,是通过对模拟鸟群扑食行为设计的 ...

  5. 蚁群算法解决tsp问题c语言,蚁群算法解决TSP问题程序.doc

    蚁群算法解决TSP问题程序 蚁群算法用于求解TSP问题,经过仿真测试,发现此程序的优化效率和鲁棒性都非常好. 这与在无线多媒体传感器网络路由算法应用到的寻找最佳路径的蚁群算法非常相似. functio ...

  6. 模拟退火算法解决TSP问题

    模拟退火算法解决TSP问题 参考文章: (1)模拟退火算法解决TSP问题 (2)https://www.cnblogs.com/yangmingustb/p/8641124.html (3)https ...

  7. 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用

    陈灵佳 文章首先对蚁群算法与TSP问题进行简要介绍,在此基础上对蚁群算法在解决TSP问题中的应用进行论述.期望通过本文的研究能够对TSP问题的解决有所帮助. [关键词]蚁群算法 TSP问题 最优解 1 ...

  8. 蚁群算法解决 TSP 问题

    蚁群算法解决 TSP 问题 数据集 Tools.py Ant.py ACO_G.py 运行效果 数据集 json 形式(c.json)的中国各省市经纬度数据集,一共 2241 个市的数据,为后来的 T ...

  9. java实现动态规划算法解决存钱罐问题(piggy bank)

    一.实验目的 练习使用动态规划算法解决实际问题(使用Java语言实现) 二.实验内容 [问题描述] 给定一个空存钱罐的重量和这个存钱罐最多能装进去的重量,现在需要在不打破这个存钱罐的情况下猜测里面最少 ...

最新文章

  1. 阿里巴巴图学习框架 euler 安装运行记录
  2. java 宽字节_宽字节注入
  3. LSTM之父再度炮轰Hinton:“本田奖”不该授予他,颁奖词有六大谬误
  4. 华为服务器万兆网卡驱动型号,华为万兆光模块型号参数大全
  5. 明明输出电压小于5V,单片机ADC测量到数值却一直为5V,解决方法
  6. MM定价计算方案确定详细图解
  7. 20220215 人工势场的缺陷局部最小值
  8. 云信“欢乐颂活动”中奖名单
  9. LeetCode的二分查找的练习部分总结
  10. 前端学习(3180):ant-design介绍3
  11. Seq(HDU-6672)
  12. TFS offline issue
  13. php类的继承和,详细对比php中类继承和接口继承
  14. 栈的亚特兰数与二叉树的前序中序遍历序列
  15. [模板]01分数规划
  16. Texar安装、Textgenrnn安装
  17. PHP.ini文件 服务器将用户可操作的文件限制在某目录下
  18. 转~ubuntu的一些常用软件
  19. 几种常见的文献管理软件
  20. 使用PowerShell查看Windows 补丁记录并写入数据库

热门文章

  1. 图像处理—CIF to QCIF记录
  2. Hadoop安装教程_单机/伪分布式配置_CentOS6.4/Hadoop2.6.0
  3. Mac OS下fis3 安装教程
  4. 彩色cad怎么转为黑白pdf?
  5. win10怎么取消登录密码
  6. Java基本数据类型(范围 默认值 占用字节 精度
  7. 1978-2018各省人均GDP数据
  8. SpringBoot整合thymeleaf之模糊查询操作模块
  9. C# 生成二维码, winform生成二维码,二维码编号自动增加
  10. VBA 单元格基本操作 - 复制 粘贴 区域选择