游戏编程中的人工智能技术-第三章:遗传算法入门(一)
2016-05-31 21:37
417 查看
写在算法之前: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页,初始种群情况表为:
现采用轮盘赌方式选择个体,依次生成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%的空间,所以没被选到。
其他问题见教材。
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 |
请注意一下原则:
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%的空间,所以没被选到。
其他问题见教材。
相关文章推荐
- Seaborn-PairGrid
- grails指定端口运行工程
- [LeetCode]problem 70. Climbing Stairs
- HDOJ--Fibonacci Again
- Middle-题目122:220. Contains Duplicate III
- 1079. Total Sales of Supply Chain (25)
- leetcode 217. Contains Duplicate
- 1282 - Leading and Trailing ---LightOj1282(快速幂 + 数学)
- 【BZOJ1664】[Usaco2006 Open]County Fair Events 参加节日庆祝【线段覆盖】【贪心】
- Palindrome Pairs
- poj 3378 Crazy Thairs
- 【cf】Restoring Paintie
- [Ruby On Rails] Action Controller - 控制HTTP 流程
- poj 3378 Crazy Thairs
- TortoiseGit安装图解以及(no supported authentication methods avaiable)问题解决
- ORA-02291: integrity constraint: parent key not found
- 第15课:Spark Streaming源码解读之No Receivers彻底思考
- Paint的效果研究
- Codeforces Round #353 (Div. 2) E. Trains and Statistic
- Middle-题目31:11. Container With Most Water