1、爬山算法
(1)概念
一种简单的贪心搜索算法,也可以被称为局部搜索算法(local search algorithm)一种局部择优的方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解
(2)思路:

(3)缺点:
陷入局部最优
(4)图解
假设A是当前解,爬山算法往前继续搜索,当搜索到B这个局部最优解时就会停止搜索了。因为此时在B点无论是往哪边走都不会得到更优的解了。但是,全局最优解在C点。

2、求解TSP
同样是求解att48实例(最优解为10628)
代码结构:

其中Data类表示定义数据、变量初始化和读取数据的类

package com.chb.HillClimbing;import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Random;
import java.util.Scanner;public class Data {public static final int MAX_GEN=5000;//最大的迭代次数public static int bestT;//最佳的迭代次数public static int cityNum=48;//城市数量,手动设置public static int bestGh[]=new int[cityNum];//最好的路径编码public static int bestEvaluation;public static int point[][]=new int[cityNum][2];//每个城市的坐标public static int dist[][]=new int[cityNum][cityNum];//距离矩阵public static Random random;//读取数据并初始化public static void read_data(String filepath) throws FileNotFoundException {String line=null;String substr[]=null;Scanner cin=new Scanner(new BufferedReader(new FileReader(filepath)));for (int i = 0; i < cityNum; i++) {line=cin.nextLine();line.trim();substr=line.split(" ");point[i][0]=Integer.parseInt(substr[1]);//x坐标point[i][1]=Integer.parseInt(substr[2]);//y坐标}cin.close();//计算距离矩阵,注意这里的计算方式,才用的是伪欧式距离for (int i = 0; i < cityNum; i++) {dist[i][i]=0;//对角线元素为0for (int j = i+1; j < cityNum; j++) {double rij=Math.sqrt((Math.pow(point[i][0]-point[j][0], 2)+Math.pow(point[i][1]-point[j][1], 2))/10.0);//rij四舍五入取整int tij=(int) Math.round(rij);if(tij<rij) {dist[i][j]=tij+1;dist[j][i]=dist[i][j];}else {dist[i][j]=tij;dist[j][i]=dist[i][j];}}}dist[cityNum-1][cityNum-1]=0;bestT=0;bestEvaluation=Integer.MAX_VALUE;random=new Random(System.currentTimeMillis());}
}

HillClimbing类是算法的主体

package com.chb.HillClimbing;import java.io.FileNotFoundException;public class HillClimbing {//初始化编码Ghhpublic static void initGroup() {Data.bestGh[0]=Data.random.nextInt(65535)%Data.cityNum;int i,j;//使得产生的每个基因都不一样for (i = 1; i < Data.cityNum;) {Data.bestGh[i]=Data.random.nextInt(65535)%Data.cityNum;for (j = 0; j < i; j++) {if(Data.bestGh[i]==Data.bestGh[j]) {break;}}if(j==i) {i++;}}}//评价函数public static int evaluate(int[] chr) {int len=0;for (int i = 1; i < Data.cityNum; i++) {len+=Data.dist[chr[i-1]][chr[i]];}len+=Data.dist[chr[Data.cityNum-1]][chr[0]];return len;}//爬山算法public static void pashan(int[]Gh,int T) {int i,temp,tt=0;int rand1,rand2;int e;//评价新值int[]tempGh=new int[Data.cityNum];//临时变量Data.bestEvaluation=evaluate(Gh);for (tt = 0; tt < T; tt++) {//将Gh复制到tempGhfor (i = 0; i < Data.cityNum; i++) {tempGh[i]=Gh[i];}rand1=Data.random.nextInt(65535)%Data.cityNum;rand2=Data.random.nextInt(65535)%Data.cityNum;while(rand1==rand2) {rand2=Data.random.nextInt(65535)%Data.cityNum;}//交换temp=tempGh[rand1];tempGh[rand1]=tempGh[rand2];tempGh[rand2]=temp;e=evaluate(tempGh);//评价新值if(e<Data.bestEvaluation) {Data.bestT=tt;Data.bestEvaluation=e;for ( i = 0; i < Data.cityNum; i++) {Gh[i]=tempGh[i];}}}}public static void solve() {initGroup();pashan(Data.bestGh,Data.MAX_GEN);System.out.println("最佳迭代次数:"+Data.bestT);System.out.println("最佳长度为:"+Data.bestEvaluation);System.out.println("最佳路径为:");for (int i = 0; i < Data.cityNum; i++) {System.out.print(Data.bestGh[i]+"-->");}}public static void main(String[] args) throws FileNotFoundException {Data.read_data("data/att48.txt");HillClimbing.solve();}
}

