Ⅰ A*算法——启发式路径搜索
A*是一种路径搜索算法,比如为游戏中的角色规划行动路径。
A* 算法的输入是, 起点(初始状态) 和 终点(目标状态) ,以及两点间 所有可能的路径 ,以及涉及到的 中间节点(中间状态) ,每两个节点间的路径的 代价 。
一般还需要某种 启发函数 ,即从任意节点到终点的近似代价,启发函数能够非常快速的估算出该代价值。
输出是从 起点到终点的最优路径 ,即代价最小。同时,好的启发函数将使得这一搜索运算尽可能高效,即搜索尽量少的节点/可能的路径。
f(n)=g(n)+h(n)
f(n) 是从初始状态经由状态n到目标状态的代价估计
g(n) 是在状态空间中从初始状态到状态n的实际代价
h(n) 是从状态n到目标状态的最佳路径的估计代价
A*算法是从起点开始,检查所有可能的扩展点(它的相邻点),对每个点计算g+h得到f,在所有可能的扩展点中,选择f最小的那个点进行扩展,即计算该点的所有可能扩展点的f值,并将这些新的扩展点添加到扩展点列表(open list)。当然,忽略已经在列表中的点、已经考察过的点。
不断从open list中选择f值最小的点进行扩展,直到到达目标点(成功找到最优路径),或者节点用完,路径搜索失败。
算法步骤:
参考
A* 算法步骤的详细说明请参考 A*寻路算法 ,它包含图文案例清楚的解释了A*算法计算步骤的一些细节,本文不再详细展开。
看一下上面参考文档中的案例图,最终搜索完成时,蓝色边框是close list中的节点,绿色边框是open list中的节点,每个方格中三个数字,左上是f(=g+h),左下是g(已经过路径的代价),右下是h(估计未经过路径的代价)。蓝色方格始终沿着f值最小的方向搜索前进,避免了对一些不好的路径(f值较大)的搜索。(图片来自 A*寻路算法 )
现在我们可以理解,A*算法中启发函数是最重要的,它有几种情况:
1) h(n) = 0
一种极端情况,如果h(n)是0,则只有g(n)起作用,此时A*演变成Dijkstra算法,这保证能找到最短路径。但效率不高,因为得不到启发。
2) h(n) < 真实代价
如果h(n)经常都比从n移动到目标的实际代价小(或者相等),则A*保证能找到一条最短路径。h(n)越小,A*扩展的结点越多,运行就得越慢。越接近Dijkstra算法。
3) h(n) = 真实代价
如果h(n)精确地等于从n移动到目标的代价,则A*将会仅仅寻找最佳路径而不扩展别的任何结点,这会运行得非常快。尽管这不可能在所有情况下发生,你仍可以在一些特殊情况下让它们精确地相等(译者:指让h(n)精确地等于实际值)。只要提供完美的信息,A*会运行得很完美,认识这一点很好。
4) h(n) > 真实代价
如果h(n)有时比从n移动到目标的实际代价高,则A*不能保证找到一条最短路径,但它运行得更快。
5) h(n) >> 真实代价
另一种极端情况,如果h(n)比g(n)大很多,则只有h(n)起作用,A*演变成BFS算法。
关于启发函数h、Dijkstra算法、BFS(最佳优先搜索)算法、路径规划情况下启发函数的选择、算法实现时List的数据结构、算法变种等等更多问题,请参考: A*算法
Ⅱ 路径分析的最优路径分析方法
1.道路预处理
进行道路数据录入时,往往在道路的交叉接合处出现重叠或相离的情况,不宜计算机处理。因此,需要对原始数据进行预处理,使道路接合符合处理要求。进行预处理时,取每条线段的首末节点坐标为圆心,以给定的阈值为半径作圆域,判断其他线段是否与圆域相交,如果相交,则相交的各个线对象共用一个节点号。
2.道路自动断链
对道路进行预处理之后即可获得比较理想的数据,在此基础上再进行道路的自动断链。步骤如下:
(1)取出所有线段记录数n,从第一条线段开始;
(2)找出所有与之相交的线段并求出交点数m;
(3)将m个交点和该线段节点在判断无重合后进行排序;
(4)根据交点数量,该线段被分成m+1段;
(5)第一段在原始位置不变,后m段从记录尾开始递增;
(6)重复(2)~(5),循环至n。
3.节点匹配
拓扑关系需使用统一的节点。节点匹配方法是按记录顺序将所有线段的始末点加上相应节点号,坐标相同的节点共用一个节点号,与前面所有线段首末点都不相同的节点按自然顺序递增1。
4.迪杰克斯特拉(Dijkstra)算法
经典的图论与计算机算法的有效结合,使得新的最短路径算法不断涌现。目前提出的最短路径算法中,使用最多、计算速度比较快,又比较适合于计算两点之间的最短路径问题的数学模型就是经典的Dijkstra算法。
该算法是典型的单源最短路径算法,由Dijkstra EW于1959年提出,适用于所有弧的权均为非负的情况,主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。该算法的基本思想是:认为两节点间最佳路径要么是直接相连,要么是通过其他已找到的与起始点的最佳路径的节点中转点。定出起始点P0后,定能找出一个与之直接相连且路径长度最短的节点,设为P1,P0到P1就是它们间的最佳路径。
Dijkstra算法的基本流程如下:首先将网络中所有节点分成两组,一组包含了已经确定属于最短路径中点的集合,记为S(该集合在初始状态只有一个源节点,以后每求得一条最短路径,就将其加入到集合S中,直到全部顶点都加入到S中,算法就结束了);另一组是尚未确定最短路径的节点的集合,记为V,按照最短路径长度递增的次序依次把第二组的顶点加入到第一组中,在加入的过程中总保持从源点到S中各顶点的最短路径长度不大于从源点到V中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点距离就是从源点到此顶点的最短路径长度,V中的顶点距离是从源点到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
Ⅲ 基于激光雷达的SLAM和路径规划算法研究与实现
本文仅供学习使用,并非商业用途,全文是针对哈尔滨工业大学刘文之的论文《移动机器人的路径规划与定位技术研究》进行提炼与学习。论文来源中国知网,引用格式如下:
[1]刘文之. 基于激光雷达的SLAM和路径规划算法研究与实现[D].哈尔滨工业大学,2018.
相关坐标系转换原理已经在前一篇文章写完了,直接上转换方程。
这里他的运动模型选择的是基于里程计的运动模型,还有一种基于速度的运动模型,其实都差不多,整体思想都一样。里程计是通过计算一定时间内光电编码器输出脉冲数来估计机器人运动位移的装置,主要是使用光电码盘。根据光电码盘计算出此时轮子的速度,然后通过已知的轮子半径来获得单位时间 每个轮子 的位移增量。
高等数学可知单位时间位移增量就是速度,对速度在一定时间上进行积分就得到这一段时间所走过的路程。
根据上图,我们可以求出来机器人航向角角速度、圆弧运动半径和机器人角度变化量,由此可以解的机器人在当前时刻的位姿。
实际上也是有误差,所以单独依靠里程计会与实际结果产生较大误差,所以必须引入其他的外部传感器对外部环境的观测来修正这些误差,从而提高定位精度。
首先肯定需要将激光雷达所测得的端点坐标从极坐标、机器人坐标中转换到世界坐标中。
这张略过,暂时不需要看这个
路径规划算法介绍:
因为该算法会产生大量的无用临时途径,简单说就是很慢,所以有了其他算法。
了解两种代价之后,对于每一个方块我们采用预估代价与当前路径代价相加的方法,这样可以表示每一个路径点距离终点的距离。在BFS搜索过程的基础上,优先挑选总代价最低的那个路径进行搜索,就可以少走不少弯路。(算法讲解 https://www.bilibili.com/video/BV1bv411y79P?from=search&seid=3623681329596549549 )
在局部路径规划算法之中,我们选用DWA算法(dynamic window approach),又叫动态窗口法。动态窗口法主要是在速度(v, w)空间中采样多组速度,并模拟机器人在这些速度下一定时间内的轨迹。在得到多组轨迹后,对这些轨迹进行评价,选取最优的轨迹所对应的速度来驱动机器人运动。
state sampling就是按照之前给出的全局路径规划,无论是Dijkstra还是A* 都可以方便的得到state sampling,DWA算法所需要提前建立的action sampling有两种:
但是无论是什么情况,上述所做的工作就是把机器人的位移转化到世界坐标中来,而不是机器人坐标系。速度采样结束之后,只需要对小车的轨迹进行评判,就可以得到最优解了。下面介绍速度采样的办法。
对速度进行采样一般有以下三个限制:
当确定了速度范围之后,就需要根据速度分辨率来对小车速度离散化,在每一时刻将小车在不同直线速度角速度组合下所即将要行驶的距离都可视化出来。
其中每一条轨迹都是很多小直线连接起来的。
需要用评价函数来对上述轨迹进行选择,选择最适合的轨迹
最后为了让三个参数在评价函数里所发挥的作用均等,我们使用归一化处理来计算权重。
算法流程整体如下:
Ⅳ vc环境 最短路径算法
单源最短路径算法---Dijkstra算法
转自:http://space.flash8.net/space/html/07/14107_itemid_400760.html
算法介绍
Dijkstra算法是由荷兰计算机科学家艾兹格·迪科斯彻发现的。算法解决的是有向图中最短路径问题。
举例来说,如果图中的顶点表示城市,而边上的权重表示着城市间开车行经的距离。 Dijkstra算法可以用来找到两个城市之间的最短路径。
Dijkstra 算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。我们以V表示G中所有顶点的集合。每一个图中的边,都是两个顶点所形成的有序元素对。 (u,v)表示从顶点u到v有路径相连。我们以E所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定义。因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。边的花费可以想象成两个顶点之间的距离。任两点间路径的花费值,就是该路径 上所有边的花费值总和。已知有V中有顶点s及t,Dijkstra算法可以找到s到t的最低花费路径(i.e. 最短路径)。这个算法也可以在一个图中,找到从一个顶点s到任何其他顶点的最短路径。
算法描述
这个算法是通过为每个顶点v保留目前为止所找到的从s到v的最短路径来工作的。 初始时,源点s的路径长度值被赋为0(d[s]=0),同时把所有其他顶点的路径长度设为无穷大,即表示我们不知道任何通向这些顶点的路径(对于V中所有 顶点v除s外d[v]= ∞)。当算法结束时,d[v]中储存的便是从s到v的最短路径,或者如果路径不存在的话是无穷大。 Dijstra算法的基础操作是边的拓展:如果存在一条从u到v的边,那么从s到u的最短路径可以通过将边(u,v)添加到尾部来拓展一条从s到v的路 径。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的d[v]的值要小,我们可以用新值来替代当前d[v]中的值。拓展边的操作一直执行 到所有的d[v]都代表从s到v最短路径的花费。这个算法经过组织因而当d[u]达到它最终的值的时候没条边(u,v)都只被拓展一次。
算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点,而集合Q则保留其他所有顶点。集合S初始状态为空,而后每一步 都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中,算法对每条外接边(u,v)进行拓展。
伪码
在下面的算法中,u:=Extract_Min(Q)在在顶点集Q中搜索有最小的d[u]值的顶点u。这个顶点被从集合Q中删除并返回给用户。
function Dijkstra(G, w, s)
// 初始化
for each vertex v in V[G] {
d[v] := infinity
previous[v] := undefined
d[s] := 0
}
S := empty set
Q := set of all vertices
while Q is not an empty set { // Dijstra算法主体
u := Extract_Min(Q)
S := S union {u}
for each edge (u,v) outgoing from u
if d[v] > d[u] + w(u,v) // 拓展边(u,v)
d[v] := d[u] + w(u,v)
previous[v] := u
}
如果我们只对在s和t之间寻找一条最短路径的话,我们可以在第9行添加条件如果满足u=t的话终止程序。
现在我们可以通过迭代来回溯出s到t的最短路径
1 S := empty sequence
2 u := t
3 while defined u
4 insert u to the beginning of S
5 u := previous[u]
现在序列S就是从s到t的最短路径的顶点集.
时间复杂度
我们可以用大O符号将Dijkstra算法的运行时间表示为边数m和顶点数n的函数。
Dijkstra算法最简单的实现方法是用一个链表或者数组来存储所有顶点的集合Q,所以搜索Q中最小元素的运算(Extract-Min(Q))只需要线性搜索Q中的所有元素。这样的话算法的运行时间是O(n2)。
对 于边数少于n2稀疏图来说,我们可以用邻接表来更有效的实现Dijkstra算法。同时需要将一个二叉堆或者斐波纳契堆用作优先队列来寻找最小的顶点 (Extract-Min)。当用到二叉堆的时候,算法所需的时间为O((m+n)log n),斐波纳契堆能稍微提高一些性能,让算法运行时间达到O(m + n log n)。
相关问题和算法
在Dijkstra 算法的基础上作一些改动,可以扩展其功能。例如,有时希望在求得最短路径的基础上再列出一些次短的路径。为此,可先在原图上计算出最短路径,然后从图中删 去该路径中的某一条边,在余下的子图中重新计算最短路径。对于原最短路径中的每一条边,均可求得一条删去该边后子图的最短路径,这些路径经排序后即为原图 的一系列次短路径。
OSPF(open shortest path first, 开放最短路径优先)算法是Dijkstra算法在网络路由中的一个具体实现。
与Dijkstra算法不同,Bellman-Ford算法可用于具有负花费边的图,只要图中不存在总花费为负值且从源点 s 可达的环路(如果有这样的环路,则最短路径不存在,因为沿环路循环多次即可无限制的降低总花费)。
与最短路径问题有关的一个问题是旅行商问题(traveling salesman problem),它要求找出通过所有顶点恰好一次且最终回到源点的最短路径。该问题是NP难的;换言之,与最短路径问题不同,旅行商问题不太可能具有多项式时间算法。
如果有已知信息可用来估计某一点到目标点的距离,则可改用A*算法 ,以减小最短路径的搜索范围。
另外,用于解决最短路径问题的算法被称做“最短路径算法”, 有时被简称作“路径算法”。 最常用的路径算法有:
Dijkstra算法
A*算法
SPFA算法
Bellman-Ford算法
Floyd-Warshall算法
Johnson算法
所谓单源最短路径问题是指:已知图G=(V,E),我们希望找出从某给定的源结点S∈V到V中的每个结点的最短路径。
首先,我们可以发现有这样一个事实:如果P是G中从vs到vj的最短路,vi是P中的一个点,那么,从vs沿P到vi的路是从vs到vi的最短路。
Ⅳ 数学建模中,给出非常多的节点,求这些节点的最短路径(类似一条线的路径),应该用什么算法好
下面是我自己编写的一段代码,用来求过包含两千多个点的最短路,速度很快,比遗传、蚁群快而且最短路更短。你可以试试看,有问题再问我。
function [S,len]=short(P)
% 此程序用来求相同类型点间的最短路
% P表示某一类型的点的坐标矩阵
% p是最短路径
% d是路径权值和
%建立权值矩阵
n=length(P);%求该类型点的数量
W=zeros(n,n);
for i=1:n %计算权值并填充权值矩阵,由于各点联通,此权值矩阵就是该图的最短路矩阵
for j=(i+1):n
W(i,j)=sqrt((P(i,1)-P(j,1))^2+(P(i,2)-P(j,2))^2);
end
end
for i=2:n
for j=1:(i-1)
W(i,j)=W(j,i);
end
end
%求通过所有点的最短路
%先求从i点至j点,必须通过指定其他n-2个点的最短路,选出其中的的最短路
S=zeros(1,n);
S(1)=1; %先插入1,2点,以此为基准,每次插进一个新点
S(2)=2;
d1=2*W(1,2);
for i=3:n %新加入的点的标号
d1i=zeros(1,i); %插入第i个点,有i中可能的距离,其中最小值将为该轮的d1
for j=1:i %新加入点的位置,插入第i个点是有i个空位可供选择
if j==1 %在第一个空位插入
d1i(j)=d1+W(i,S(1))+W(i,S(i-1))-W(S(1),S(i-1)); %插入点在首端时,距离为原距离与第i点与上一次插入后的第1位置的点之间距离之和
end
if j>1 & j<i %在中间的空位插入
d1i(j)=d1+W(S(j-1),i)+W(i,S(j))-W(S(j-1),S(j));
end
if j==i
d1i(j)=d1+W(S(i-1),i)+W(S(1),i)-W(S(1),S(i-1));
end
end
[d1,I]=min(d1i);
S((I+1):i)=S(I:(i-1)); %将第I位后面的点后移一位
S(I)=i;%将第i点插入在I位置
end
len=d1;
下面这段代码是我用来把上面的结果保存到txt文件中的代码,如果你需要,可以用用。代码是我上次用过的没有改,你自己按照需要自己改吧。
clear
close all
clc
loaddata
X=[C;E;I;J];
[S,len]=short(X);
DrawPath(S,X);
print(1,'-dpng','cmeiju3.png');
% 将结果保存至txt文件
fid=fopen('cmeijulujin.txt','wt'); %创建alunjin.txt文件
fprintf(fid,'c号刀具\n');
fprintf(fid,'%d %d\n',X(S));
save('cmeijus','S');
save('cmeijulen','len');
Ⅵ 蚁群算法是什么
蚁群算法,又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。 它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质。针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值。
原理
设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼地编程,因为程序的错误也许会让你前功尽弃。这是多么不可思议的程序!太复杂了,恐怕没人能够完成这样繁琐冗余的程序。
然而,事实并没有你想得那么复杂,上面这个程序每个蚂蚁的核心程序编码不过100多行!为什么这么简单的程序会让蚂蚁干这样复杂的事情?答案是:简单规则的涌现。事实上,每只蚂蚁并不是像我们想象的需要知道整个世界的信息,他们其实只关心很小范围内的眼前信息,而且根据这些局部信息利用几条简单的规则进行决策,这样,在蚁群这个集体里,复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律!那么,这些简单规则是什么呢?
Ⅶ 计算机网络的最短路径算法有哪些对应哪些协议
用于解决最短路径问题的算法被称做“最短路径算法”,有时被简称作“路径算法”。最常用的路径算法有:
Dijkstra算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法,本文主要介绍其中的三种。
最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。
算法具体的形式包括:
确定起点的最短路径问题:即已知起始结点,求最短路径的问题。
确定终点的最短路径问题:与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题:即已知起点和终点,求两结点之间的最短路径。
全局最短路径问题:求图中所有的最短路径。
Floyd
求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。
Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题。
Floyd-Warshall算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。
Floyd-Warshall的原理是动态规划:
设Di,j,k为从i到j的只以(1..k)集合中的节点为中间节点的最短路径的长度。
若最短路径经过点k,则Di,j,k = Di,k,k-1 + Dk,j,k-1;
若最短路径不经过点k,则Di,j,k = Di,j,k-1。
因此,Di,j,k = min(Di,k,k-1 + Dk,j,k-1 , Di,j,k-1)。
在实际算法中,为了节约空间,可以直接在原来空间上进行迭代,这样空间可降至二维。
Floyd-Warshall算法的描述如下:
for k ← 1 to n do
for i ← 1 to n do
for j ← 1 to n do
if (Di,k + Dk,j < Di,j) then
Di,j ← Di,k + Dk,j;
其中Di,j表示由点i到点j的代价,当Di,j为 ∞ 表示两点之间没有任何连接。
Dijkstra
求单源、无负权的最短路。时效性较好,时间复杂度为O(V*V+E),可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。
源点可达的话,O(V*lgV+E*lgV)=>O(E*lgV)。
当是稀疏图的情况时,此时E=V*V/lgV,所以算法的时间复杂度可为O(V^2) 。可以用优先队列进行优化,优化后时间复杂度变为0(v*lgn)。
Bellman-Ford
求单源最短路,可以判断有无负权回路(若有,则不存在最短路),时效性较好,时间复杂度O(VE)。
Bellman-Ford算法是求解单源最短路径问题的一种算法。
单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。
与Dijkstra算法不同的是,在Bellman-Ford算法中,边的权值可以为负数。设想从我们可以从图中找到一个环
路(即从v出发,经过若干个点之后又回到v)且这个环路中所有边的权值之和为负。那么通过这个环路,环路中任意两点的最短路径就可以无穷小下去。如果不处理这个负环路,程序就会永远运行下去。 而Bellman-Ford算法具有分辨这种负环路的能力。
SPFA
是Bellman-Ford的队列优化,时效性相对好,时间复杂度O(kE)。(k< 与Bellman-ford算法类似,SPFA算法采用一系列的松弛操作以得到从某一个节点出发到达图中其它所有节点的最短路径。所不同的是,SPFA算法通过维护一个队列,使得一个节点的当前最短路径被更新之后没有必要立刻去更新其他的节点,从而大大减少了重复的操作次数。
SPFA算法可以用于存在负数边权的图,这与dijkstra算法是不同的。
与Dijkstra算法与Bellman-ford算法都不同,SPFA的算法时间效率是不稳定的,即它对于不同的图所需要的时间有很大的差别。
在最好情形下,每一个节点都只入队一次,则算法实际上变为广度优先遍历,其时间复杂度仅为O(E)。另一方面,存在这样的例子,使得每一个节点都被入队(V-1)次,此时算法退化为Bellman-ford算法,其时间复杂度为O(VE)。
SPFA算法在负边权图上可以完全取代Bellman-ford算法,另外在稀疏图中也表现良好。但是在非负边权图中,为了避免最坏情况的出现,通常使用效率更加稳定的Dijkstra算法,以及它的使用堆优化的版本。通常的SPFA。
Ⅷ 蚁群算法的概念,最好能举例说明一些蚁群算法适用于哪些问题!
概念:蚁群算法(ant colony optimization, ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。蚁群算法是一种模拟进化算法,初步的研究表明该算法具有许多优良的性质.针对PID控制器参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值仿真结果表明,蚁群算法具有一种新的模拟进化优化方法的有效性和应用价值
其原理:为什么小小的蚂蚁能够找到食物?他们具有智能么?设想,如果我们要为蚂蚁设计一个人工智能的程序,那么这个程序要多么复杂呢?首先,你要让蚂蚁能够避开障碍物,就必须根据适当的地形给它编进指令让他们能够巧妙的避开障碍物,其次,要让蚂蚁找到食物,就需要让他们遍历空间上的所有点;再次,如果要让蚂蚁找到最短的路径,那么需要计算所有可能的路径并且比较它们的大小,而且更重要的是,你要小心翼翼的编程,因为程序的错误也许会让你前功尽弃。这是多么不可思议的程序!太复杂了,恐怕没人能够完成这样繁琐冗余的程序
应用范围:蚂蚁观察到的范围是一个方格世界,蚂蚁有一个参数为速度半径(一般是3),那么它能观察到的范围就是3*3个方格世界,并且能移动的距离也在这个范围之内
引申:跟着蚂蚁的踪迹,你找到了什么?通过上面的原理叙述和实际操作,我们不难发现蚂蚁之所以具有智能行为,完全归功于它的简单行为规则,而这些规则综合起来具有下面两个方面的特点: 1、多样性 2、正反馈 多样性保证了蚂蚁在觅食的时候不置走进死胡同而无限循环,正反馈机制则保证了相对优良的信息能够被保存下来。我们可以把多样性看成是一种创造能力,而正反馈是一种学习强化能力。正反馈的力量也可以比喻成权威的意见,而多样性是打破权威体现的创造性,正是这两点小心翼翼的巧妙结合才使得智能行为涌现出来了。 引申来讲,大自然的进化,社会的进步、人类的创新实际上都离不开这两样东西,多样性保证了系统的创新能力,正反馈保证了优良特性能够得到强化,两者要恰到好处的结合。如果多样性过剩,也就是系统过于活跃,这相当于蚂蚁会过多的随机运动,它就会陷入混沌状态;而相反,多样性不够,正反馈机制过强,那么系统就好比一潭死水。这在蚁群中来讲就表现为,蚂蚁的行为过于僵硬,当环境变化了,蚂蚁群仍然不能适当的调整。 既然复杂性、智能行为是根据底层规则涌现的,既然底层规则具有多样性和正反馈特点,那么也许你会问这些规则是哪里来的?多样性和正反馈又是哪里来的?我本人的意见:规则来源于大自然的进化。而大自然的进化根据刚才讲的也体现为多样性和正反馈的巧妙结合。而这样的巧妙结合又是为什么呢?为什么在你眼前呈现的世界是如此栩栩如生呢?答案在于环境造就了这一切,之所以你看到栩栩如生的世界,是因为那些不能够适应环境的多样性与正反馈的结合都已经死掉了,被环境淘汰了! 蚁群算法的实现 下面的程序开始运行之后,蚂蚁们开始从窝里出动了,寻找食物;他们会顺着屏幕爬满整个画面,直到找到食物再返回窝。 其中,‘F’点表示食物,‘H’表示窝,白色块表示障碍物,‘+’就是蚂蚁了。
具体参考http://ke..com/view/539346.htm
希望对你有帮助,谢谢。