在研究遗传算法的时候,随带看到了蚁群算法,发现了很有意思。
进而一细想,发现还在游戏的寻路中有一定应用的可能,首先,我们很头大的一个问题有时候在于,对于一大群AI,在同一帧来了一个请求,要求他们进行实时的寻路,这样我们还要不影响帧率的话,就要保证这些AI的寻路计算在1/FPS的时间内算完,但是对于A*那样的启发式算法来说,还是很有压力的。很大概率程序会直接崩掉。
蚁群算法就具备这样的好处——即使数据规模变大,计算规模的增大也是有限的,每一步的决策都在线性内完成。并且还有一个好处,他并不需要确定的知道目标点在哪。当然这个算法是基于概率的进化型的算法——最大的通病在于,没法保证什么时候完成迭代。
接着我们先来介绍一下这个算法:
首先我们会初始化一些蚂蚁。
这些蚂蚁的目标是找到食物搬回家,回家后再出来找食物回家……….
并且这些蚂蚁具有一定的感知力,会感知到家和食物,一旦感知到周围有食物和家,就开始携带信息素,并开始边走边释放信息素,其他蚂蚁依靠信息素逐渐迭代到家和食物的路径上,我们就完成了寻路。
具体的寻路规则是:
蚂蚁在八近邻中如果没有找到含有信息素的,就进行随机寻路,该寻路具有一定的惯性,即在没有遇到墙的时候,会有更高概率保证走原方向的倾向。
如果在周围发现了信息素,则对八近邻的信息素浓度进行轮盘赌,来进行决定走哪个方向,当然在发现信息素的情况下,也有小概率选择随机寻路,这是为了保证不陷入局部的迭代。
具体的信息素释放是:
在找到了家的时候,携带家的信息素,清空食物的信息素。在找到了食物的时候,携带食物的信息素,清空家的信息素。
在寻路·过程中记录步数,蚂蚁在抵达格子的同时,我们在该格子释放信息素,浓度为总数*步数作为线性衰减。
信息素维护规则:
格子上的信息素会随着时间衰减。
格子上的信息素在比较小的时候会直接清为零。
格子上有浓度上限。
这里首先给出Ant类的定义:
public enum NowTarget:uint
{
HOME = 0,
FOOD,
NONE
}
public enum DirctionType:uint
{
DOWN = 0,
UP,
LEFT,
RIGHT,
LEFTDOWN,
LEFTUP,
RIGHTDOWN,
RIGHTUP,
NONE
}
public class Ant
{
public Vector2 mPositionIndex;
public GameObject mAIRT;
public float mInfoFood;
public float mInfoHome;
public float mObserverDistance;
public NowTarget mNowTarget;
public Vector3 mNowPositionTarget;
public Vector2 mLastDir;
public List<Vector2> mClosedArray = new List<Vector2> ();
public void Add(Vector2 v)
{
if (!Contains (v))
mClosedArray.Add (v);
}
public bool Contains(Vector2 v)
{
//Debug.Log (mClosedArray.Contains(v).ToString());
return mClosedArray.Contains (v);
}
// public List<Vector2> runit;
}
下一篇我们给出算法的具体代码和运行结果。