MATLAB实现蚁群算法栅格路径优化

news/2024/5/6 3:48:12

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法,常用于解决路径规划问题。在栅格路径优化中,蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤:

  1. 初始化参数

    (1)设置蚂蚁数量(popsize)、信息素挥发系数(ρ)、信息素增强系数(Q)、最大迭代次数、信息素重要程度因子(α)、启发函数重要程度因子(β)。
    (2)初始化信息素矩阵,设置为一个相同的较小正值,避让0.01。
    (3)定义栅格地图,包括障碍物、可行走区域等。
  2. 蚂蚁路径选择

    (1)每只蚂蚁从起点开始,根据转移概率公式选择下一个要移动的栅格。转移概率基于当前栅格与相邻栅格之间的信息素浓度和启发式信息,表达式如下:

    (1)式表示蚂蚁在t时刻由城市i选择城市j的概率。α是信息素在概率计算中的权重,它的值越大,信息素在蚂蚁选择下一个要到的城市中起到的作用越大。β是启发因子(在路径问题中常以d的倒数来表示)在概率计算中所占的权重,它的值越大,启发因子在蚂蚁选择城市的过程中所起的作用越大,allowed是不在蚂蚁禁忌表中的城市集合(在栅格问题中就是非障碍物和未走过的栅格的节点编号集)。

    (2)更新所选路径上的信息素浓度,通常包括信息素的挥发和增加:

    \tau_{ij}(t+1)=\rho\tau_{ij}(t)+\Delta \tau_{ij}(t,t+1)
    其中\tau_{ij}(t+1)表示在t+1次迭代时边ij上的信息素. ρ是信息素维持因子, 1-ρ是信息素挥发因子.\Delta \tau_{ij}(t,t+1)是所有蚂蚁在边ij上所释放的信息素的总和:\Delta\tau_{ij}(t,t+1)=\sum_{k=1}^{m}\Delta\tau_{ij}^{k}(t,t+1)

  3. 计算路径长度

    当所有蚂蚁都完成一次路径搜索后,计算每只蚂蚁所走路径的总长度。
  4. 更新信息素

    根据每只蚂蚁的路径长度和设定的规则,更新栅格地图上的信息素浓度。优质路径上的信息素会得到增强,而劣质路径上的信息素会逐渐挥发减少。
     
  5. 迭代优化

    重复步骤2至4,进行多次迭代,直到达到最大迭代次数或满足其他停止条件。
  6. 选择最优路径

    在所有蚂蚁走过的路径中,选择长度最短(或成本最低)的路径作为最优路径。
  7. 输出结果

    输出最优路径及其长度。

流程图如下:

本算法的关键在于邻近节点集的概念和数据设计

首先对整个场景进行栅格化, 并依次编号,如下表所示

7

8

9

4

5

6

1

2

3

然后构造一个cell变量nearcell或者一个邻接指示矩阵E

nearcell{1,1}=[2,4,5];

nearcell{2,1}=[1,3,4,5,6];

nearcell{3,1}=[2,5,6];

对于每一个i都有nearcell{i,1}=nearmat

nearmat是与节点i相邻的节点编号集合, 当然这个不能人工一个一个设定, 必须采用代码来自动设定, 根据栅格的特点, 我们可以用代码实现 ,其原理为:
对于任何一个栅格中的节点(如节点5),其周边有8个邻近节点(如果是在边界,则代码在后面进行了边界约束),其行号和列号与节点的行列号是有规律的,因此可以采用代码进行设置。具体实现如nearfun函数所示。

有了nearcell,那么就可以很简单的使用蚁群算法进行路径规划了,当然有可能走死胡同,这个就必须再设计一个回滚函数,走了死胡同就回滚。

部分MATLAB主程序如下:


