MATLAB智能算法 - AntColonyOptimization蚁群算法

AntColonyOptimization蚁群算法

智能算法是路线规划、深度学习等等一系列领域所使用的优化算法,是算法进阶之路的必备之路。

前言:本文主要围绕解决TSP旅行商问题展开,对于机器人的路线规划以及非线性方程求解的问题等解决方案
对于一些其他优化算法例如遗传算法解决一些现实问题都有实现!!

先看一下效果图:

蚁群算法解决TSP问题:

TSP问题

蚁群算法解决机器人路径规划问题:

路径规划

1、什么是蚁群算法

1.1、蚁群算法的来源

  同遗传算法相似,都来自于大自然的启迪。蚁群算法就来自于蚂蚁寻找食物过程中发现路径的行为。
  蚂蚁并没有视觉却可以寻找到食物,这得益于蚂蚁分泌的信息素,蚂蚁之间相互独立,彼此之间通过信息素进行交流,从而实现群体行为。

1.2、蚁群算法的基本原理

  基本原理的过程就是蚂蚁觅食的过程。首先,蚂蚁在觅食的过程中会在路径上留下信息素的物质,并在寻找食物的过程中感知这种物质的强度,并指导自己的行为方向,他们总会朝着浓度高的方向前进。因此可以看得出来,蚂蚁觅食的过程是一个正反馈的过程,该路段经过的蚂蚁越多,信息素留下的就越多,浓度越高,更多的蚂蚁都会选择这个路段。

2、蚁群算法的实现原理

