[FreedomAI]第八周——蚁群算法综述以及应用初衷

在研究遗传算法的时候,随带看到了蚁群算法,发现了很有意思。

进而一细想,发现还在游戏的寻路中有一定应用的可能,首先,我们很头大的一个问题有时候在于,对于一大群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;
	
	}

下一篇我们给出算法的具体代码和运行结果。

    原文作者:蚁群算法
    原文地址: https://blog.csdn.net/qq_33999892/article/details/80542278
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