关闭

游戏编程中的人工智能技术-第三章:遗传算法入门(一)

标签: 游戏编程人工智能遗传算法
1088人阅读 评论(0) 收藏 举报

写在算法之前:1、遗传算法的本质是优胜劣汰,优胜劣汰的方法是轮盘赌选择。

                            2、学习遗传算法程序的关键是:遗传算法使用的情境是什么,如何在情境中使用遗传算法。遗传算法只是理论,你如何在实际的情境中构造它?还有的关键是:了解什么时候认为遗传算法已经成功。

本文主要对遗传算法的程序进行讲解,由于作者非计算机专业出身,因此不涉及SDK程序设计,这个我是一点都不懂。

先说理论,参考扬天齐编著的《人工智能及其应用》,遗传算法的几个名词为:

1.种群(Population):初始给定的多个解的集合。也就是刚开始的时候,生成一系列随机的染色体,这些染色体会进行交叉,变异等操作。那么初始的生成的这么些染色体就是种群。

2.基因(Gen):这个还未定。到底是表示染色体中的某个位,还是表示种群中的其中一个元素?

3.染色体(Chromos):表示对种群中的某一元素进行编码,也就是我们所看到的1100111这个东西。

4.适应度(Fitness)函数:如何来对种群中的染色体进行优胜劣汰?这就靠适应度函数了,每个染色体对应一个适应度函数。那么,当然是适应度函数越高的染色体更优秀,容易在竞争中生存下来。

5.操作:对染色体的三种操作:选择(Selection)、交叉(Crossover)、变异(Mutation)。

遗传算法的步骤为:

1、生成初始种群,这个一般是随机生成的。

2、对初始种群中的每一个染色体计算适应度,有符合条件的染色体吗?

3、若没有(一般肯定是没有的),则进行选择操作。选择出两(?到底几个)个染色体。本章采用轮盘赌法。

4、对选择出的染色体进行交叉操作,但注意,不是每次都要交叉的,什么时候交叉,有个概率问题,可以定义为交叉率。

5、对交叉后的染色体进行变异操作。当然,这个也是有概率的,并且这个概率比交叉率小的多。

6、重复第2步骤,直至最终得到符合条件的染色体为止。

一些特殊的说明:

1、染色体编码:可采用二进制编码,或者实数编码。本章采用二进制编码。

2、选择方法:本章采用轮盘赌方法。啥叫轮盘赌呢?就是个体被选择的概率取决于其适应度。这就是为什么轮盘赌法可以进行优胜劣汰的原因。虽然你无法保证每次选择的个体适应度是最好的,但是至少,选到适应度高的个体的概率是高的。


那么轮盘赌该怎么实现呢?首先你要得到两个值:当前个体的适应度函数,以及种群中所有个体的适应度函数之和。那么当前个体被选中的概率为:P(xi)=当前个体适应度函数/所有个体适应度函数之和。

3、交叉和变异书上都有,比较简单。就不介绍了。

接下来举个例子,主要讲述轮盘赌选择方法。

按照杨天齐书113页,初始种群情况表为:

编号 个体串 x 适应值 百分比(%) 累计百分比(%) 选中次数
S01 01101 13 169 14.30 14.30 1
S02 11001 25 625 52.88 67.18 2
S03 01000 8 64 5.41 72.59 0
S04 10010 18 324 27.41 100 1
现采用轮盘赌方式选择个体,依次生成4个随机数为0.85、0.32、0.12、0.46。

请注意一下原则:

0.85在72.59和100之间,这个是S04在轮盘中的区域,所以选择的是S04:10010

0.32在14.30和67.18之间,这个是S02在轮盘中区域,所以选择的是S02:11001

0.12在0和14.30之间,这个是S01在轮盘中的区域,所以选择的是S01:01101

0.46在14.30和67.18之间,这个是S02在轮盘中的区域,所以选择的是S02:11001

从上面分析可知,S02适应值高,占总体的适应值的百分比高,这就类似于他在轮盘中占据了52.88%的空间,所以被选到2次也是正常的。

S03适应值低,占总体的适应值的百分比低,这就类似于他在轮盘中占据了5.41%的空间,所以没被选到。

其他问题见教材。

