以下文章来源于数据魔术师 ,作者向柯玮

前言

各位看客老爷们,大家好~

今天要为大家带来的干货是multi-start local search算法解决TSP问题(Java的实现)。

大家可不要因为这个算法的名字比较长,就觉得这个这个算法很难,其实没有哦-

这个算法还是非常简单的,希望大家能够通过这个简单的算法来了解面对NP-hard问题,我们可以采取的策略是什么。

算法简介

这个算法,其实大家通过名字就可以知道,一定和Iterated local search(迭代局部搜索算法)存在一定的联系。

(这是当然呀,名字都差不多,还需要你说吗?)

迭代局部搜索算法公众号在之前已经介绍过了,有兴趣的小伙伴可以再看看~

这两个算法相似的地方我们就不多说了。我们主要介绍这个算法优势之处。

优势

这种算法,他是多起点的,初始解的生成和遗传算法挺类似的。

通过随机打乱,生成多个随机新解,以此来增大达到最优解的目的。

可能大家光这么看,没啥感觉,我们可以通过数学公式来让大家直观的感受一下。

我们认为有N个城市,令传统的LS搜索的次数为A,传统的MLS搜索次数为A',改进过的MLS搜索次数为A'',可以容易得出下面的公式。

现在让我们再来看看实际的程序跑出来的结果。

这是传统的LS。

这是传统的MLS。

这是咱们优化过的MLS。

从以上两个例子我们可以看出,MLS确实能够提高单次程序运行获得优质解的概率。

那么,下面就让我们简单地总结一下MLS的一些优点。

如果是在多线程情况下进行探索,那么速度和LS是差不多的

探寻到最优解的概率更大了

对于新手来说,也可以更好的学习这种多个初始解的思想,便于以后GA等算法的学习

虽然本次代码的展示仍然是采用单线程,但是只要单线程的明白了,多线程其实很容易就变过去了。

算法流程分析

现在我们先来介绍介绍最普遍的一种multi-start local search(多起点的局部搜索算法)。

大致的流程就是上面这副图一样,在读取数据之后生成第一个解,即按照0-1-2-3……排序的解。

然后将这个解进行打乱,生成N组解,然后分别对这N组解利用2-opt算子进行邻域搜索。

我个人感觉这一种multi-start local search算法并不是很好。

都是采用的多线程操作,对于新手都不是很友好,代码不大看得明白

算子太少,单一的2-opts算子很难找到较好的解

对一些比较差的初始解(通过邻域搜索都无法找到更好的解),没有进行一些处理

鉴于上面的不足,我对这个算法进行了一定程度的改进。如下图。

代码解析

在上面,我们大致的介绍了本次算法的大致实现过程。

接下来,我们对部分代码进行解读

启动函数

这个函数是我们的main函数,我们在这里完成我们所有的操作。

我们在iter函数中完成我们的搜索过程。

public class launch {

public static void main(String[] args) {

mls my_solution=new mls(); //生成mls对象

readfile my_file=new readfile(); //读取文件

my_file.buildInstance("F:\\mls\\data\\uy734.tsp.txt"); //读取文件

my_solution.setiLSInstance(my_file.getInstance()); //设置好距离矩阵

my_solution.setsolution(); //设置好初始解

my_solution.iter(); //开始迭代

my_solution.print_best(); //输出最优解

System.out.println("最佳适应度为:"+my_solution.print_of()); //输出最佳适应度

}

}

iter函数

这个函数就是最主要的函数,相当于整个搜索的过程的启动器。

我们在这个函数中,每次生成一个新的随机解,然后进行邻域搜索。这个就是区别于LS的根本之处。

并用'tihuan'作为改随机解是否为一个较好解的标志。