2.1、蚁群算法实现的重要规则(细品

1. 避障规则
  如果蚂蚁要移动的方向有障碍物挡住,他会随机的选择另外一个方向,如果有信息素指引的话,会按照信息素的指引前进。
2. 散播信息素规则
  每只蚂蚁在刚找到食物的时候散发出来的信息素最多,并随着走选的距离,散播的信息越少。
3. 范围
  蚂蚁观察的范围有限,只能在局部的范围内进行选择。例如蚂蚁观察的范围为3*3,那么它能够移动的范围也就是在这个3*3区域内。
4. 移动规则
  前面也说过,蚂蚁的前进方向的选择依赖于信息素的浓度,回朝向信息素高的方向移动。当周围没有信息素或者信息素相同的时候,那么蚂蚁就会按照原来的方向继续前进,并且在前进方向上受到一个随机的扰动,为了避免再原地转圈,他会记住之前经过的点,下一次遇到的时候就会避开这个已经经过的点。
5. 觅食规则
  如果蚂蚁在感知范围内找到食物则直接过去,加速模型的收敛,否则朝着信息素高的方向前进,并且每只蚂蚁都有小概率的犯错误,从而不是信息素最多的点移动,打破局部最优解的情况。
6. 环境
  每只蚂蚁之间相互独立,他们依赖环境中的信息素进行交流。每只蚂蚁都仅仅能感知到环境内的信息。并且随机信息素会随着时间逐渐减少。如果这条路上经过的蚂蚁越来越少,那么信息素也会越来越少。

2.2、蚁群算法解决TSP问题的过程

  旅行商问题(Traveling saleman problem, TSP)是物流配送的典型问题,他的求解有十分重要的理论和现实意义。

  旅行商问题传统的解决方法都是遗传算法,但是遗传算法的收敛速度慢,具有一定的缺陷。

  在求解TSP蚁群算法中,每只蚂蚁相互独立,用于构造不同的路线,蚂蚁之间通过信息素进行交流,合作求解。

基本过程如下:

  1. 初始化,设置迭代次数;
  2. 将 ants 只蚂蚁放置到 cities 个城市上;
  3. ants只蚂蚁按照概率函数选择下一个城市,并完成所有城市的周游;
  4. 记录本次迭代的最优路线;
  5. 全局更新信息素。
  6. 终止。本例终止条件是迭代次数,也可以设置运行时间或最短路径的下限。
  7. 输出结果

  应用全局更新信息素来改变路径上信息素的值。当ants蚂蚁生成了ants个解,其中最短路径的是本代最优解,将属于这条路线上的所有关联的路线进行信息素更新。

  之所以使用全局信息素,是为了让最优路径上有格外的信息素支持,这样后面的蚂蚁会优先选择这条路线。并且伴随着信息素的挥发,全局最短路径关联路线信息素得到进一步增强。

3、蚁群算法TSP程序实现

3.1、程序中矩阵大小以及含义

程序中矩阵说明(首字母大写):

矩阵大小含义
Distance(城市数量,城市数量)表征各个城市之间的距离信息
Eta(城市数量,城市数量)表征各个城市之间的启发因子
Tau(城市数量,城市数量)表征各个城市之间信息素的值
Route(蚂蚁个数,城市数量)每只蚂蚁周游城市的记录矩阵
R_best(迭代次数,城市数量)每次迭代的最优路线
L_best(迭代次数,1)每次迭代的最短距离
L_ave(迭代次数,1)每次迭代的平均距离

3.2、整体架构

'3.3、初始化变量参数'
'3.4、初始化矩阵参数'

while '迭代次数'
    '3.5、安排蚂蚁初始位置'
    '3.6、蚂蚁周游'
    '3.7、记录最优路线以及最短距离'
    '3.8、更新信息素'
end
'3.9、结果输出'

3.3、初始化变量参数

初始化主要对程序当中重要参数进行声明。
程序实现:

% 随机产生40个城市的坐标
position = 50 * randn(40, 2);
epochs = 50;  % 迭代次数
% 蚂蚁个数最好大于等于城市个数,保证每个城市都有一个蚂蚁
ants = 40;  
alpha = 1.4;  % 表征信息素重要程度参数
beta = 2.2;  % 表征启发因子重要程度参数
rho = 0.15;  % 信息素挥发参数
Q = 10^6;  % 信息素增强系数
cities = size(position, 1);  % 城市个数

3.4、初始化矩阵参数

主要实现了重要矩阵声明以及初始化。
程序实现:

% 城市之间的距离矩阵
Distance = ones(cities, cities);
for i = 1: cities
    for j = 1: cities
        if i ~= j
            % 坐标点欧氏距离
            Distance(i, j) = ((position(i, 1) - position(j, 1))^2 + (position(i, 2) - position(j, 2))^2)^0.5;
        else
            % 因为后面要取倒数,所以取一个浮点数精度大小
            Distance(i, j) = eps;
        end
        Distance(j, i) = Distance(i, j);
    end
end
% 启发因子矩阵
Eta = 1./Distance;
% 信息素初始值每个路线均相同为 1
Tau = ones(cities, cities);
% 每只蚂蚁的路线图
Route = zeros(ants, cities);
epoch = 1;
% 记录每回合最优城市
R_best = zeros(epochs, cities);
% 记录每回合最短距离
L_best = inf .* ones(epochs, 1);
% 记录每回合平均距离
L_ave = zeros(epochs, 1);

3.5、安排蚂蚁初始位置

  主要是将所有的蚂蚁安置在所有的城市当中,蚂蚁个数 >= 城市个数。并且保证均匀分布。

% 初始随机位置
RandPos = [];
for i = 1: ceil(ants / cities)
    RandPos = [RandPos, randperm(cities)];
end
% 初始位置转置就对应了Route矩阵中每只蚂蚁的初始位置
Route(:, 1) = (RandPos(1, 1:ants))';

3.6、蚂蚁周游

  由于蚂蚁的初始位置已经确定,所有主要就是周游剩余的所有城市,循环(cities-1)次。里面的循环就是将所有的蚂蚁进行周游一次。

  对于每只蚂蚁的周游主要是对剩余的城市进行周游,不能重复拜访同一个城市。NoVisited矩阵存储着该蚂蚁未访问的城市。然后在所有没有访问过城市中选择一个。选择的方式也是类似于轮盘赌法。概率函数表征信息素和启发因子,两者有着不同的重要程度。
P = [ τ i j ( t ) ] α ⋅ [ η i j ] β P = [\tau_{ij}(t)]^\alpha · [\eta_{ij}]^\beta P=[τij(t)]α[ηij]β
其中 τ i j ( t ) \tau_{ij}(t) τij(t)为路线上 ( i , j ) (i, j) (i,j)上的信息素浓度; η i j \eta_{ij} ηij为路线上 ( i , j ) (i, j) (i,j)上的启发式信息;
程序实现:

for j = 2: cities
        for i = 1: ants
            Visited = Route(i, 1:j-1);
            NoVisited = zeros(1, (cities - j + 1));
            P = NoVisited;
            num = 1;
            for k = 1: cities
                if length(find(Visited == k)) == 0
                    NoVisited(num) = k;
                    num = num + 1;
                end
            end
            for k = 1: length(NoVisited)
                P(k) = (Tau(Visited(end), NoVisited(k))^alpha) * (Eta(Visited(end), NoVisited(k))^beta);
            end
            P = P / sum(P);
            Pcum = cumsum(P);
            select = find(Pcum >= rand);
            to_visit = NoVisited(select(1));
            Route(i, j) = to_visit;
        end
    end

3.7、记录最优路线以及最短距离

  计算每个回合每只蚂蚁走过的距离。并记录该回合最短路径,最短距离和平均距离。

Distance_epoch = zeros(ants, 1);
for i = 1: ants
    R = Route(i, :);
    for j = 1: cities - 1
        Distance_epoch(i) = Distance_epoch(i) + Distance(R(j), R(j + 1));
    end
    Distance_epoch(i) = Distance_epoch(i) + Distance(R(1), R(cities));
end
L_best(epoch) = min(Distance_epoch);
pos = find(Distance_epoch == L_best(epoch));
R_best(epoch, :) = Route(pos(1), :);
L_ave(epoch) = mean(Distance_epoch);
epoch = epoch + 1;

3.8、更新信息素

  更新信息素主要保证获得最优距离的那条路线的信息素得到最大的增强。

Delta_Tau = zeros(cities, cities);
for i = 1: ants
    for j = 1: (cities - 1)
        Delta_Tau(Route(i, j), Route(i, j + 1)) = Delta_Tau(Route(i, j), Route(i, j + 1)) + Q / Distance_epoch(i);
    end
    Delta_Tau(Route(i, 1), Route(i, cities)) = Delta_Tau(Route(i, 1), Route(i, cities)) + Q / Distance_epoch(i);
end
Tau = (1 - rho) .* Tau + Delta_Tau;
Route = zeros(ants, cities);

3.9、结果输出

  迭代完成后,在R_best矩阵中得到最短路径的最小路线,最后输出最优的结果。
结果输出实现:

Pos = find(L_best == min(L_best));
Short_Route = R_best(Pos(1), :);
Short_Length = L_best(Pos(1), :);
figure
subplot(121);
DrawRoute(position, Short_Route);
subplot(122);
plot(L_best);
hold on
plot(L_ave, 'r');
title('平均距离和最短距离');

画图函数实现:

function DrawRoute(C, R)
N = length(R);
scatter(C(:, 1), C(:, 2));
hold on
plot([C(R(1), 1), C(R(N), 1)], [C(R(1), 2), C(R(N), 2)], 'g');
hold on
for ii = 2: N
    plot([C(R(ii - 1), 1), C(R(ii), 1)], [C(R(ii - 1), 2), C(R(ii), 2)], 'g');
    hold on
end
title('旅行商规划');

4、结果

结果展示

最后

学习到的小伙伴,请不要吝啬自己的点赞机会哦,主页资源有更多的学习资料,谢谢支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode289:生命游戏

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 &am…

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析 在 Nest.js 应用中,当你试图通过 request.ip 获取客户端的 IP 地址时,如果总是返回 ::1 或者 ::ffff:127.0.0.1,这通常意味着请求来自本地主机。 因为在前后端分离应用中,前端请求后端服务一般的做法都是通过代理&…

springboot051医院管理系统(论文+源码)_kaic

医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系统的系统分析部分&#…

R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法,在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性,随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中,使用Bootstrap抽样生成不同的训练集&#xff…

2024大模型应用实践报告|附35页PDF文件下载

前言 今天分享的是大模型专题系列深度研究报告:《大模型专题:2024大模型应用实践报告:战略一致性,企业成功落地大模型的隐藏秘钥》 (报告出品方:爱分析) 报告共计:35页 1.报告综述…

某MDM主数据管理系统与微软Dynamic CRM系统(国内节点)集成案例

一、需求分析 需要完成的核心场景: 客户主数据:通过SAP PO集成中间件平台,某MDM主数据实时推送客户主数据信息至微软CRM系统,方便微软CRM系统进行客户方面的管理,并供微软CRM查询员工信息,修改员工&…

大数据-180 Elasticsearch - 原理剖析 索引写入与近实时搜索

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

【Eclipse系列】解决Eclipse中xxx.properties文件中文乱码问题

问题描述:由于eclipse对Properties资源文件的编码的默认设置是ISO-8859-1,所以在打开.properties文件时,会发现中文乱码了,如图: 解决方法: 1、一次生效法 右击该properties文件–>properties–>Re…

暖水毯/取暖毯语音识别控制芯片IC方案

暖水毯、取暖毯作为现代家居生活的温暖伴侣,其智能化升级已是大势所趋。在暖水毯与取暖毯中融入语音识别控制芯片IC方案,为用户的冬日取暖体验带来了革命性的变革。 一、暖水毯/取暖毯增加语音识别控制芯片方案,让产品能通过对话来调节&…

5种边界填充

目录 边界填充需要知道的两个东西什么算边界边界的范围是多少举例 复制填充反射法反射101法外包装法数值填充法原图代码最终效果 边界填充需要知道的两个东西 什么算边界 顾名思义:就是图片的最外边 边界的范围是多少 根据你自己的需要而设置 举例 这里我选择…

SpringBoot中集成海康威视SDK实现布防报警数据上传/交通违章图片上传并在linux上部署(附示例代码资源)

场景 需对接海康威视交通产品中的交通违章检测功能,实现车辆闯红灯时获取抓拍数据(车牌号)并获取上传的抓拍图片。 根据其官方资料设备网络SDK使用手册中说明,此流程需要可以通过报警布防方式进行。 访问官方下载SDK文档等资料 海康威视-引领智能物联…

【C++】stack(STL)

stack的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成…

幂律分布笔记

一、幂律分布的数据拟合 数据分箱: 所谓分箱就是对原始数据进行分组,然后对每一组内的数据进行平滑处理。常见的分箱方式主要有等深分箱、等宽分箱、用户自定义等 对数分箱: 对原数据进行分箱,第i个箱的宽度为bi,b…

双十一购物节有哪些好物值得入手?2024双十一好物清单合集分享

一年一度的双十一购物狂欢节即将来临,各大平台纷纷开启预热活动,伴随着品牌的疯狂折扣和满减优惠,众多商品即将迎来超值的价格。现在正是大家“剁手”换新装备的大好时机。作为一名深耕智能产品多年的资深达人,今天这期我将从不同…

【python】OpenCV—Sort the Point Set from Top Left to Bottom Right

文章目录 1、功能描述2、代码实现3、效果展示4、更多例子5、参考 1、功能描述 给出一张图片,里面含有各种图形,取各种图形的中心点,从左到右从上到下排序 例如 2、代码实现 import cv2 import numpy as npdef process_img(img):img_gray c…

Xshell使用密钥远程登录Ubuntu 22.04报错:所选的用户密钥未在远程主机上注册。请再试一次

报错截图如下: 问题原因: Ubuntu 22.04 不支持 Xshell使用的私钥。 查看系统支持的私钥:sudo sshd -T | egrep "pubkey" ~$ sudo sshd -T | egrep "pubkey" pubkeyauthentication yes pubkeyacceptedalgorithms ssh-ed…

2024最新Selenium自动化测试面试题!

1、什么是自动化测试、自动化测试的优势是什么? 通过工具或脚本代替手工测试执行过程的测试都叫自动化测试。 自动化测试的优势: 1、减少回归测试成本 2、减少兼容性测试成本 3、提高测试反馈速度 4、提高测试覆盖率 5、让测试工程师做更有意义的…

LeetCode刷题日记之贪心算法(四)

目录 前言柠檬水找零根据身高重建队列用最少数量的箭引爆气球总结 前言 在前几篇文章中,我们已经覆盖了贪心算法的基本思路和多种题型。这次我将继续分享几道具有挑战性的贪心题目。希望这篇文章能为大家带来更多解题灵感和技巧✍✍✍ 柠檬水找零 LeetCode题目链接…

openai swarm多智能体框架使用案例;调用第三方deepseek大模型接口服务

参考: https://github.com/openai/swarm 安装: pip install git+ssh://git@github.com/openai/swarm.git pip install python-dotenv 代码: .env OPENAI_BASE_URL="https://api.deepseek.com/v1" OPENAI_API_KEY

MPU6050简介

MPU6050是一款集成了三轴加速度计和三轴陀螺仪的六轴传感器模块,由InvenSense公司开发。它广泛应用于运动检测、姿态感知、手势识别、无人机控制等领域。 MPU6050的主要功能与特点 6轴传感器: 三轴加速度计:用于测量物体在X、Y、Z三个轴向上…