萤火虫算法求解简单TSP问题
1. 萤火虫算法
本期给大家介绍一种比较新颖的群体智能搜索算法——萤火虫算法,萤火虫算法(Firefly Algorithm, FA)是一种基于仿生学的群体智能搜索算法,是模拟萤火虫种群之间的发光特性和特殊的信息传递方式而设计出的一种有效的启发式算法。
简单来说,每一只萤火虫作为独立的个体有着两个基本属性,即发光强度和所处位置。萤火虫个体所处的位置越好,发光强度越高。萤火虫个体与个体之间存在相互吸引的作用力,亮度越高的萤火虫个体对其他位置的低亮度个体吸引力越大,从而能吸引范围内的低亮度萤火虫向着高亮度萤火虫移动。
TSP问题
了解了萤火虫算法的工作原理,我们简单回顾一下TSP问题,又叫旅行商问题。旅行推销员问题(英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP难问题,在运筹学中非常重要。算法流程
用萤火虫算法求解TSP问题的基本原理就比较清晰了,我们还是采用TSP常用的序列编码。萤火虫的两个属性,其中位置属性对应序列的编码,萤火虫的亮度则对应该编码解的好坏。萤火虫的亮度越高,代表解的质量越高,亮度越低,代表解的质量越低。而萤火虫个体之间的相对位置则用编码之间的相对距离进行表示。通过不断迭代,亮度低的萤火虫不断向亮度高的萤火虫移动,即效果差的解不断向效果好的解进行移动,而最亮的个体则进行随机移动,从而达到搜索邻域空间内的解的效果,直到找到种群中最好的个体或达到算法终止条件。
萤火虫算法的实现过程和步骤描述如下:
Step1:系统初始化,生成初始种群,设置参数等;
Step2:计算每个初始萤火虫的亮度;
Step3:根据移动公式更新萤火虫的位置;
Step4:最亮的萤火虫随机移动;
Step5:计算位置更新后的每个萤火虫的亮度;
Step6:如果满足终止条件,则结束循环,返回最优个体解,否则转Step3;
4.代码部分
代码采用java编写,实现以每个firefly为类,代码的思路就比较清晰了,此处只给出了核心部分的代码(firefly类)
package algorithm;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import java.math.*;
public class Firefly {public ArrayList<Integer> path;public double light;public int M;public Firefly(){this.path = new ArrayList<Integer>();this.M = Integer.MAX_VALUE;}public void setlight(double l){this.light = l;}public double getlight(){return this.light;}public void addspot(int i){this.path.add(i);}public ArrayList<Integer> getpath(){return this.path;}public void removespot(int i){this.path.remove(i);}public void insert(int index, int i){this.path.add(index, i);}public void Calculight(Params inst){//计算light;double l = 0.0;for(int j = 0; j <this.path.size() - 1; j ++){l += inst.dist[this.path.get(j)][this.path.get(j+1)];}this.setlight(1000/ l);}public void moveto(Firefly f, Params p) // f is a better one;{Random r = new Random();for(int i = 0; i <this.path.size(); i ++){int flg;double dis = f.path.get(i) - this.path.get(i);double aff = p.beta * Math.exp( - p.gama * ( dis * dis));double the = r.nextDouble();double nex = this.path.get(i) + aff * dis + p.alph * the;if(nex > p.spotnum){flg = p.spotnum;}else{flg = (int)Math.ceil(nex);}this.path.set(i, flg);}//adjustArrayList<Integer> temp= new ArrayList<Integer>();for(int j = 0; j <this.path.size(); j ++){int aa = Collections.min(this.path);int bb = this.path.indexOf(aa);temp.add(bb);this.path.set(bb, M);}for(int j = 0; j < temp.size(); j ++){this.path.set(temp.get(j), j);}}public void randmove(Params p){Random r = new Random();for(int i = 0; i < this.path.size(); i ++){int flg;double the = r.nextDouble() * 2 - 1;double nex = this.path.get(i) + p.alph * the;if(nex > p.spotnum){flg = p.spotnum;}else{flg = (int)Math.ceil(nex);}this.path.set(i, flg);}ArrayList<Integer> temp= new ArrayList<Integer>();for(int j = 0; j <this.path.size(); j ++){int aa = Collections.min(this.path);int bb = this.path.indexOf(aa);temp.add(bb);this.path.set(bb, M);}for(int j = 0; j < temp.size(); j ++){this.path.set(temp.get(j), j);}}
完整代码获取:
https://mp.weixin.qq.com/s?__biz=MzUzNDAzMTU0NA==&mid=2247484047&idx=1&sn=c898a5db967a6a4d99e98edb288d4350&chksm=fa9bbf58cdec364e7991c19e55eb856e02c80218816e3891dc922493415e8fbd1f8116405480#rd
萤火虫算法求解简单TSP问题相关推荐
- 粒子群算法求解旅行商问题TSP (JAVA实现)
粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...
- 【Matlab多目标优化求解】遗传优化萤火虫算法求解多目标优化问题【含源码 1484期】
一.代码运行视频(哔哩哔哩) [Matlab多目标优化求解]遗传优化萤火虫算法求解多目标优化问题[含源码 1484期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 ...
- 【FA TSP】基于matlab萤火虫算法求解旅行商问题【含Matlab源码 328期】
⛄一.TSP简介 旅行商问题 (Travel Salesman Problem, TSP) 是最基本的路线问题, 其探索单一旅行者由起点出发, 并通过所有给定点后, 再回到起点的最小路径成本问题.求解 ...
- 【路径规划】基于萤火虫算法求解旅行商问题matlab源码
1 简介 基于求解TSP问题,提出一种离散型萤火虫群优化(DGSO)算法,该算法结合TSP问题特点,给出一种有效编码和解码方法,并定义适合编码的个体间距离计算公式和编码更新公式.同时,为增强算法求解T ...
- 【智能算法】FA萤火虫算法求解无约束多元函数最值(Java代码实现)
文章目录 前言 优化目标 求解结果 搜索过程可视化 Java代码 可视化代码 前言 本文以求解二元函数最小值为例,如果需要求解多元函数,只需要修改以下变量即可: varNum:变量维度数 ub和lb: ...
- 【优化求解】基于matlab粒子群算法和帝国殖民算法和萤火虫算法求解最小生成树优化问题【含Matlab源码 2376期】
⛄一.粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在.生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型,在他的仿真中,每一个个体都 ...
- 萤火虫算法_智能优化算法萤火虫算法
今天介绍的算法是萤火虫算法(Firefly Algorithm,简称FA),也是一种仿生优化算法.从算法名字就知道了,该算法的思想来源于萤火虫,具体是萤火虫的闪烁行为.下面是展开对算法相关内容的介绍. ...
- 线性规划问题的单纯形算法求解
关于线性规划问题是什么已经有很多人早就说明过了,我也小抄一波给大家预热预热,线性规划问题是运筹学中研究较早.发展较快.应用广泛.方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法. 在一 ...
- 模拟退火算法求解TSP问题
前言:模拟退火(simulated annealing)技术,在每一步都以一定的概率接受比当前结果更差的结果,从而有助于"跳出"局部极小.在每次迭代过程中,接受"次优解& ...
- matlab算法大全 pdf_遗传模拟退火算法求解旅行商(TSP)问题
hello大家好,很高兴又和大家见面了.在之前的遗传算法(GA)求解旅行商问题(TSP)MATLAB代码讲解和模拟退火(SA)算法求解旅行商 (TSP)问题MATLAB代码讲解这两篇推文中,分别讲解了 ...
最新文章
- c++通讯录控制台小程序
- Javascript中闭包的作用域链
- python return返回值在计算机内的存储形式_Python如何执行存储过程,获取存储过程返回值...
- PHP从零开始--错误处理函数
- UNIX(多线程):23---线程池注意事项和常见问题
- h5-localStorage实现缓存ajax请求数据
- php不使用插件导出excel
- 关于 JVM 内存的 N 个问题(转)
- 笔记:算法笔记-胡凡、曾磊
- java 反编译 重新打包_「反编译apk」一步一步带你反编译apk,并教你修改smali和重新打包 - seo实验室...
- 软件工程专业学习路线
- GoLang之iface 和 eface 的区别是什么(3)
- 2013江苏计算机二级vfp试题,2008年春季江苏省计算机等级考试二级VFP考试试题(含答案)...
- 规格说明书-吉林市2日游
- bestpay学习 - - 一个轻量级的完全开源项目
- 基础语法值c++提高编程
- java web属于什么语言_java web开发是什么
- 检查Office版本工具(通过注册表)
- 对比这10个注意事项,你的网页文字排版达标了么?
- OpenStack_Rocky版-8.安装Dashboard面板服务
热门文章
- 电子设计大赛-信号源类题目分析
- [问题探讨]ECharts实现带钓鱼岛和南海诸岛的中国(China)地图
- 数学建模之TOPSIS法
- 计算机专业数学建模结课论文,数学建模论文范文2篇
- B-M求线性移位寄存器
- python实现简单的端口扫描器
- GalleryView禁止选中项目向中间滑动
- CopyBeanUtils坑,xxDto cannot be cast to xxxEntity 类型转化错误
- 自然语言处理入门新手上路
- Ziipoo(易谱)简谱编辑制作打谱软件免费版下载 WiN+MAC+安卓+Linux