蚁群算法及蚂蚁系统的原理(js实现版)

蚁群算法
旅行商问题
蚁群系统
代码实现

蚁群算法

蚁群算法是著名的启发式算法,常用于解决最短路径问题

蚁群算法的来源

蚁群算法来源于对蚂蚁寻找食物行为的观察,蚂蚁个体并不存在太高的智慧,但蚁群整体却可以通过信息素来找到通往食物的最短路径

蚁群算法的原理

假设从a点到b点存在2条路径,而第一条路径l短,第二条路径m长。
刚开始时走l和m是随机的,但是由于l更短,所以重复频率也就更高,而留下的信息素浓度也就更高。
最终,大部分蚂蚁都会走l而不走m,这样也就是找到了最短路径。

旅行商问题

假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。这就是TSP,属于NPC问题。

使用图论来描述TSP问题

已知有n个点的完全图,每条边都有一个长度,求总长度最短的经过每个顶点正好一次的封闭回路

蚁群系统

蚁群系统

蚁群系统是第一个满足蚁群算法框架的算法

使用蚁群系统来解决TSP问题,其伪代码如下

function AntSystem () {Init()// 初始化 蚂蚁、图、信息素while(!isConvergence()) {// 如果未收敛或不满足其他停止条件则继续ContructSolution()// 对每个蚂蚁构造解PheromoneUpdate()// 信息素更新}
}
初始化

1.初始化节点与路径,并根据节点与路径生成图
2.初始化信息素,每条路径上的信息素都相等
3.随机化蚂蚁,使其分布于某一节点中,也可以不使用随机化。每个蚂蚁都会存储走过的路径与剩下可走的路径

蚂蚁抉择

对于每个蚂蚁,会从接下来可走的路径中进行选择,选择按照概率进行。
选择其中一条路径的计算公式为

p = 所选路径信息素*能见度 / 求和(每个路径的信息素*每个路径的能见度)

其中能见度为:
能见度 = 1/路径距离

选择其中一条路径后将该路径从未走路径加入到已走路径

信息素更新

在每个蚂蚁都走完后将更新信息素

每个路径上的信息素 = 原信息素*信息素挥发率 + 求和(1/每个经过该路径上的蚂蚁其行走总路径长度)

其中的信息素挥发率为0到1之间的常数,如果过低则难以收敛,过高则容易陷入局部最优解

终止条件

如果某一路径信息素要明显大于其余所有边的信息素的和则可以认定该路径满足收敛条件。
如果循环的次数超出最大则判断收敛失败。

代码实现

