认识蚁群算法

好像是看罗胖的罗辑思维,看到过一种说法,越是准入门槛高的,难以取代的行业,所需的工具是越简单的。摄影师需要昂贵的镜头,而画家却只需要简单的纸笔,尽管照片比画逼真得多,但是却无法取代绘画的地位,而且通常优秀的射影作品的价值远远比不上优秀绘画作品的价值。在CS行业中也一样,写代码需要各种IDE,硬件环境,但是算法却早在计算机诞生之前就有了,应该说想要解决问题就会有算法,有了算法才能计算。所以,只会函数调用调参是不够的,要自己写代码,有自己的风格,有自己的想法,自己的算法。我也刚开始学习算法,开始啃《算法导论》,算是转行吧,学习图像处理也需要各种算法,今天就先研究与自己做的图像配准有关的蚁群算法。

很早就宣扬说21世纪是生物科学的世纪,没想到目前确是互联网的世纪。但互联网中确实运用了很多生物的思想。比如大热的神经网络,就是利用加权网络模拟神经和突触。在算法中也一样,遗传(进化)算法借鉴生物进化论,将问题模拟成一个生物进化的过程,通过复制、交叉、突变等操作产生下一代的解。旅行商问题TSP(Travel Salesperson Problem)中通常运用遗传算法求解,这在看算法导论的时候再好好研究。蚁群算法则是模拟蚂蚁觅食的过程,在1991年由意大利学者Marco Dorigo提出。我们就看看这个算法到底是怎么模拟的。

在蚁群算法中,一个关键词是信息素,它是一种激素,蚂蚁找到食物回家时释放关于食物的信息素,在出去找食物时在路径上留下关于家的信息素,浓度随着时间逐渐降低(更新机制)。但信息素有正反馈性,它会吸引附近的蚂蚁来到这条路径(选择机制),从而释放更多的信息素(更新机制)。这个选择的过程称为蚂蚁的自催化行为。值得一提的是对单个蚂蚁来说,是不存在所谓的最优路径的,蚂蚁根据概率随机选择一条路径,但蚁群会互相通信、协同工作(协调机制),会在客观上找到了最优路径,这就是群体智能。为了防止蚂蚁都选择当前信息素浓度最高的路径,只得到局部最优解,总有个别蚂蚁走向其他路径,从而跳出最优解,这就是出错机制。可以通过一个H5实验直观地观察一下,在这里。

以TSP问题为例,对蚁群算法建模。除了城市的数量,蚁群的数量,还有很多数据,这就凸显了数据结构的重要性。

说一下我理解的蚁群算法的整个流程。第一步当然是初始化,对每条边的信息素浓度初始化为常数,信息素改变量初始化为0。然后把蚂蚁分散到各个城市,他们依次开始周游。我们把从当前城市到下一个城市的概率称为转移概率,通过转移概率计算,转移概率综合考虑了信息素的吸引力和对城市间距离的衡量,权重通过、体现。每到过一个城市,会在禁忌表中添加该点,防止重复达到同一个城市。当该蚂蚁完成一次周游,记录这次周游的路径总长度,这里考虑蚂蚁一次周游释放的信息素总量是一定的,所以均匀分布在每次的转移路径中,这部分新增的信息素和之前的信息素残留构成了下次迭代的初始信息素浓度。迭代是指所有的蚂蚁都完成了周游,每次迭代过程中每只蚂蚁计算转移概率时认为信息素浓度暂时不变,只是当所有蚂蚁周游完即下一次迭代开始时才对信息素浓度进行更新,更新时会对各个蚂蚁走过的路径累加计算信息素浓度。这样,当迭代到一定次数,因为某一条路径信息素浓度足够高,会进行收敛,从而找到最优的路径。

从公式中可以得到更加清楚的认识:


$$\Delta \tau _{ij}^k = \frac{Q}{{\sum {{L_k}} }}{L_{ij}}$$     公式1

Q为信息素质量系数,是一个正的常数,表示蚂蚁一次释放的信息素绝对质量。分母表示蚂蚁k在本次周游中所走的路径总长度。Lij表示转移路径ij得到的信息素浓度。

