引言
“算法”
优化、ACO )也称为蚂蚁算法,是在图中查找优化路径的概率技术。 通过kndl
Dorigo于1992年被引入他的博士论文,灵感来源于蚂蚁在寻找食物的过程中发现路径的行为。 蚁群算法是一种模拟进化的算法。 初步研究表明,该算法具有许多优良的性质。 针对PID控制器的参数优化设计问题,将蚁群算法设计的结果与遗传算法设计的结果进行了比较,数值模拟结果表明蚁群算法具有新的模拟进化优化方法的有效性和应用价值。 蚁群算法是一种求解组合优化问题的新型通用启发式方法,具有正反馈、方差计算、建设性贪婪启发式搜索丰富的特点。 由于蚁群算法具有这些优点,很多研究者都致力于研究和改变。 本文的目的是介绍蚁群算法,学习蚁群算法的制作方法。
二蚁群算法介绍
在昆虫世界里,蚂蚁的组成是群居的世袭大家庭,被称为蚁群。 蚂蚁有世袭制的蚁后(后)和工蚁两种,它们具有高度组织化的社会性,相互交流不仅可以利用触觉和视觉上的联系,在大规模的协调行动中也可以利用信息素(信息素)这样的信息媒介。
首先,要了解蚂蚁是如何觅食的。 蚂蚁平时在巢附近不规则地走。 找到食物后不要马上吃,送到巢里和其他蚂蚁分享,食物少的时候一个人回巢。 否则,将返回巢穴运送军队。 中途有激素残留,食物越大,激素浓度越高,可以吸引其他蚂蚁一起携带食物,最终将食物全部送回巢中。 这个过程用程序来实现看起来非常复杂,制造“智能”蚂蚁看起来也是不可能的。 事实上,每只蚂蚁都只做非常简单的工作。 检查有无某种范围内的食物,然后逐渐向荷尔蒙浓度的方向运动。 简而言之,蚁群运动只是同时重复执行多个简单的规则。 详细说明蚁群的简单规则。
1、范围:蚂蚁可观察的范围为yjfdyc世界,蚂蚁有速度半径(一般为3 )参数。 于是,可以观察的范围是3*3个yjfdyc世界,可以移动的距离也在该范围内。
2、环境:蚂蚁所处的环境是虚拟的世界,其中有障碍物,另有蚂蚁,还有外激素。 外激素有两种,一种是找到食物的蚂蚁溢出的食物外激素,另一种是找到巢的蚂蚁溢出的巢外激素。 所有蚂蚁只能感知其范围内的环境信息。 环境以一定的速度使激素消失。
3、觅食规则:在每只蚂蚁能感知的范围内寻找是否有食物,如果有就这样过去。 否则,看看是否有外激素,比较能感知范围内哪些点的外激素最多。 这样的话,去外激素多的地方,每只蚂蚁都会以少的概率犯错误,所以外激素最多的点并不是移动的。 蚂蚁找巢的规则和上述相同,但对巢中的激素有反应,对食物中的激素没有反应。
4、移动规则:每只蚂蚁向外激素最多的方向移动。 然后,如果周围没有外激素的诱导,蚂蚁就会按照自己本来的运动方向惯性地运动。 而且,在运动的方向上有随机的小干扰。 为了防止蚂蚁绕着圈走,要记住最近经过了哪个点,如果你发现走的下一个点已经经过了最近,就尽量避免。
5、屏障规则(蚂蚁要移动的方向有障碍物阻挡时,随机选择其他方向,有激素诱导时,按照觅食规则行动。
7、激素喷洒规则:每只蚂蚁在刚找到食物或巢的时候喷洒最多的激素,越走越远,喷洒的激素越少。
根据这几条规则,蚂蚁之间没有直接的关系,但每只蚂蚁都与环境相互作用,通过激素的纽带实际上将每只蚂蚁之间联系起来。 例如,一只蚂蚁发现食物时,它不直接告诉其他蚂蚁有食物,而是向环境喷洒激素,其他蚂蚁经过附近时,感觉到激素的存在,进而根据激素的指导找到食物。 可以将寻找食物的时间抑制在最小限度。
这个优化过程的本质是:
选择机制:信息素越多的途径,选择的概率越高。
更新机制:路径上的信息素随蚂蚁的经过而增加,同时随时间的推移逐渐挥发消失。
机制:蚂蚁之间实际通过分泌物相互通信协同工作。
蚁群算法利用了选择、更新、协调的优化机制,即通过个体间的信息交换和相互合作最终找到最优解,使其具有较强的发现最优解的能力。
三蚁群算法的实现
了解蚁群算法的本质后,写简单的蚁群算法并不是那么难。 重要的是实现上面介绍的一些规则。 以下,使用JAVA对上述规则的实现进行简单说明。
1、蚂蚁:蚂蚁是蚁群中最小的单位,因此是适用简单规则的最小个体。
公共类ant
{
公共的
Square
夸拉; //蚂蚁所在的yjfdyc
公共食品
CARRYING=
空值; //运送的食物数量
公共int
ID; //蚂蚁的号码
公共的
布尔帮助=
假; //你能帮我搬食物吗
公共语音移动(int turn ) )。
{
//蚂蚁移动到下一个yjfdyc
}
}
p>2、范围:蚂蚁所在的yjfdyc应该包含附近的yjfdyc编号,所含食物数量,蚂蚁数量,外激素的浓度,以及坐标等信息。
public class Square
{ public Square
NE; //附近的8个方向的yjfdyc
public
Square N;
public
Square NW;
public
Square W;
public
Square SW;
public
Square S;
public
Square SE;
public
Square E;
public
LinkedList
ANTS; //本yjfdyc中包含的蚂蚁
public
Food
FOOD; //本yjfdyc中包含的食物数
public
Nest
NEST; //yjfdyc为蚁穴
public
Pheromone_1
PHEROMONE_1; //本yjfdyc中的外激素含量
public
int
X; //本yjfdyc的坐标
public
int Y;
private
World
WORLD; //所属的环境
public
boolean
WALL; //是否有障碍物
public
Square(int x, int y, World world)
{
FOOD
= null;
NEST
= null;
PHEROMONE_1
= null;
X
= x;
Y
= y;
WORLD
= world;
WALL
= false;
ANTS
= new LinkedList();
}
3、环境:环境是由多个yjfdyc组成的,是一个平面的,因此用一个yjfdyc的二维数组来表示是最合适不过的。
public class World
{
private
Square[][]
WORLD; //定义环境二维数组
private
int
WIDTH; //环境的长宽
private
int HEIGHT;
private
Pheromone_1List
P1LIST; //保存所有外激素的列表
public
World(Pheromone_1List p1list)
{
this.WIDTH
= Settings.WIDTH;
this.HEIGHT
= Settings.HEIGHT;
this.P1LIST
= p1list;
WORLD
= new Square[WIDTH][HEIGHT];
}
4、觅食规则,移动规则和避障规则:这三种规则全都跟蚂蚁的移动方向有关,并在移动前都要先计算周围yjfdyc的外激素浓度,选择外激素浓度最高的yjfdyc方向移动。
private Square chooseBestSquare()
{
Square[] square_list = {SQUARE.E, SQUARE.NE, SQUARE.N, SQUARE.NW,
SQUARE.W, SQUARE.SW, SQUARE.S, SQUARE.SE};
double
current_best_value = 0;
double
value = 0;
Square
square = SQUARE;
//
选择最好的yjfdyc
for(int
i=0;i
{
value
= calculateSquareValue(square_list[i]);//计算yjfdyc值
if(value
> current_best_value)
{
current_best_value
= value;
square
= square_list[i];
}
}
if(square.ANTS.size()
>= Settings.MAXIMUM_NUMBER_OF_ANTS)
{
return SQUARE;
}
return
square;
}
private double
calculateSquareValue(Square s)
{
double[]
thresholds = Settings.THRESHOLDS;
if(s==null
|| s.WALL) // yjfdyc有障碍物
{
return
-100000;
}
//
计算yjfdyc中各项参数的值
return
s.getFood()*thresholds[0] //
食物
+
s.getPheromone_1() *
thresholds[1] //
外激素
}
5、播撒外激素规则:每只蚂蚁找到食物后会根据食物的数量播撒相应量的外激素,以便其它蚂蚁能够更快得找到这堆食物。
private void putPheromone_1(double
amount)
{
if(SQUARE.getPheromone_1()
< Settings.PHEROMONE_LIMIT)
SQUARE.addPheromone_1(amount);
}
从以上蚁群算法中各个要素的代码来看,实现蚁群算法并不难。每只蚂蚁并不是像我们想象的需要知道整个环境的信息,它们只关心很小范围内的眼前信息,而且根据这些局部信息利用几条简单的规则进行决策,这样,在蚁群这个集体里,复杂性的行为就会凸现出来。这就是人工生命、复杂性科学解释的规律。
四 蚁群算法的不足
本文实现的蚁群算法只是简单的大致模拟蚁群的觅食过程,真正的蚂蚁觅食过程远比这个复杂,比如增加蚂蚁搬运食物的距离和数量,蚂蚁在搬运食物发现更大的食物可能会丢弃原有食物,还可以增加蚂蚁搬运食物回蚁穴的最短路径的求解。同时需要注意的是,由于蚁群算法觅食的过程,蚁群算法可能会过早的收敛并陷入局部最优解。
JAVA实现蚁群算法
说明:信息素权重,路径权重和信息素蒸发率对最后的结果影响很大,需要微调。
目前发现2 / 5 /
0.5 能达到稍微让人满意的效果。本程序离完美的ACO还差很远,仅供参考。
本蚁群算法为AS算法。
用法:
1.new一个对象
ACOforTSP tsp = new
ACPforTSP(tsp数据文件名,迭代次数,蚂蚁数量,信息素权重,路径权重,信息素蒸发率);
2.用go()方法运行
tsp.go();
ACOforTSP.java
___________________________________________________________________
import java.io.File;
import static java.lang.Math.pow;
import static java.lang.Math.sqrt;
import static java.lang.Math.random;
import java.util.HashMap;
import java.io.FileReader;
import java.io.BufferedReader;
public class ACOforTSP {
//城市的距离表
private
double[][]
distance; //距离的倒数表
private
double[][] heuristic; //启发信息表
private
double[][] pheromone; //权重
private int
alpha, beta;
//迭代的次数
private int
iterationTimes;
//蚂蚁的数量
private int
numbersOfAnt;
//蒸发率
private
double rate;
ACOforTSP
(String file, int iterationTimes, int numbersOfAnt, int alpha, int
beta, double rate) {
//加载文件
this.initializeData(file);
//初始化参数
this.iterationTimes = iterationTimes;
//设置蚂蚁数量
this.numbersOfAnt = numbersOfAnt;
//设置权重
this.alpha = alpha;
this.beta = beta;
//设置蒸发率
this.rate = rate;
}
private void
initializeData(String filename) {
//定义内部类
class City {
int no;
double x;
double y;
City(int no, double x, double y) {
this.no = no;
this.x = x;