clc;close all;clear all;warning off;%清除变量
rand('seed', 100);
randn('seed', 100);
format long g;xmin=0;
xmax=100;
ymin=0;
ymax=100;nx=10;% 划分数
ny=10;% 划分数
dx=(xmax-xmin)/nx;
dy=(ymax-ymin)/ny;
[nodetable,XY,nodnumber]=nodetabelfun(nx,ny,dx,dy);% 计算节点表格
XY(:,1)=XY(:,1)+xmin;
XY(:,2)=XY(:,2)+ymin;
gamma=0.2;
bocktable=bocktablefun(nodnumber,gamma);nodeset= find(bocktable==1);
title1='栅格模型';
drawshelf(XY,dx,dy,nodeset,title1);% 绘图[neartable,E,G]=nearfun(nodetable,nodnumber,nx,ny,bocktable);% 计算节点邻接表格nodenumber=size(XY,1);
dmat=distancetable(XY,E);
startnodeID=1;% 起点
targetnodeID=20;% 终点maxgen=50;% 迭代次数
popsize=10;  % 蚂蚁数量alpha=2; % 信息素重要程度因子
beta=3; % 启发函数重要程度因子
rho=0.1; % 信息素挥发因子
Q=1;tic;
Eta=0.01*ones(nodenumber,nodenumber);
tocL=length(targetnodeID);
Ttable02=topo_table(E);tracemat=zeros(maxgen,2);
Tau = ones(nodenumber,nodenumber);  % 信息素矩阵初始化
gen = 1;                            % 迭代次数初值tic;
wait_hand = waitbar(0,'running...', 'tag', 'TMWWaitbar');
while gen<=maxgen% 多次循环ACOChrom=zeros(popsize,nodenumber);for i=1:popsize% 每个蚂蚁循环Ttable01=Ttable02;route=startnodeID;state=1;number_dem=targetnodeID;while state~=0curr_node=route(end);curr_topolopy=Ttable01(curr_node).topolopy;n=length(route);for k=1:nendP=P/sum(P);Pc=cumsum(P);target_index=find(Pc >= rand);next_node=curr_topolopy(target_index(1));route=[route next_node];else[state,route,Ttable01]=getroutefun(route,Ttable01,state,curr_node);endif route(end)==number_demstate=0;endendL1=length(route);ACOChrom(i,1:L1)=route;endcost= decodingFun(ACOChrom,popsize,dmat);% 计算目标函数[costu,inputps]=mapminmax(cost',100,200);costu=costu';% 记录结果[v1,index1]=min(cost);if gen==1bestlong001=v1;bestroute=ACOChrom(index1,:);endif bestlong001>v1;bestlong001=v1;bestroute=ACOChrom(index1,:);endtracemat(gen,1)=bestlong001;tracemat(gen,2)=mean(cost);Tau=updatetaufun(rho,Q,nodenumber,popsize,ACOChrom,costu,Tau);% 更新信息素gen=gen+1;waitbar(gen/maxgen,wait_hand);
end
delete(wait_hand);
toc% 输出结果
disp('蚁群算法得到的最优路径');
bestroute=bestroute(bestroute>0)% 绘图
title1='蚁群算法得到的路径';
startnodeID=bestroute;
drawshelf2(XY,dx,dy,nodeset,startnodeID,title1)figure;
plot(tracemat(:,1),'r-','linewidth',1);
legend({'最优值'},'fontname','宋体');
xlabel('迭代次数','fontname','宋体');
ylabel('目标函数','fontname','宋体');
title('蚁群算法迭代曲线','fontname','宋体');

程序结果:

时间已过 0.000757 秒。
时间已过 3.196282 秒。
蚁群算法得到的最优路径

bestroute =

     1    11    22    13     4     5     6     7     8    19    20

>> 


http://www.mrgr.cn/p/37222310

相关文章

NumPy 1.26 中文官方指南(五)

NumPy 许可证原文:numpy.org/doc/1.26/license.htmlCopyright (c) 2005-2023, NumPy Developers. All rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:* …

NumPy 1.26 中文官方指南(一)

NumPy 用户指南原文:numpy.org/doc/1.26/user/index.html本指南是一个概述,解释了重要特性;细节请参阅 NumPy 参考文档。 入门指南什么是 NumPy?安装NumPy 快速入门NumPy:初学者的绝对基础基础知识和用法NumPy 基础知识数组创建对 ndarrays 进行索引使用 NumPy 进行 I/O数…

5分钟——快速搭建后端springboot项目

5分钟——快速搭建后端springboot项目 1. idea新建工程2. 构建pom.xml文件3. 构建application.yml配置文件4. 构建springboot启动类5. 补充增删改查代码6. 运行代码7. 下一章 1. idea新建工程 点击右上角新建一个代码工程 别的地方不太一样也不用太担心&#xff0c;先创建一个…

NumPy 1.26 中文官方指南(二)

NumPy 1.26 中文官方指南(二) NumPy: 绝对初学者的基础知识原文:numpy.org/doc/1.26/user/absolute_beginners.html欢迎来到 NumPy 的绝对初学者指南!如果你有评论或建议,请不要犹豫联系我们! 欢迎来到 NumPy! NumPy(Numerical Python)是一个开源的 Python 库,几乎在…

spark standalone同时运行pyspark和spark-shell

需要限制资源数量,使用 spark.cores.max 或 --total-executor-cores 来指定最大核数。 假设集群一共4c5.6g pyspark(使用2c2g) from pyspark.sql import SparkSessionspark = SparkSession.builder \.master("spark://worker1:7077") \.appName("pysparkApp&…

解决Vue3项目运行控制台警告

运行Vue3项目,控制台警告:Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to ge…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&…

解决警告

运行Vue3项目,控制台警告:Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to ge…

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui-键盘

文章目录 键盘键盘——记忆宫殿入门——通过键盘发送一个字符串——typewrite()常规——键名——typewrite()常规——按下键盘——keyDown()常规——释放键盘——keyUp()升级——热键组合——hotkey() 键盘 pyautogui也有一些函数向计算机发送虚拟按键&#xff0c;让你能够填充…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

手撕sql面试题:根据分数进行排名,不使用窗口函数

分享一道面试题&#xff1a; 有一个分数表id 是该表的主键。该表的每一行都包含了一场考试的分数。Score 是一个有两位小数点的浮点值。 以下是表结构和数据&#xff1a; Create table Scores ( id int(11) NOT NULL AUTO_INCREMENT, score DECIMAL(3,2), PRIMARY KEY…

OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像、文本到视频、图像到视频、视频到视频和无限长视频的生成需求。我们来试试效果。 生成个横屏圣诞雪景,发b站再生成个竖屏,发抖音还能生成16秒的长视…

解决宏定义后面无法加分号

总结&#xff1a;注意是针对单行if语句使用&#xff0c;并且宏定义后面必须带分号&#xff08;格式统一&#xff09; 参考连接 C语言种do_while(0)的妙用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1vk4y1R7VJ/?spm_id_from333.337.search-card.all.click&vd_…

OpenCV——Bernsen局部阈值二值化方法

目录 一、Bernsen算法1、算法概述2、参考文献二、代码实现三、结果展示Bernsen局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Bernsen算法 1、算法概述 Bernsen 算法是另一种流行的局部阈值二值化方…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器&#xff0c;这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 、浏览器访问 http://10.…

Microchip 32位MCU CAN驱动图文教程-附源码

文章目录 创建一个新的32位MCU工程Microchip MCC Harmony配置界面说明在MCC下配置系统的时钟在MCC下配置所需要使用的模块配置调试打印模块配置CAN模块配置管脚功能修改系统堆栈大小生成代码 添加用户代码 创建一个新的32位MCU工程 确保电脑上已经安装最新的MPlab X IDE、XC32编…

黑龙江—等保测评三级安全设计思路

需求分析 6.1、 系统现状 6.2、 现有措施 目前&#xff0c;信息系统已经采取了下述的安全措施&#xff1a; 1、在物理层面上&#xff0c; 2、在网络层面上&#xff0c; 3、在系统层面上&#xff0c; 4、在应用层面上&#xff0c; 5、在管理层面上&#xff0c; 6.…

几种中文字体的比较

根据自己的喜好给常见的几个中文字体的打分:字体选项 字体名 得分adobe Adobe 宋体 Std 5fandol FandolSong 0founder 方正书宋_GPK 10hanyi 汉仪宋体 6sinotype 华文宋体 3win 中易宋体 9fandol 缺少偏僻字体,故得零分。

数据治理之数据质量管理

一、数据质量概述什么是数据质量数据质量差的危害数据质量维度(数据六大评价标准)什么是数据质量测量数据质量测量必须要有目的数据质量测量必须可重复数据质量测量必须可解释什么是数据质量管理二、数据问题根因分析什么是根因分析为什么要进行根因分析产生数据问题的阶段规…