蚂蚁寻找食物的过程
此篇内容会给朋友们解释一下“蚂蚁寻找食物的过程”的内容进行分享,期望对各位网友们有几分帮助,欢迎大家收藏本站!
当蚂蚁出去寻找食物时,它会释放一种叫做信息素的物质来识别它的行走路径。当蚂蚁发现食物时,它会在回家的路上留下气味。
回到蚁巢后,它会**许多同伴沿着留下气味的路线寻找食物。在路上,蚂蚁会不断增强气味,找到食物后,他们会一起把食物搬回巢穴。
好文探索:10分钟搞懂蚁群算法
蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径。它们是如何做到的呢。
单只蚂蚁的行为及其简单,行为数量在10种以内,但成千上万只蚂蚁组成的蚁群却能拥有巨大的智慧,这离不开它们信息传递的方式——信息素。
蚂蚁在行走过程中会释放一种称为“信息素”的物质,用来标识自己的行走路径。在寻找食物的过程中,根据信息素的浓度选择行走的方向,并最终到达食物所在的地方。
信息素会随着时间的推移而逐渐挥发。
在一开始的时候,由于地面上没有信息素,因此蚂蚁们的行走路径是随机的。
蚂蚁们在行走的过程中会不断释放信息素,标识自己的行走路径。随着时间的推移,有若干只蚂蚁找到了食物,此时便存在若干条从洞穴到食物的路径。
由于蚂蚁的行为轨迹是随机分布的,因此在单位时间内,短路径上的蚂蚁数量比长路径上的蚂蚁数量要多,从而蚂蚁留下的信息素浓度也就越高。这为后面的蚂蚁们提供了强有力的方向指引,越来越多的蚂蚁**到最短的路径上去。
蚁群算法就是模拟蚂蚁寻找食物的过程,它能够求出从原点出发,经过若干个给定的需求点,最终返回原点的最短路径。这也就是著名的旅行商问题(TravelingSalemanProblem,TSP)。
本文使用蚁群算法来解决分布式环境下的负载均衡调度问题。
集群模式是目前较为常用的一种部署结构,也就是当单机处理能力无法满足业务需求,那么就增加处理节点,并由一个负载均衡器负责请求的调度。
然而对于一个庞大系统而言,情况往往比较复杂。集群中节点的处理能力往往各不相同,而且不同任务的处理复杂度也不尽相同。
那么负载均衡器如何进行任务分配,使得集群性能达到最优资源利用率达到最高呢这是一个极具挑战又很有价值的问题。
本文我们就采用蚁群算法来解决这一问题。
在开始之前,我们首先需要将“负载均衡调度”这个问题进行数学建模,量化各项指标,并映射到蚁群算法中。
求一种最优的任务分配策略,能够将N个长度不等的任务按照某一种策略分配给M个处理能力不同的服务器节点,并且N个任务的完成时间最短。
在这个问题中,我们将所有任务的完成时间作为衡量分配策略优良的指标。每一种分配策略都是这个问题的一个可行解。
那么具有最小完成时间的分配策略就是这个问题的最优解。
在正式开始之前,我们需要初始化任务数组和节点数组。
这里采用随机赋值的方式,我们给tasks随机创建100个任务,每个任务的长度是10~100之间的随机整数。再给nodes随机创建10个节点,每个节点的处理速度是10~100之间的随机整数。
OK,准备工作完成,下面来看蚁群算法的实现。
正如你所看到的,蚁群算法并不复杂,总体而言就是这三部:。
第一第二步都较为简单,相对复杂的代码在“迭代搜索”中。
那么下面我们就分别来看一下这三个步骤的实现过程。
通过上文的学习我们已经知道,当任务长度数组tasks和节点处理速度数组nodes确定下来后,所有任务的执行时间都是可以确定下来了,用公式tasks[i]/nodes[j]计算一下即可,也就是“时间=长度/速度”,小学数学知识。
OK,那么timeMatrix矩阵的计算也就是这样。
这里再次介绍下timeMatrix矩阵的含义:timeMatrix[i][j]表示任务i分配给节点j处理所需要的时间,其计算公式也就是:。
初始化信息素矩阵也就是将信息素矩阵中所有元素置为1、
这里再次重申一下信息素矩阵的含义,pheromoneMatrix[i][j]表示将任务i分配给节点j这条路径的信息素浓度。
注意:我们将负载均衡调度过程中的一次任务分配当作蚁群算法中一条路径。
如:我们将“任务i分配给节点j”这一动作,当作蚂蚁从任务i走向节点j的一条路径。 pheromoneMatrix[i][j]就相当于i——>j这条路径上的信息素浓度。
这个过程略微复杂,但也还好,且听我一一道来。
在整个蚁群算法中,一共要进行iteratorNum次迭代。
每一次迭代都会产生当前的最优分配策略,也就是“局部最优解”。迭代的次数越多,那么局部最优解就越接近于全局最优解。
迭代次数过多会造成负载均衡器大量的时间和性能上的开销,从而无法满足海量任务的调度。但迭代次数太少了,可能得到的并不是全局最优解。
那么这个问题如何解决呢有两种办法:。
这两种方式各有千秋,我们这里选择第一种——限定迭代次数。并且将迭代次数限定为1000次。
注意:收敛速度也是衡量算法优良的一个重要指标。比如算法1迭代10次就能找到全局最优解,而算法2迭代1000次才能找到全局最优解。
所以算法1的收敛速度要优于算法2、
蚁群算法一共要进行iteratorNum次迭代,每次迭代中,所有蚂蚁都需要完成所有任务的分配。
因此上述算法采用了三层for循环,第一层用于迭代次数的循环,在本算法中一共要循环1000次。第二层用于蚂蚁的循环,本算法一共有10只蚂蚁,因此需要进行10次循环。第三层用于所有任务的循环,本算法一共有100个任务,因此需要循环100次,每一次循环,都将当前任务按照某一种策略分配给某一个节点,并在pathMatrix_oneAnt矩阵中记录蚂蚁的分配策略。
pathMatrix_oneAnt是一个二维矩阵,所有元素要么是0要么是1、
比如:pathMatrix_oneAnt[i][j]=1就表示当前蚂蚁将任务i分配给了节点j处理,pathMatrix_oneAnt[i][j]=0表示任务i没有分配给节点j处理。该矩阵的每一行都有且仅有一个元素为1,其他元素均为0。
每一只蚂蚁当完成这100个任务的分配之后,就会产生一个pathMatrix_oneAnt矩阵,用于记录该只蚂蚁的分配策略。那么当10只蚂蚁均完成任务的分配后,就会产生一个pathMatrix矩阵。
这是一个三维矩阵,第一维记录了蚂蚁的编号,第二维表示任务的下标,第三维表示节点的编号,从而pathMatrix[x][i][j]=1就表示编号为x的蚂蚁将任务i分配给了节点j处理。pathMatrix[x][i][j]=0就表示编号为x的蚂蚁没有将任务i分配给了节点j处理。
这10只蚂蚁完成一次任务的分配也被称为一次迭代。
每完成一次迭代后,都要使用calTime_oneIt函数在计算本次迭代中,所有蚂蚁的任务处理时间,并记录在timeArray_oneIt矩阵中。
在每次迭代完成前,还需要使用updatePheromoneMatrix函数来更新信息素矩阵。
下面就分别详细介绍迭代搜索过程中的三个重要函数:。
任务分配函数负责将一个指定的任务按照某种策略分配给某一节点处理。分配策略一共有两种:。
那么,这两种分配策略究竟如何选择呢答案是——根据当前蚂蚁的编号antCount。
通过上文可知,矩阵criticalPointMatrix用于记录本次迭代中,采用不同分配策略的蚂蚁编号的临界点。比如:criticalPointMatrix[i]=5就表示编号为0~5的蚂蚁在分配任务i的时候采用“按信息素浓度”的方式分配(即:将任务i分配给信息素浓度最高的节点处理)。而编号为6~9的蚂蚁在分配任务i时,采用随机分配策略。
每完成一次迭代,都需要计算本次迭代中所有蚂蚁的行走路径(即:所有蚂蚁的任务处理之间),并记录在time_allAnt矩阵中。
在实际的负载均衡调度中,各个节点的任务处理是并行计算的,所以,所有任务的完成时间应该是所有节点任务完成时间的最大值,并非所有任务完成时间的总和。
每完成一次迭代,就会产生一个time_allAnt矩阵,并且加入resultData矩阵中。当算法完成所有迭代后,所有蚂蚁的所有任务处理时间都被记录在resultData矩阵中,它是一个二维矩阵。
比如:resultData[x][y]=10代表第x次迭代中第y只蚂蚁的任务处理时间是10。
每完成一次迭代,都需要更新信息素矩阵,这个函数的包含了如下四步:。
横坐标为迭代次数,纵坐标为任务处理时间。
并且还使用一定概率的蚂蚁采用随机分配策略,以发现更优的方案。
从图中我们可以看到,大约迭代30次时,出现了全局最优解。
所有代码我已经上传至我的Github,大家可以随意下载。
精选问答:
1、蚂蚁之间是如何传递信息的?
蚂蚁之间传递信息主要依赖于化学物质和触觉相互作用。以下是几种常见的信息传递方式:
1. 化学信息素:蚂蚁会分泌一种称为信息素的化学物质,通过释放到环境中来传递信息。信息素会在空气中扩散,并被其他蚂蚁通过感知器官察觉。不同种类的信息素可以用来标记路径、标识食物或危险等。
2. 触觉通信:蚂蚁之间可以通过触碰和互相振动的方式传递信息。例如,当一只蚂蚁在寻找食物时,它可能会和其他蚂蚁碰触,通过触碰的方式告诉其他蚂蚁有食物,将其他蚂蚁引导到食物的方向。
3. 振动通信:某些蚂蚁种类可以通过振动身体或敲击地面来传递信息。它们通过特定的振动模式传达不同的含义,例如警告其他蚂蚁有危险或指示食物位置。
蚂蚁通过这些方式相互之间传递信息,能够有效地组织行为、寻找食物、警戒危险和搜索新的巢穴等。
2、当一只侦察蚂蚁发现食物时会向其他伙伴做出什么动作?
它会立即返回巢内,频频摆动触角,向其他蚂蚁报告自己的发现.
热门作者: 农业播报侠 种子小百科 农产新干线 农情领航灯 绿色农业防治通 种子故事