data文件夹中的att48.txt是测试文件,可直接百度TSPLIB下载,或从https://pan.baidu.com/s/1Pc71mAN7WBbdxkzOkOK8gw处下载
运行结果:

:本文提炼、转载自https://blog.csdn.net/wangqiuyun/article/details/8810456

TSP-爬山算法求解相关推荐

  1. java模拟多人爬山_基于爬山算法求解TSP问题(JAVA)

    一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  2. 爬山算法求解函数极值(matlab实现)

    爬山算法: 爬山算法是一种简单的贪心搜索算法,在算法迭代的过程中,会从当前解的临近空间中随机选取下一个点,如果比当前结果好则会选取这个点作为新的最优解,否则再次进行选取.因为不是遍历得到的最优解,而是 ...

  3. 爬山算法 求解 最小“球”覆盖 POJ 2069 /2018 南京现场D

    题意: 给出三维空间中的一些坐标,任选空间一点使得该点到N个点的最大距离最小. 思路: 可以发现,即求这些点的最小球半径,同时,初始化球心后,更优解一定大概在该 心与当前最远点连线的方向,且在这条线上 ...

  4. 基于爬山算法求解TSP问题(JAVA实现)

    一.TSP问题 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选 ...

  5. 基于A*、RBFS 和爬山算法求解 TSP问题(Matlab代码实现)

  6. 爬山法和模拟退火算法求解选址问题

    选址问题 选址问题是运筹学中经典的问题之一.选址问题在生产生活.物流.甚至军事中都有着非常广泛的应用,如工厂.仓库.急救中心.消防站.垃圾处理中心.物流中心.导弹仓库的选址等. 基本问题: P-中位问 ...

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

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

  8. 遗传算法与爬山算法简介_遗传算法简介

    遗传算法与爬山算法简介 Genetic Algorithms (GAs) are a part of Evolutionary Computing (EC), which is a rapidly g ...

  9. 利用HTML5 Canvas和Javascript实现的蚁群算法求解TSP问题演示

    HTML5提供了Canvas对象,为画图应用提供了便利. Javascript可执行于浏览器中, 而不须要安装特定的编译器: 基于HTML5和Javascript语言, 可随时编写应用, 为算法測试带 ...

  10. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子

    前言 代码明细可参见 MATLAB实战系列(八)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)(附MATLAB代码) 交叉算子的实现机制 我们还是以求解TSP问题为例,8个城市的坐标如下所示. ...

最新文章

  1. call指令和ret指令的配合使用
  2. linux系统做bond
  3. redmine 2.2.x 修改文档附件的存放目录
  4. HBase伪分布式集群配置
  5. awk bc命令 linux_linux之awk命令(转载)
  6. 安卓手机的加密设备和加密外置SD卡
  7. c#获取当前应用程序所在路径
  8. No migrations to apply.(django不能创建数据库中的表的问题)makemigrations/migrate
  9. 深入理解BeanPostProcessor接口
  10. vs2012 vc++控制台程序 配置成64位
  11. 数据结构与算法之KMP算法中Next数组代码原理分析
  12. 写了 300000 行基础设施代码,我学到了这五条经验
  13. 3.3 决策树分类与回归实战
  14. 4.2线程局部变量(Thread-Local Variables)
  15. s数据结构替换子表java版,数据结构(Java版)-习题解答与实验指导
  16. PyCharm 激活 截止日期2100年1月
  17. 克孜勒苏柯尔克孜自治州谷歌高清卫星地图下载
  18. matlab画PV曲线程序,Matlab模拟包络线形成:Envolope程序
  19. L Norms 范数
  20. mysql_opt_reconnect mysql_ping_蛋疼的mysql_ping()以及MYSQL_OPT_RECONNECT

热门文章

  1. c语言200例 040 字符升序排列
  2. 搜索引擎优化(SEO)解决方案
  3. 调用Excel 的Excel.Application失败的问题分析
  4. LINUX系统子系统DEMON,【linux】led子系统
  5. 揭开神奇数字“142857”隐藏着惊天秘密
  6. 开源ERP系统Odoo16测试版发布
  7. 双字节数据 先低后高_马云回应双11数据造假;字节上市要再等一等;阿里香港IPO首日获40亿保证金认购;Siri未来或能解读情绪 | Tech周报...
  8. 金融信创虽风正时济,应对挑战该如何乘风破浪(二)
  9. Swoft 1.0 正式来袭,首个基于 Swoole 原生协程的框架
  10. .NET 6 实现滑动验证码(二)、基本数据