$${\tau _{ij}}(t + n) = (1 - \rho ) \cdot {\tau _{ij}}(t) + \Delta {\tau _{ij}}$$       公式2

这个是每次迭代时信息素浓度的更新公式。综合考虑了原来的信息素浓度残留和刚才式1求得的新增的信息素浓度。

$$p_{ij}^k = \frac{{{\tau _{ij}}^\alpha \eta _{ij}^\beta }}{{\sum\limits_{j \in \Lambda } {\tau _{ij}^\alpha \eta _{ij}^\beta } }}$$     公式3

公式3是概率转移公式。得到概率之后按照轮盘赌的方式选择下一步的城市。只需要知道轮盘赌是一种随机性的选择方式就可以了当然还是概率大的更容易被选中。之后可以写文章研究一下。

下面是matlab代码:来自https://blog.csdn.net/longxinghaofeng/article/details/77740480

%蚁群算法求解TSP问题的matlab程序
clear all
close all
clc%初始化蚁群
m=31;%蚁群中蚂蚁的数量,当m接近或等于城市个数n时,本算法可以在最少的迭代次数内找到最优解
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975];%城市的坐标矩阵
Nc_max=200;%最大循环次数,即算法迭代的次数,亦即蚂蚁出动的拨数(每拨蚂蚁的数量当然都是m)
alpha=1;%蚂蚁在运动过程中所积累信息(即信息素)在蚂蚁选择路径时的相对重要程度,alpha过大时,算法迭代到一定代数后将出现停滞现象
beta=5;%启发式因子在蚂蚁选择路径时的相对重要程度
rho=0.5;%0<rho<1,表示路径上信息素的衰减系数(亦称挥发系数、蒸发系数),1-rho表示信息素的持久性系数
Q=100;%蚂蚁释放的信息素量,对本算法的性能影响不大%变量初始化
n=size(C,1);%表示TSP问题的规模,亦即城市的数量
D=ones(n,n);%表示城市完全地图的赋权邻接矩阵,记录城市之间的距离
for i=1:nfor j=1:nif i<jD(i,j)=sqrt((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2);endD(j,i)=D(i,j);end
end
eta=1./D;%启发式因子,这里设为城市之间距离的倒数
pheromone=ones(n,n);%信息素矩阵,这里假设任何两个城市之间路径上的初始信息素都为1
tabu_list=zeros(m,n);%禁忌表,记录蚂蚁已经走过的城市,蚂蚁在本次循环中不能再经过这些城市。当本次循环结束后,禁忌表被用来计算蚂蚁当前所建立的解决方案,即经过的路径和路径的长度
Nc=0;%循环次数计数器
routh_best=zeros(Nc_max,n);%各次循环的最短路径
length_best=ones(Nc_max,1);%各次循环最短路径的长度
length_average=ones(Nc_max,1);%各次循环所有路径的平均长度while Nc<Nc_max%将m只蚂蚁放在n个城市上rand_position=[];for i=1:ceil(m/n)  %朝正无穷方向取整   蚂蚁数量/城市数量rand_position=[rand_position,randperm(n)];endtabu_list(:,1)=(rand_position(1:m));%将蚂蚁放在城市上之后的禁忌表,第i行表示第i只蚂蚁,第i行第一列元素表示第i只蚂蚁所在的初始城市%m只蚂蚁按概率函数选择下一座城市,在本次循环中完成各自的周游for j=2:nfor i=1:mcity_visited=tabu_list(i,1:(j-1));%已访问的城市city_remained=zeros(1,(n-j+1));%待访问的城市probability=city_remained;%待访问城市的访问概率cr=1;%for循环用于求待访问的城市。比如如果城市个数是5,而已访问的城市city_visited=[2 4],则经过此for循环后city_remanied=[1 3 5]for k=1:nif length(find(city_visited==k))==0city_remained(cr)=k;cr=cr+1;endend%for循环计算待访问城市的访问概率分布,此概率和两个参数有关,一是蚂蚁当前所在城市(即city_visited(end))和待访问城市(即city_remained(k))路径上的信息素,一是这两者之间的启发因子即距离的倒数            for k=1:length(city_remained)probability(k)=(pheromone(city_visited(end),city_remained(k)))^alpha*(eta(city_visited(end),city_remained(k)))^beta;endprobability=probability/sum(probability);%按概率选取下一个要访问的城市pcum=cumsum(probability);%返回各列的累加值select=find(pcum>=rand);to_visit=city_remained(select(1));tabu_list(i,j)=to_visit;endendif Nc>0tabu_list(1,:)=routh_best(Nc,:);%将上一代的最优路径(最优解)保留下来,保证上一代中的最适应个体的信息不会丢失end%记录本次循环的最佳路线total_length=zeros(m,1);%m只蚂蚁在本次循环中分别所走过的路径长度for i=1:mr=tabu_list(i,:);%取出第i只蚂蚁在本次循环中所走的路径for j=1:(n-1)total_length(i)=total_length(i)+D(r(j),r(j+1));%第i只蚂蚁本次循环中从起点城市到终点城市所走过的路径长度endtotal_length(i)=total_length(i)+D(r(1),r(n));%最终得到第i只蚂蚁在本次循环中所走过的路径长度endlength_best(Nc+1)=min(total_length);%把m只蚂蚁在本次循环中所走路径长度的最小值作为本次循环中最短路径的长度position=find(total_length==length_best(Nc+1));%找到最短路径的位置,即最短路径是第几只蚂蚁或哪几只蚂蚁走出来的routh_best(Nc+1,:)=tabu_list(position(1),:);%把第一个走出最短路径的蚂蚁在本次循环中所走的路径作为本次循环中的最优路径length_average(Nc+1)=mean(total_length);%计算本次循环中m只蚂蚁所走路径的平均长度Nc=Nc+1%更新信息素delta_pheromone=zeros(n,n);for i=1:mfor j=1:(n-1)delta_pheromone(tabu_list(i,j),tabu_list(i,j+1))=delta_pheromone(tabu_list(i,j),tabu_list(i,j+1))+Q/total_length(i);%total_length(i)为第i只蚂蚁在本次循环中所走过的路径长度(蚁周系统区别于蚁密系统和蚁量系统的地方)enddelta_pheromone(tabu_list(i,n),tabu_list(i,1))=delta_pheromone(tabu_list(i,n),tabu_list(i,1))+Q/total_length(i);%至此把第i只蚂蚁在本次循环中在所有路径上释放的信息素已经累加上去end%至此把m只蚂蚁在本次循环中在所有路径上释放的信息素已经累加上去pheromone=(1-rho).*pheromone+delta_pheromone;%本次循环后所有路径上的信息素%禁忌表清零,准备下一次循环,蚂蚁在下一次循环中又可以自由地进行选择tabu_list=zeros(m,n);
end%输出结果,绘制图形
position=find(length_best==min(length_best));
shortest_path=routh_best(position(1),:)
shortest_length=length_best(position(1))
%绘制最短路径
figure(1)
set(gcf,'Name','Ant Colony Optimization——Figure of shortest_path','Color','r')
N=length(shortest_path);
scatter(C(:,1),C(:,2),50,'filled');
hold on
plot([C(shortest_path(1),1),C(shortest_path(N),1)],[C(shortest_path(1),2),C(shortest_path(N),2)])
set(gca,'Color','g')
hold on
for i=2:Nplot([C(shortest_path(i-1),1),C(shortest_path(i),1)],[C(shortest_path(i-1),2),C(shortest_path(i),2)])hold on
end
%绘制每次循环最短路径长度和平均路径长度
figure(2)
set(gcf,'Name','Ant Colony Optimization——Figure of length_best and length_average','Color','r')
plot(length_best,'r')
set(gca,'Color','g')
hold on
plot(length_average,'k')

这是结果找到的最佳路线图。原网址的代码写得很好,注释也很详细,就是图的配色有一点辣眼睛。



Reference:

1.https://blog.csdn.net/lzhf1122/article/details/72668977

2.https://blog.csdn.net/zhushuai1221/article/details/51076156 ACO应用、问题、趋势

3.https://blog.csdn.net/wang_Number_1/article/details/52467567

4.https://www.cnblogs.com/Leo_wl/p/5665715.html

5.https://www.cnblogs.com/tao-alex/p/6094483.html  表中的最后一列不理解


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

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

相关文章

postgresql数据类型转换

PostgreSQL数据类型转换需要使用语法 alter table tbname alter column fieldname type date_type 遇到需要转换为特殊类型如DATE、BOOL需要使用using子句 --转换为date类型 alter table tbname alter column fieldname type date using cast(fieldname as date)--转换为bool类…

薛定谔的猫跳进了生物学界,化学家表示:没有我可能办不到

来源&#xff1a;原理摘要&#xff1a;在生物科学界流传着“物理学家累了就来生物界玩一玩”的调侃。确实&#xff0c;现今学科之间密不可分&#xff0c;生物学的发展对特定物理技术的需求也越大。但是这样化学家却不满意了&#xff1f;1943年&#xff0c;物理学家薛定谔在都柏…

图像配准之特征点匹配的思考

最近赶时髦&#xff0c;看了一些智能优化算法如蚁群算法&#xff0c;还有机器学习的一些东西&#xff0c;就想着怎么把这些先进的东西用在图像配准中。头脑风暴了一下&#xff0c;觉得在已经检测到两幅图像的特征点的基础上&#xff0c;就如何对它们进行匹配似乎有优化的空间。…

软件工程实践小队Scrum Meeting

Scrum Meeting转载于:https://www.cnblogs.com/hjk-buaa/p/3382259.html

指针%p输出的一些认识

还是看源码发现的问题 static int import_lowe_features( char*filename, struct feature** features ) 这个函数的作用是将txt文件中的Lowe的特征点导入到feature结构体中。在这个函数中第二个参数是指向结构体的指针的指针。 f calloc( n, sizeof(struct feature) );//在内存…

全球智慧医疗产业发展现状

来源&#xff1a;无锡情报所摘要&#xff1a;全球智慧医疗市场主要集中在美国、欧洲、日本和中国,而产品生产主要集中在美国、欧洲和日本。 随着大数据、云计算、物联网和人工智能技术快速发展和普及&#xff0c;运用互联网应用平台提升医疗资源的使用效率、提高救治和服务水平…

textbox回车事件中拿不到text的处理办法(wpf)

wpf做一个搜索框&#xff0c;想要在回车时搜索框内的文字。 <TextBox x:Name"SearchBox" Grid.Column"1" Margin"350,35,52,21" Width"122" Height"34" RenderTransformOrigin"0.5,0.5" Text"{Binding K…

2018AI和机器学习界的12个重大收购案

来源&#xff1a;网络大数据据IDC声称&#xff0c;到2018年&#xff0c;全球人工智能(AI)和认知系统支出将达到190亿美元&#xff0c;这比2017年的支出总额增加约54%。并购在不断发生。仅2017年就见证了几起大宗收购&#xff0c;比如雅虎被Verizon收购、苹果收购Shazam等。知名…

PCA对特征点描述子降维

降维在机器学习领域其实是很重要的一部分&#xff0c;因为在高维情形下回出现样本稀疏&#xff0c;计算距离、内积困难&#xff0c;是所有机器学习面临的共同问题&#xff0c;被称为维数灾难&#xff08;Curse of dimensionality&#xff09;&#xff0c;而降维就是解决的一个办…

java快速获取大图片的分辨率(大图片格式JPG,tiff ,eg)

问题描述&#xff1a;怎样快速获取一个20MB图片的分辨率&#xff1f; 程序代码&#xff1a; 1 package test;2 3 import java.awt.Dimension;4 import java.awt.image.BufferedImage;5 import java.io.File;6 import java.io.IOException;7 import java.util.Iterator;8 import…

C语言基础知识整理

一、 关于sizeof和strlen。Sizeof&#xff08;&#xff09;用于计算某类型或者某变量在内存中所占空间。比如整数分为short型&#xff0c;int型&#xff0c;long整型&#xff0c;分别占2,2/4,4个字节&#xff0c;int型具体占用几个字节和编译系统有关。我们输入字符串时通常用c…

【2017-2019】Gartner战略技术趋势一览

来源&#xff1a;学术plus 、装备参考近期&#xff0c;Gartner公布了2019年十大战略技术趋势的预测&#xff0c;值此之际&#xff0c;本文总结回顾并简要分析了2017-2019三年的战略趋势变化。Gartner副总裁兼研究员David Cearley指出&#xff1a;在智能、数字、网格三大领域下的…

[wikioi]多源最短路

http://wikioi.com/problem/1077/ Floyd算法。精华是三层循环&#xff0c;if (dist(i,k) dist(k,j) < dist(i,j)) then dist(i,j) dist(i,k) dist(k,j)。 但循环的顺序必须k放在最外层&#xff0c;否则会错&#xff0c;因为有可能赋值给dist(i,j)的dist(i,k)和dist(k,j)都…

目标检测必看——RCNN是怎样融合了分类与回归,CNN与SVM

人和动物的区别之一是人能使用工具&#xff0c;而在人开始使用磨制石器时人类进入新石器时代。在目标检测领域&#xff0c;也有一个划时代的算法&#xff0c;在它之后目标检测开始进入深度学习的时代——它就是今天的主角&#xff1a;R-CNN。在RCNN之后&#xff0c;出现了更多优…

《自然》杂志:面对“电车难题”,不同国家的人有不同的道德选择

来源&#xff1a;36Kr电车难题原本只是一个思想实验。但是无人车的发展却绕不开这个问题。因为机器在无论如何都会撞死人的情况下必须靠预先植入的道德代码做出判断&#xff1a;该牺牲谁&#xff0c;该保谁。但是一项有全球230万人参与的调查表明&#xff1a;这个问题并不存在普…

Mac OS X Terminal 101:终端使用初级教程

文章目录1 为什么要使用命令行/如何开启命令行&#xff1f;2 初识Command Line3 关于 man 命令4 命令行&#xff0c;文件和路径 4.1 两种路径&#xff1a;绝对路径和相对路径4.2 切换到其他路径和目录4.3 处理特殊字符4.4 查看隐藏文件4.5 前往其他卷5 用Command-Line管理文件 …

Fast R-CNN整体把握

RCNN很好地解决了目标检测分类和定位的问题。但是缺点是速度太慢。 原因1&#xff1a;2k个候选区域都要经过变形成统一的正方形才能依次输入CNN进行特征提取。候选区域可能是互相包含的&#xff0c;这就导致原图同一个区域特征的重复提取。 原因2&#xff1a;RCNN的分类和回归…

2万字看完腾讯最纯粹的一届WE大会:从黑洞、虫洞到克隆猴

来源&#xff1a;虎嗅APP腾讯还有梦想&#xff0c;因为腾讯还有WE大会。5年来&#xff0c;腾讯从全世界邀请了几十位难得一见的科学家不远万里来到北京展览馆&#xff0c;比如去年邀请的剑桥大学教授、著名宇宙学家霍金&#xff08;视频演讲&#xff09;&#xff0c;不想成为绝…

深入浅出MongoDB(二)概述

上次的博文深入浅出MongoDB&#xff08;一&#xff09;NoSQL中我们已经简单介绍了一下NoSQL的基本概念&#xff0c;这次我们来了解一下MongoDB的相关概念。 1、简介 MongoDB是一款由C编写的高性能、开源、无模式的常用非关系型数据库产品&#xff0c;是非关系数据库当中功能最…

Fater R-CNN 整体把握

在R-CNN中提到过&#xff0c;候选区域的提取和之后的目标检测其实是独立的&#xff0c;所以我们可以使用任意的算法如SS。Fast-RCNN改进的是目标检测部分&#xff0c;但是其实候选区域的提取也挺费时的&#xff0c;Faster R-CNN就把改进方向放在了这里。 我们已经领略到了CNN的…