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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值