[FreedomAI]第六周——遗传算法与种群综述

首先介绍什么是遗传算法。

由一个问题引入,求某函数f(x)在区间[a,b]上的最大值。

这看似简单,我们很快会说,求他的导数,然后等于0即可。

但是往往在应用中,f(x)未知,或很难解析,这就让求导这类方法变得困难。

于是科学家们联想到了生物里的进化论,给出了这样一个很有意思的求解过程。

首先你先随机出一些数对,x从对应的区间中随机,y就是他们对应的f(x).

干嘛呢?把他们看做进化论中的个体。x是基因型,y是表现型,你作为上帝,目标是选出表现型比较大的值。

于是你根据,y的值,把一些数对搞死了。

然后再让剩下的进行繁殖——把基因编码,也就是把float映射成二进制数组,然后把这个数组看成生物上的基因序列,交叉重组,产生下一代,然后这个过程中往往还伴随着变异。

如此反复。我们可以发现,最后留在种群里的,会集中在f(x)的极大值点附近。

这就描述了遗传算法的过程。

初始化随机数据->筛选->编码->重组->变异->迭代。

然后我们再想想在游戏里用这个能干嘛。

其实游戏人工智能很大的不同在于,我们致力于研究最有趣的AI,而非最优秀的AI。

所以我们在游戏里用遗传算法去模拟种群,很大程度是希望看到,玩家对游戏世界作出的动作,在最终宏观的影响了整个游戏世界,体现一种很强的自由度——而并非真正希望AI在进化过程中成长成可以对抗玩家的AI。

那么如何在游戏里运用遗传算法呢?

要做一个小小的改动——大多的遗传算法往往是先迭代完成,计算出最优解,然后投入应用。而游戏里——我们说了,我们并不关心最优解,我们关心他在变化。所以我们不在游戏初始化的时候,直接完成遗传算法的迭代,而是在游戏中实时的计算这个个体的情况,并每个一段时间进行一次迭代,这次迭代将决定下一代的个体,如此往复,直到游戏最后结束。

最后讲一讲我们将用到的优化——可以使用多线程和池化技术。

因为这个遗传算法的维护和主逻辑是可分离的,确切的说,遗传算法的迭代过程中,和主逻辑并不冲突,相反,由于遗传算法在迭代下一代的过程中,计算非常集中,所以在这个阶段会严重阻塞主逻辑。

所以我们可以使用多线程,用一个线程去维护一个种群的遗传算法。

而至于池化,是因为在迭代过程中要消亡上一代,生成下一代,也就是生成、销毁操作非常频繁,这种情况是可以使用池化,具体请参考上一篇文章。

下一篇,我们讲一些具体的代码实现。

猜你喜欢

转载自blog.csdn.net/qq_33999892/article/details/80274328