您的位置:首页 > 其它

遗传算法

2015-11-05 16:43 141 查看
一般来说,我们解决问题的过程就是寻找可行解的过程,当然可行解必须满足一定的约束条件,但是对很多问题来说,搜索可行解的过程非常复杂以至于都不知道去哪里搜索或不知道搜索的下一步该怎么走,在多项式时间内找不到合理的解,因此只能对应一个NDTM(Nondeterministic Turing Machine)来解决,即:对于下一步的动作,不知道确切的行为,只能尝试很多种方案才能够得出一个答案,即NP问题。那么什么是NPC问题呢,就是只有把解域里的所有解都穷举了之后才能得出答案,这样的问题是NP里最难的问题。大量的NPC问题实质是优化问题,即要求使某个目标函数达到最值(而非极值)的解。

优化问题的算法有很多,局部搜索,模拟退火,遗传算法,禁忌搜索都可以找到理想的可行解,这里有个形象的比喻。

为了找出世界上最高的山,一群有志气的兔子们开始想办法。

1.兔子朝着比现在高的山跳去,他们找到了不远处的最高山,但是这座山不一定是珠穆朗玛峰,也就是说他只能保证局部最优,而不是全局最优,这就是局部搜索。

2.兔子喝醉了,他们随机跳了很长时间,在这期间,他们可能走向高处可能走向地处,但是渐渐地,兔子清醒了并朝最高方向跳去,这就是模拟退火。

3.兔子们吃了失忆药片,被随机发送到世界的各个角落,他们并不知道自己的任务是什么,但是如果你过几年就杀掉部分海拔较低的兔子,多产的兔子们就会自己找到珠穆朗玛,这就是遗传算法。

4.兔子们知道一只兔子的力量是渺小的,他们互相转告着,哪里的山已经找过,并且找过的山都留下一只兔子作为记号,他们制定了下一步要去哪里找的策略,这就是禁忌搜索。

遗传算法继承了达尔文生物进化论的思想,是模拟生物进化的自然选择与遗传机制的一种搜索优化方法,适用于复杂的非线性问题,主要应用在组合优化和机器学习方面。要想弄清楚遗传算法,需要先理解如下几个概念:编码,产生初始种群,计算适应度,选择,交叉,变异。

编码是为了表示问题的解决方案,常见的有二进制编码,格雷码编码,符号编码,实数编码等。计算适应度的值首先需要选择合适的适应度函数,由于遗传算法并不利用外界信息,仅以适应度的值来进行搜索,因此良好的适应度函数的选择决定了遗传算法的收敛速度及能否找到最优解。选择是指从初始种群中选择需要进行操作的个体,一般选择较大数目的初始种群可以同时处理更多的解,也更可能找到全局最优值,但是增加了每次迭代的时间,常用的选择方法有轮盘赌选择法,随机遍历抽样法,截断选择法,锦标赛选择法,由于交叉,变异算子并不能控制进化的方向,因此进化的重任就落在了选择算子上。交叉是指相互配对的个体按某种方式互相交换部分基因,这是产生新个体的重要方法。变异是指将个体的某些基因值用其他的基因来替换,这是产生新个体的辅助方法,但又是必不可少的一个步骤,因为他决定了遗传算法的全局搜索能力。

下面通过一个例子具体实现遗传算法(来自校友LL的分析http://blog.163.com/searcher_go_go/blog/static/176413259201111693246103/)。

选房间问题:有n个学生的班级,需要在有p个房间的宾馆订q个房间,每个学生对每一个房间都有喜欢值,每两个学生之间有友谊值。问题是,订哪q个房间,并安排学生入住,使得学生对所住房间的喜欢值与同住一个房间学生之间的友谊值之和最大。

编码:编码是为了表示问题的解决方案,一个编码表示选了哪几个房间,每个房间对应入住学生是谁。这里一个基因位对应一个房间和分配到这个房间的学生,染色体的长度是学生订的房间总数。

如下列染色体:

Roomid=2

Roomid=4

Roomid=6

Roomid=8

Roomid=9

Student:1,2

Student:5,6

Student:4,3

Student:8,9

Student:7

杂交算子:

第一步,随机选择两个杂交位置,从父代染色体的基因位上选为杂交基因位。

第二步,房间级杂交,交换参与杂交的两个Roomid。启动合法性检查,看杂交染色体中是否有其它基因的Roomid与杂交基因位的Roomid相等,没有则杂交过程是可行的,若有,则在没有使用的房间随机挑选一个Roomid作为杂交基因位的Roomid,这样就保证了杂交染色体的基因位各不相等,即房间不能分配两次。

第三步,学生级杂交,两个杂交基因位都包含的学生保留在杂交后的基因位中,不包含的清除。启动贪心过程,将清除出来的学生按照贪心原则分配到染色体的基因位中(可能会再次分配到杂交基因位)。

变异算子:

第一步,随机选择一个变异基因位。

第二步,随机选择一个Roomid用于替换变异基因位的Roomid。启动合法性检查,检查变异染色体中是否有其它基因位的Roomid等于变异基因位的Roomid,没有则变异是可行的,若有则在没有使用的房间随机挑选一个Roomid替换变异基因位的Roomid。

第三步,将变异基因位的学生全部清除。启动贪心过程,将清除出来的学生按照贪心原则分配到染色体的基因位中(可能会再次分配到变异基因位)。

选择算子:

使用轮盘赌选择算子。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: