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

1. 粒子群算法简介

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

基本思想:

从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。

场景设定 :

一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢。最简单有效的就是搜寻目前离食物最近的鸟的周围区域。

粒子群算法的几个概念

粒子:场景中的一只鸟;

种群:场景中的一群鸟;

位置:粒子(鸟)所在的位置;

速度:鸟的飞行速度,粒子的移动速度;

适应度:鸟距离食物远近,粒子距离目标的评价。

2. 算法分析

算法流程

958afd16b27d

粒子群算法流程.png

流程描述

1.首先随机生成粒子,并组成种群;其中粒子的数量及种群的大小可以控制;

2. 计算每个粒子的适应度值;

3. 通过当前适应度值是pBest(当前粒子的历代最佳值)和gBest(种群的历代最佳值)进行对比,来更新当前粒子的速度和位置;

4. 判断是否满足退出条件(达到迭代次数或者最优解的误差满足设定的阈值),若不满足则转向 2.

速度与位置的更新

粒子群算法的核心就是每个粒子位置和速度的更新

速度更新

958afd16b27d

速度更新公式

v:粒子当前的速度; w是惯性因子; position是粒子当前的位置; pBest是当前粒子历代最好的位置;gBest是种群中当前最好的位置; c1和c2 是学习因子,分别是向pBest和gBest学习。

速度更新的三部分解读

w*v : 惯性保持部分,粒子沿着当前的速度和方向惯性飞行,不会偏移。假如没有惯性部分,粒子会很快向pBest和gBest移动,很容易陷入局部最优。有了惯性,粒子就会有在空间中自由飞行的趋势,能够在整个空间寻找最优解。

c1*rand()*(pBest-position):自我认知部分,粒子有回到自身历代最好位置的意愿。假如没有自我认知部分,粒子将很快向gBest移动,很容易陷入局部最优。

c2*rand()*(gBest-postion):社会认知部分,粒子有向种群中最好位置学习的意愿。假如没有社会认知部分,所有的粒子都向各自的pBest移动,各自陷入自身的最优解,从而导致整个过程不收敛。

位置更新

958afd16b27d

位置更新公式

3. TSP问题

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

TSP问题是一个组合优化问题, 是一个NPC问题,分为两类: 一类是对称TSP问题(Symmetric TSP),另一类是非对称问题(Asymmetric TSP)。

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

算法的实现

粒子的表示:TSP问题的一个解为一个序列,可以表示为一个粒子;

速度的表示:用一个序列的交换序列表示粒子的速度。

适应度函数的定义: 当前序列的路径长度即为适应度值,通过经纬度坐标计算。

惯性因子的定义:自身的交换序列即惯性因子

Java代码实现

速度和位置的更新

更新公式:Vii=wVi+ra(Pid-Xid)+rb(Pgd-Xid)