public void iter() {

for(int c=0;c

{

Solution localsolution2 = this.currBest.clone();

for (int j = c; j < this.iLSInstance.getN(); j++) {

Solution now = ls(localsolution2.clone(), j);

if (now.getOF() < this.dLSGlobalBest.getOF())

this.dLSGlobalBest = now.clone();

}

}

for (int i = 0; i < this.iLSInstance.getN(); i++) {

tihuan=false;

Solution localsolution = this.currBest.clone();

localsolution=restart(localsolution);

for (int j = 0; j < this.iLSInstance.getN(); j++) {

Solution now = ls(localsolution.clone(), j);

if (now.getOF() < this.dLSGlobalBest.getOF())

this.dLSGlobalBest = now.clone();

}

for(int m=0;m

System.out.print(localsolution.getsolution().get(m)+"-->");

System.out.println(localsolution.getsolution().get(this.iLSInstance.getN()-1));

if(!tihuan)

step++;

if(step==50)

{

i--;

step=0;

}

}

}

LS函数

LS函数,即local search函数,我们通过这个函数,完成我们对每组解的每个位置的城市的邻域搜索操作。

并用‘tihuan’作为是否生成更好的解(这里是指生成比当前随机解好的解)的标志。

public Solution ls(Solution ssolution,int i) {

Solution best = ssolution.clone();

for (int j = i + 1; j < this.iLSInstance.getN() +i; j++) {

Solution now=ssolution.clone();

if(j

now.swap(i, j);

now.setOF(this.cLSCalculator.calc(this.iLSInstance, now));

if (now.getOF() < best.getOF()) {

best = now.clone();

tihuan=true;

}

if(!tihuan){

now.swap(i,j);

now.relocate(i,j);

now.setOF(this.cLSCalculator.calc(this.iLSInstance, now));

if (now.getOF() < best.getOF()) {

best = now.clone();

tihuan=true;

}

}

}

else if(j-this.iLSInstance.getN()

now.relocate(i,j-i);

now.setOF(this.cLSCalculator.calc(this.iLSInstance, now));

if (now.getOF() < best.getOF()) {

best = now.clone();

tihuan=true;

}

}

}

return best;

}

restart函数

这个是我们用来生成随机新解的函数。

public Solution restart(Solution solution){

int[]haveset=new int[iLSInstance.getN()];

haveset[0]=0;

for(int i=0;i

int n=rLSRandom.nextInt(iLSInstance.getN());

while (haveset[n]!=0)

n=rLSRandom.nextInt(iLSInstance.getN());

solution.getsolution().set(i,n);

haveset[n]=1;

}

solution.setOF(this.cLSCalculator.calc(this.iLSInstance, solution));

return solution;

}

小结

好了,我们现在把算法的大致流程,主要的代码都展示了一下,大家可以把自己的data输进去,看看结果怎么样,T^T,小玮得到的结果都不是很理想--

该算法的随机性很大,获得优质解的难度还是蛮大的。

但是我觉得这个算法从传统LS变过来给了我们很多启发,比如说,在寻求最优解的时候,我们可以采用多线程来提高寻求最优解的效率等等。

我希望大家通过本次推文,能够了解到邻域解是如何产生的,以及算法不够好时的我们可以采用哪些改进。

那么在下一次的推文中,会介绍一种船新的组合优化解决VRPTW的算法~让我们一起期待吧!

本篇推文代码请在公众号后台回复【MLS代码】获取(不用输入【】)

领域搜索算法java_多起点的局部搜索算法(multi-start local search)解决TSP问题(附Java代码及注释)...相关推荐

  1. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  2. 【智能算法】迭代局部搜索(Iterated Local Search, ILS)详解

    更多精彩尽在微信公众号[程序猿声] 迭代局部搜索(Iterated Local Search, ILS) 00 目录 局部搜索算法 简单局部搜索 迭代局部搜索 01 局部搜索算法 1.1 什么是局部搜 ...

  3. 禁忌搜索算法(tabu search)解决TSP及其Matlab代码

    1.算法简介 禁忌搜索算法TS(Tabu search),顾名思义核心在于"禁忌",简单来说就是在某一个过程中把一些不太好的操作给禁止了,直到搜索到一个"最优秀" ...

  4. java 路径规划_转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)...

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  5. 局部搜索:禁忌搜索(Tabu Search)解决TSP问题的python案例

    禁忌搜索解决TSP问题的python案例 Tabu Search 禁忌(Tabu Search)算法是一种亚启发式(meta-heuristic)随机搜索算法,它从一个初始可行解出发,选择一系列的特定 ...

  6. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  7. 旅行商问题(TSP)与局部搜索算法

    本篇为在University of Birmingham 学习Advanced Nature-Inspired Search and Optimisation课程中的笔记之一 This is one ...

  8. k图着色 局部搜索算法与模拟退火算法的python实现

    文章目录 前言 如何评价一个解? 通过计算出的冲突来找它的邻居解 数据的格式 局部搜索 概述 补充 代码 模拟退火 概述 补充 代码 总结以及不足之处 前言 这两种算法就不详细介绍了,流程思路比较简单 ...

  9. 人工智能中的局部搜索算法

      在局部搜索算法中,我们不再关心从初始节点到目标节点之间的路径,而是考虑从当前节点出发,移动到它的邻近状态,直到到达合理的目标状态.相比于前面所说的无信息搜索算法和有信息搜索算法,局部搜索算法往往能 ...

  10. 通用局部搜索算法之WALKSAT

    通用局部搜索算法之WALKSAT 设施区位及算法 2009-08-28 20:44:47 阅读29 评论0 字号:大中小 通用局部搜索算法之WALKSAT GSAT 和 WalkSat 是用于求解布尔 ...

最新文章

  1. jenkins配置git
  2. QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考
  3. Jupyter notebook Ipython 魔法函数 Magic 计算代码(函数)耗时 Timing(%%time %time %timeit)
  4. 画活动图教程_二次元人物头发怎么画?画好头发有什么技巧?
  5. OpenCV在Linux中安装
  6. 【8086汇编-Day6】关于loop的实验
  7. WPF与WCF c#
  8. Navicat安装激活
  9. 正数(十进制)变二进制 除以2取余 小数(十进制)变二进制 乘以2取整数
  10. (4) XOS 源码详解: os_s_xxxx.s 汇编代码的 堆栈空间定义,比较简洁的方式
  11. iOS 横竖屏适配 ---masonry
  12. 【语音处理】时域信号分析基本工具,什么是窗函数
  13. 全自动降噪插件-Acon Digital Extract:Dialogue 1.1.2 WiN-MAC
  14. LATEX参考文献添加文章doi号并嵌入超链接+IEEE期刊缩写查询
  15. android通话模块详解
  16. 临床执业助理医师(综合练习)题库【8】
  17. c语言编程自幂数,【C语言基础】-自幂数优化-这个算法快得像一道闪电
  18. 台式计算机内存卡与普通有啥区别,电脑硬盘和内存有什么区别?
  19. (三)java流程控制语句
  20. C语言——日期转换为天数

热门文章

  1. 1066 图像过滤 (15 分)—PAT (Basic Level) Practice (中文)
  2. Android系统中属性值的设置和使用
  3. TCP三次握手四次挥手介绍
  4. js正则及常用方法函数总结
  5. 《Linux内核分析》第三周笔记 构造一个简单的Linux系统MenuOS
  6. MYSQL 引擎的情况
  7. LeetCode: Implement strStr() [027]
  8. POJ-1699 Best Sequence 状态压缩DP
  9. VBA中,可以利用下面的语句来调用Excel内置对话框
  10. Debian - NFS搭建 + 测试