0
0
查看评论

游戏编程中的人工智能技术-遗传算法入门(三)

先请教大家一个问题,为什么我的遗传算法入门(一)一直处于“待审核”状态? 好,言归正传,继续研究代码。先看看CBobsMap类的定义。 #include "defines.h" using namespace std; class CBobsMap { private...
  • angelguard
  • angelguard
  • 2016-06-01 07:17
  • 2161

游戏编程中的人工智能技术-神经网络入门(二)

上一节介绍了代码的第一个部分:神经网络部分。那么光有神经网络就可以工作了吗?还不行,因为还没有设计神经网络的训练方法,即还没有设计神经网络权重的更新方法。在传统的有监督的神经网络中,先给一个训练集让神经网络进行训练。     等等,啥叫训练集?啥叫训练?举个例子,你首先告诉神经...
  • angelguard
  • angelguard
  • 2016-07-19 12:46
  • 1529

游戏编程中的人工智能技术一书的附录

《游戏编程中的人工智能技术》 一书的 三个附录与后语
  • zzwu
  • zzwu
  • 2017-01-26 09:43
  • 539

游戏编程中的人工智能技术-遗传算法入门(四)

接下来介绍SGenome结构体。 struct SGenome { vector vecBits; double dFitness; SGenome():dFitness(0){} SGenome(const int num_bits):dFitness(0) { //...
  • angelguard
  • angelguard
  • 2016-06-01 08:29
  • 791

游戏编程中的人工智能技术-遗传算法入门(二)

ok,现在开始介绍程序。 路径如下,文件名为Pathfinder。 先运行下,看看效果。 一个走迷宫程序,按下回车, 用遗传算法走通了。注意:右下方为起点,左上方为终点。 好,程序走起! 注意,1:若想使用VC的调试功能,则必须文件路径为纯英文,因此上面的路径肯定不行啦。   ...
  • angelguard
  • angelguard
  • 2016-05-31 22:57
  • 904

游戏编程中的人工智能技术-神经网络入门(一)

有一段时间没有更新了,原本是准备更新TSP-旅行商问题,不过感觉在TSP问题的章节中,Buckland大神写的过于理论化,不是几篇博客可以解释的通的,我自己还有很多问题没有搞清楚。因此先跳到第七章-神经网络入门。     神经网络近段时间可以算是大热了,自从阿尔法狗击败李世石后,...
  • angelguard
  • angelguard
  • 2016-07-18 22:39
  • 1630

《游戏编程中的人工智能技术》一书勘误

《游戏编程中的人工智能技术》 。 一书勘误 分原书的错误和中译出版本的错误两部分 1.英文原版的错误 · . 原 版 书 上 的 错 误 的 勘 误 表 [说明]下面列出的一些差错是我在翻译和阅读英文原版图书 <AI...
  • zzwu
  • zzwu
  • 2013-04-05 18:00
  • 5739

游戏编程中的人工智能技术

 神经网络入门>. (连载之一)用平常语言介绍神经网络(Neural Networks in Plain English) 因为我们没有很好了解大脑,我们经常试图用最新的技术作为一种模型来解释它。在我童年...
  • AIFuture
  • AIFuture
  • 2007-10-28 17:44
  • 7013

游戏编程中的人工智能技术-神经网络入门(四)

接下来到了最后一个类:CController控制器类了。 CController可以算是所有类的一个综合,将所有类结合起来,成为了一个可以工作的系统,其重要性不言而喻。不过由于作者对windows程序编程实在不了解,只能挑一部分介绍。 class CController { private: ...
  • angelguard
  • angelguard
  • 2016-07-19 22:25
  • 530

游戏编程中的人工智能技术-神经网络入门(三)

前两节提到了神经网络部分和遗传算法部分,那么代码就到此结束了吗?当然没有,无论什么算法,总要针对一个特定的对象进行使用不是?因此,本节介绍另一个部分,CMinesweeper,即扫雷机代码。class CMinesweeper { private: //the minesweeper'...
  • angelguard
  • angelguard
  • 2016-07-19 21:19
  • 824
    个人资料
    • 访问:11673次
    • 积分:227
    • 等级:
    • 排名:千里之外
    • 原创:11篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档