private void evolution() {

for (int t = 0; t < MAX_GEN; t++) {

for (int k = 0; k < scale; k++) {

ArrayList vii = new ArrayList<>();

//第一部分:惯性保持部分,自身交换对

int len = (int) (w * listV.get(k).size());

for (int i = 0; i < len; i++) {

vii.add(listV.get(k).get(i));

}

//第二部分:自我认知部分,和当前粒子中出现最好的结果比较,得出交换序列

//ra(Pid-Xid)

ArrayList a = minus(mUnits.get(k).getPath(), Pd.get(k).getPath());

float ra = random.nextFloat();

len = (int) (ra * a.size());

for (int i = 0; i < len; i++) {

vii.add(a.get(i));

}

//第三部分:社会认知部分,和全局最优的结果比较,得出交换序列

//rb(Pgd-Xid)

ArrayList b = minus(mUnits.get(k).getPath(), Pgd.getPath());

float rb = random.nextFloat();

len = (int) (rb * b.size());

for (int i = 0; i < len; i++) {

vii.add(b.get(i));

}

listV.remove(0);

listV.add(vii);

//执行交换,生成下一个粒子

exchange(mUnits.get(k).getPath(), vii);

}

//更新适应度的值

for (int i = 0; i < scale; i++) {

mUnits.get(i).upDateFitness();

if (Pd.get(i).getFitness() > mUnits.get(i).getFitness()) {

Pd.put(i, mUnits.get(i));

}

if (Pgd.getFitness() > Pd.get(i).getFitness()) {

Pgd = Pd.get(i);

bestT = t;

}

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/502899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 3.5.2页面_Python 3.5.2实现websocket服务端

最近由于一个项目需要&#xff0c;写了一个简易的websocket服务端程序&#xff0c;其间也参考了网上的很多资料&#xff0c;我将用接下来的几个篇幅说明是怎么实现的&#xff0c;及遇到的一系列埂。参考 (包括且不限于如下地址)涉及到的模块socket&#xff1a;socket通讯如侦听…

java连接sqlserver 的sqlhelper类_SQLserver数据库操作帮助类SqlHelper

using System;using System.Data;using System.Xml;using System.Data.SqlClient;using System.Collections;namespace SQL.Access{/// /// SqlServer数据访问帮助类/// public sealed class SqlHelper{#region 私有构造函数和方法private SqlHelper() {}/// /// 将SqlParamete…

python编写抢座位软件_程序员硬核Python抢票教程”,帮你抢回家车票

盼望着&#xff0c;盼望着&#xff0c;春节的脚步近了&#xff0c;然而&#xff0c;每年到这个时候&#xff0c;最难的&#xff0c;莫过于一张回家的火车票。据悉&#xff0c;今年春运期间&#xff0c;全国铁路发送旅客人次同比将增长8.0%&#xff0c;达到4.4亿人次&#xff0c…

java io 缓存读取_Java 文件IO写入读取四种方法

第一种&#xff1a;字节流 FileInputStream FileOutputStream1.1 读取操作//先创建一个和硬盘连接的流(打通硬盘和内存的通道)FileInputStream fis new FileInputStream("D:\\Demo.txt");//创建缓存区大小是1kbyte[] bytes new byte[1024];int data 0; //存储有效…

python集合可以修改吗_修改包含Python3中的集合的集合列表-问答-阿里云开发者社区-阿里云...

我试图创建一个以元组为元素的列表。每个元组都有4个整数。前两个整数是对2个range进行压缩的结果&#xff0c;而其他2个则是对2个不同的整数进行压缩的结果。我正在使用此代码创建元组和最终列表&#xff0c;这些列表是从笛卡尔乘积派生的&#xff0c;如下所示&#xff1a;获取…

hive mysql性能_Hive数据库安全审计功能

【Hive数据库安全审计简介】Hive数据库安全审计是一款基于数据库通讯协议准确分析和SQL完全解析技术的数据库安全审计系统。实现了对数据库操作、访问用户及外部应用用户的审计&#xff0c;可以用于安全合规、用户行为分析、运维监控、风控审计、事件追溯等与数据库安全相关的管…

linux安装sz rz_超级好用的文件传输命令rz与sz

做生物信息经常需要在本地客户端与服务器之间进行文件的传输&#xff0c;例如将要分析的数据传到Linux服务器上&#xff0c;进行分析&#xff0c;分析结束之后将结果下载到本地windows系统进行查看。以前我们都推荐大家使用比较稳定&#xff0c;并且支持断点续传的Filezilla或者…

java mongodb gridfs_查询MongoDB GridFS元数据(Java)

我想要做的是通过查询元数据的字段来获取GridFS文件列表.例如,我得到一个GridFS文件文件,如下所示&#xff1a;{ "_id" : { "$oid" : "4f95475f5ef4fb269dbac954"} , "chunkSize" : 262144 , "length" : 3077 , "md5&q…

php 防止跨站脚本攻击,php防止sql注入以及xss跨站脚本攻击

1.post数据封装转义函数 防sql注入 eag&#xff1a;addslashes($username);​addslashes($password);​eag:防止sql注入函数封装function deepslashes($data){#判断$data的表现形式 并且需要处理空的情况if(empty($data)){return($data);}​#高级简写 return is_array($data) …

visual studio 按钮判断管理员和用户_用户管理的设计原则

后台的使用者通常是企业的各类权限的管理员&#xff0c;通过对用户管理的合理设计&#xff0c;让管理员准确、高效地完成既定任务&#xff0c;来实现用户管理的价值。后台产品的使命是为企业提升效率&#xff0c;降低成本&#xff0c;而用户管理是后台的核心部分&#xff0c;用…

php 随机颜色,php生成随机颜色的代码实例

PHP生成随机颜色的代码实例&#xff1a;方法一&#xff1a;function color_txt($str){if ( is_array($str) ){$str $str[1];}$len mb_strlen($str);$colorTxt ;for($i0; $i$colorTxt . .mb_substr($str,$i,1,utf-8).;}return $colorTxt;}function rand_color(){re…

windows。forms.timer设置第一次不等待_面试官:换人!他连 TCP 这几个参数都不懂(一)...

前言TCP 性能的提升不仅考察 TCP 的理论知识&#xff0c;还考察了对于操作系统提供的内核参数的理解与应用。TCP 协议是由操作系统实现&#xff0c;所以操作系统提供了不少调节 TCP 的参数。如何正确有效的使用这些参数&#xff0c;来提高 TCP 性能是一个不那么简单事情。我们需…

php 输出可以设置格式文件,php格式输出文件var_export函数实例

本文实例讲述了php格式输出文件var_export函数的用法。分享给大家供大家参考。具体如下&#xff1a;var_export:php 4 > 4.2.0, php 5var_export -- 输出或返回一个变量的字符串表示.描述:mixed var_export (mixed expression [,bool return])此函数返回关于传递给该函数的变…

python tornado websocket_基于Python Tornado框架的websocket服务

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。Tornado中定义了tornado.websocket.WebSocketHandler来处理websocket请求。Tornado框架的安装以及入门这里就不说了&#xff0c;想入门tornado的请移步我的另一篇文章奥小飞&#xff1a;基于Python的…

微信网页开发教程 php,PHP实现微信网页授权开发教程,php授权教程_PHP教程

PHP实现微信网页授权开发教程&#xff0c;php授权教程微信网页授权是服务号才有的高级功能&#xff0c;开发者可以通过授权后获取用户的基本信息&#xff1b;在此之前&#xff0c;想要获取消息信息只能在用户和公众号交互时根据openid获取用户信息&#xff1b;而微信网页授权可…

lstm原文_LSTM模型与水文模型在径流模拟中的比较

学术简报题目:Comparison of Long Short Term Memory Networks and the Hydrological Model in Runoff Simulation作者:Hailin You1,Hongxiang Fan2,Ligang Xu2,Yongmi Wu1,*,Lizhen Liu2 and Zhong Yao1作者单位:1 Poyang Lake Research Center, Jiangxi Academy of Sciences,…

php 获取已用空间,PHP5:获取导入的名称空间列表 - php

是否可以在当前上下文中获取PHP文件中所有导入的类/命名空间的列表&#xff1f;例如&#xff1a;namespace A;use B, C\D;我想得到这个数组&#xff1a;array(B, C\D);原因是我正在构建一个Mapper注册表&#xff0c;并且希望能够在当前上下文中使用别名类名而不是全名来查询该M…

[英语单词] piss in the wind

有点粗俗的俚语&#xff1a;piss in the wind。 感觉这个谚语是写在实&#xff1a;就是找不准点&#xff0c;pointless&#xff1b;然后引申代表是浪费时间。 https://lkml.org/lkml/2006/10/10/130 This is not a pointless piss-in-the-wind discussion; unless we define ra…

pythonos模块介绍_Python OS模块介绍

OS模块简单的来说它是一个Python的系统编程的操作模块&#xff0c;可以处理文件和目录这些我们日常手动需要做的操作。可以查看OS模块的帮助文档&#xff1a;>>> import os #导入os模块>>> help(os) #查看os模块帮助文档&#xff0c;里面详细的模块相关函数…

php 安装 bzip2,php如何安装bzip2

php安装bzip2的方法&#xff1a;首先安装扩展依赖的系统bzip2开发库&#xff1b;然后编译安装php源码包目录下的“ext/bz2”扩展&#xff1b;最后修改“php.ini”配置文件即可。php安装bzip2安装扩展依赖的系统bzip2开发库sudo yum install bzip2-devel编译安装php源码包目录下…