生成图代码
function Graph() {}Graph.prototype.setNode = (nodeArr, nodeMatrix) => {this.nodeArr = nodeArr;// 邻接矩阵// 矩阵中为null则代表该方向没有边this.nodeMatrix = nodeMatrix;};Graph.prototype.setValue = (start, end, value) => {const startNodeIndex = getNodeIndex(start, this.nodeArr);const endNodeIndex = getNodeIndex(end, this.nodeArr);if (startNodeIndex === -1 || endNodeIndex === -1) return;this.nodeMatrix[startNodeIndex][endNodeIndex] = value;};Graph.prototype.getValue = (start, end) => {const startNodeIndex = getNodeIndex(start, this.nodeArr);const endNodeIndex = getNodeIndex(end, this.nodeArr);if (startNodeIndex === -1 || endNodeIndex === -1) {debuggerreturn;}return this.nodeMatrix[startNodeIndex][endNodeIndex];};Graph.prototype.addValue = (start, end, value) => {const startNodeIndex = getNodeIndex(start, this.nodeArr);const endNodeIndex = getNodeIndex(end, this.nodeArr);if (startNodeIndex === -1 || endNodeIndex === -1) return;this.nodeMatrix[startNodeIndex][endNodeIndex] += value;};Graph.prototype.each = cb => {this.nodeMatrix.forEach((item, x) => {item.forEach((ite, y) => {if (ite !== null) {cb && cb(ite, x, y);}})})};Graph.prototype.xEach = cb => {this.nodeMatrix.forEach(cb);};Graph.prototype.getXArr = index => {if (index < 0) throw new Error('index不可小于0');return this.nodeMatrix[index];};const getNodeIndex = (node, nodeArr) => {return nodeArr.findIndex(x => x === node);};
蚁群系统代码
function AntSystem(nodeArr, nodeMatrix) {this.nodeArr = nodeArr;this.nodeMatrix = nodeMatrix;}AntSystem.prototype.init = function(theta) {this.theta = theta;this.graph = new Graph();this.nodeMatrix.forEach(item => {item.forEach((ite, i) => {// l: 距离// w: 信息素const l = ite;if (l !== null) {const w = 10;item[i] = {l, w}}})});this.graph.setNode(this.nodeArr, this.nodeMatrix);const ant = [];this.nodeArr.forEach(x => {ant.push({road: [x],});});this.ant = ant;};AntSystem.prototype.math = function() {// 计算最大迭代次数const antLen = this.ant.length;const nodeLen = this.nodeLen = this.nodeArr.length;const n = nodeLen - 1;const lineNum = this.lineNum = (n*n + n) / 2; // 路径的数量const maxNum = lineNum*lineNum; // 最大迭代次数let i = 0;let result;for (; i < maxNum; i++) {for (let j = 0; j < n; j++) {for (let k = 0; k < antLen; k++) {const nowAnt = this.ant[k];this.antChoice(nowAnt);}}this.systemUpdate();// 收敛判断result = this.isConvergence();if (result.success){break;}}result.twice = i;return result;};AntSystem.prototype.antChoice = function(ant) {const antRoad = ant.road;const antNowNode = antRoad[antRoad.length - 1];// 获取接下来可选的行走路径let roadList = this.nodeArr.filter(x=>antRoad.indexOf(x) === -1);if (roadList.length === 1) {antRoad.push(roadList[0]);return;}if (roadList.length === 0) {throw new Error('获取路径列表错误')}// 获取可行走路径的权重let weightList = [];roadList.forEach(x => {const obj = this.graph.getValue(antNowNode, x);let value = obj.w*(1/obj.l);if (!value) {value = 0;}weightList.push(value);});// 获取权重总和,以及根据根据修改后的权重以及随机数来判断走哪条路let total = 0;weightList.forEach((x, i) => {total += x;weightList[i] = total;});const random = Math.random() * total;// 根据随机数计算下一步走哪const weightIndex = weightList.findIndex(x => random < x);if (weightIndex === -1) {throw new Error('权重计算错误');} else {antRoad.push(roadList[weightIndex]);}};AntSystem.prototype.systemUpdate = function() {// 信息发挥率const theta = this.theta;// 根据挥发率重新计算权重this.graph.each(item => {item.w *= theta*1;});// 根据每个蚂蚁的行走路径计算总行走距离 lconst totalWalkList = this.ant.map(x => {let road = x.road;road.push(road[0]);let len = 0;for (let i = 1; i < road.length; i++) {const obj = this.graph.getValue(road[i-1], road[i]);len += obj.l;}return len;});// 根据距离为每条路径重新计算权重this.ant.forEach((x, i) => {const road = x.road;// 计算当前蚂蚁产生的信息素const thisAntWalkLen = totalWalkList[i];const pheromone = 1/thisAntWalkLen;for (let i = 1; i < road.length; i++) {const obj = this.graph.getValue(road[i-1], road[i]);obj.w += pheromone;}});// 重置当前蚁群的路径this.ant.forEach(item => {item.road.length = 1;});};AntSystem.prototype.isConvergence = function() {// 如果某条路径的信息素占比信息素总和一定概率则判断收敛let pheromoneTotal = 0;// 计算信息素总和this.graph.each(item => {const weight = item.w;pheromoneTotal += weight;});// 从第一个点开始选择,走信息素最高的道路然后计算该道路的信息素总和let roadPheromone = 0;let road = [];let arr = this.graph.getXArr(0);while (road.length < this.nodeArr.length) {let max = 0;let maxIndex = -1;arr.forEach((item,i) => {if (item === null) return;if (road.indexOf(i) === -1) {if (item.w > max) {max = item.w;maxIndex = i;}}});road.push(maxIndex);arr = this.graph.getXArr(maxIndex);roadPheromone += max;}// 当选择的路径信息素占比超过一定值时就算收敛const proportion = 0.95;const result = roadPheromone / pheromoneTotal;return {result,road,success: result > proportion}};
使用js实现的缺陷

js计算容易有偏差,且当数值过低时计算出的值容易出错,并且js计算效率并不高。

蚁群系统的局限

蚁群系统在节点过多时性能下降严重,目前已有很多基于蚁群系统的优化,这些优化后的算法效率更高,更不容易陷于局部最优解。

蚁群算法及蚂蚁系统的原理(js实现版)相关推荐

  1. 智能优化算法之蚁群算法(1)

    蚁群算法(ant colony algorithm) : 一种模拟进化算法 蚂蚁在觅食过程中能够在其经过的路径留下一种称为信息素的物质,并在觅食的过程中能感知这种物质的强度,并指导自己的行动方向,他们 ...

  2. 【配送路径规划】蚁群算法求解配送路径最短问题【含Matlab源码 2222期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  3. 【配送路径规划】基于matlab蚁群算法求解配送路径最短问题【含Matlab源码 2222期】

    ⛄一.VRP简介 1 VRP基本原理 车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一.VRP关注有一个供货商与K个销售点的路径规划的情况,可以简 ...

  4. 【路径规划】基于matlab GUI蚁群算法机器人栅格地图最短路径规划【含Matlab源码 927期】

    ⛄一.蚁群算法简介 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法.其中, 模拟蚁群觅食过程的蚁群优化算 ...

  5. 【ACO TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 1032期】

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

  6. 【优化求解】基于matlab蚁群算法配电网故障定位【含Matlab源码 165期】

    ⛄一.蚁群算法简介 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法.其中, 模拟蚁群觅食过程的蚁群优化算 ...

  7. 【ACO TSP】基于matlab改进的蚁群算法求解旅行商问题【含Matlab源码 242期】

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

  8. 【路径规划】蚁群算法求解电动汽车充电站与换电站协调路径规划【含GUI Matlab源码 796期】

    ⛄一.蚁群算法简介 1 引言 在自然界中各种生物群体显现出来的智能近几十年来得到了学者们的广泛关注,学者们通过对简单生物体的群体行为进行模拟,进而提出了群智能算法.其中, 模拟蚁群觅食过程的蚁群优化算 ...

  9. 蚂蚁算法python_蚁群算法python编程实现

    前言 这篇文章主要介绍了Python编程实现蚁群算法详解,涉及蚂蚁算法的简介,主要原理及公式,以及Python中的实现代码,具有一定参考价值,需要的朋友可以了解下. 蚁群算法简介 蚁群算法(ant c ...

最新文章

  1. centOS 7 安装man中文版手册
  2. linux下字符编码转换
  3. Java集合面试题?看这篇就够了!
  4. python 输出在固定位置_python多进程/线程抢占stdoutput总是在固定位置截断上个输出?...
  5. protobuf相关:反射、rmi
  6. what is the meaning of bring you up to speed?
  7. 信息学奥赛一本通C++语言——1002:输出第二个整数
  8. python文本分析工具_可以用来分析文本数据的Python工具的完整指南
  9. 左神算法学习日记——二叉树遍历(二)
  10. WEB-QTP随想录—李密的猜想
  11. H3C防火墙-安全域配置举例
  12. 梦中香巴拉——云南游记
  13. 快手开店怎么引流?快手小店自上线以来就吸引众多的商家入驻
  14. 如何进行内测分发?蒲公英内测托管平台使用教程
  15. OSI七层网络模型 TCP五层网络模型
  16. 如何搭建一个机器人控制系统
  17. 千年古都西安 一座城市的辉煌与梦想
  18. 快速查询快递物流,超24小时未更新物流弹窗提醒
  19. 竞价排名和php是什么,php做seo优化-竞价与查找引擎优化的差异是什么
  20. Warning: Class ‘com.xxx.xxx‘ not found in module ‘xxxx‘

热门文章

  1. Solidity 基础(一)
  2. 微星主板 Ubuntu20.04安装以及配置
  3. 利用反射动态修改 EasyPoi 导出Excel表格标题名称
  4. Coursera | Andrew Ng (01-week-2-2.6)—更多导数的例子
  5. 怎样防止表单重复提交
  6. 极客日报:iPhone 13或有8款配色;vivo百万年薪招工程师;特斯拉新增行车记录视频紧急情况自动保存功能
  7. 在这个五月《安装Linux》简直易如反掌
  8. 稳定性测试-几点总结
  9. 优化Docker镜像大小方案 2017年12月10日 17:54:46 阅读数:1774 标
  10. Axure 设计原型图 使用总结