遗传算法小实战(全网最易懂实例讲解)
以通俗易懂的故事讲解人工智能遗传算法的原理。一帮武功高手以遗传算法的方式决出最强选手和顶级修为的故事。
一、求解问题
从前,有一群修炼武功的人,分为“正派”和“邪派”,“正派”修炼的是九阴真经,“邪派”修炼的“葵花宝典”。两派的人都在各自领域上越修炼越猛,但一个是在“光明大道”上越走越远,一个是在“阴暗小路”上越走越深,两派人互相谁都不服,于是有一天他们约定在光明顶决战。
“正派人士”:“你们修炼的都是歪门邪道,越修炼走火入魔越深!”
“邪派人士”:“你别管我修炼的什么,就看咱谁武功威力最大!”
于是,两派采用公平的方式各抽了几个人,由群众投骰子来测试谁武功高,谁能进入下一轮,进入下一轮的人还有机会经过现场学习和基因改造的方式让自己变强,然后一轮一轮的直到最后决出王者。不管学习正派武功还是邪派武功,有些人可能入场时就已经是武功第一人,其他人经过多轮的学习进化,也可以达到他们这类人的极限武功修为。他们武功能发挥的威力值都是修为的平方。
我们用双曲线f(x)=x²来求解这个问题,f(x)就是最大威力值,x为武功修为的值,x取值范围为[-99,99](负向就是“邪派”武功极限修为,正向就是“正派”武功极限修为。-99和99为正邪向的极限修为值)。
二、遗传算法
1. 生成初始种群(随机选选手)
也就是上面说的随机抽的几个人X01、X02、Z01、Z02,并对他们的修为进行二进制编码(8位原码)如下表:
| 选手 | 初始修为 | 基因(二进制编码) |
|---|---|---|
| X01 | -3 | 1000 0011 |
| X02 | -8 | 1000 1000 |
| Z01 |
5 |
0000 0101 |
| Z02 | 7 | 0000 0111 |
2.适应度函数(计算进入下一轮的概率)
本次比武是看谁的武功修为高,不管修的“正”还是“邪”,适应度函数就是他们凭借各自的武功修为,能进入下一轮,乃至最终轮比拼的获胜概率。武功发挥的最大威力值,也就是修为值的平方。
f(x)最大修为=x²
而适应度就是凭他们目前的修为威力,能进入下一轮比拼或学习的概率,适者生存,太弱的直接会被人打死淘汰!适应度(Fitness)的计算公式:
根据本文情况变更下:
也就是个体在这几个人(邪派X和正派Z)修为总和中的程度(赢得本轮并进入下一轮学习进化的概率)。我们使用以上公式来计算下各自的适应度。
| 选手 | 初始修为(x) | 威力值(x²) | 基因(二进制编码) | 适应度计算 | 适应度(fix(x)) |
|---|---|---|---|---|---|
| X01 | -3 | 9 | 1000 00119 | 6.12% | |
| X02 | -8 | 64 | 1000 1000 | 43.54% | |
| Z01 | 5 | 25 | 0000 0101 | 17.01% | |
| Z02 | 7 | 49 | 0000 0111 | 33.33% |
3.选择(决定命运的骰子)
围观群众不知道他们武功深浅,于是随机往场里扔了几个骰子,每个骰子都需要一定的威力才能破坏,只有能打出超过这些威力值的人才能在空中击破这些骰子,击破骰子数最少的人出局。
大家投出的骰子点数为0-1中的随机小数,第一轮投的分别是:
0.38, 0.50, 0.87, 0.08
这几个人一看骰子来了疯了一样的疯狂击破,击破情况如下:
| 选手 | 初始修为(x) | 基因(二进制编码) | 威力值(x²) | 适应度(fix(x)) | 击破骰子次数(选中次数) |
|---|---|---|---|---|---|
| X01 | -3 | 1000 0011 | 9 | 6.12% | 0 |
| X02 | -8 | 1000 1000 | 64 | 43.54% | 2 |
| Z01 |
5 |
0000 0101 | 25 | 17.01% | 1 |
| Z02 | 7 | 0000 0111 | 49 | 33.33% | 1 |
结局对X01选手来讲是悲惨的,他因为一个骰子没击破被踢出局,“邪派”教主一看,真是给我们门派丢脸,于是“喀嚓”……
而剩下的击破骰子的选手,作为奖励,分别取得了获得其他选手的身体基因情报的机会,在刚才每多击破一次筛子就多一次机会通过基因工程改造自己的机会。击破1个以上骰子的人,每多击破一次就会被赠与一个自己的克隆体。他们可选择用自己的身体或克隆体来复制对方身体的一半的基因(单点交叉)或一部分基因(两点交叉)又或多部分基因(多点交叉)来改造自己或克隆体变成一个全新的“自己”,虽然这些基因可能还不如原先自己的,但他们有些人想着剩下的人也都是高手,博一下,改造一部分也许能提升新的“自己”能变强呢……
4.交叉(基因改造工程)
于是Z02因为有一次克隆体机会,他本体选择不改造,而让克隆体Z02'去改造,而X02看到了刚才Z02的表现,也愿意和他互换基因。他们选择了稳妥的两点交叉方式。而Z01觉得自己和Z02实力不相上下,于是他不想赌,选择不改造自己(不交叉)。他们基因改造情况如下:
| 选手 | 初始修为(x) | 基因(二进制编码) | 交叉对象 | 交叉位 | 改造后(子代) | 改造后修为 |
|---|---|---|---|---|---|---|
| Z02' | -8 | 1000 1000 | X02 | 1和3 | 1000 1101 | -13 |
| X02 |
5 |
0000 0101 | Z01’ | 1和3 | 0000 0000 | 0 |
| Z01 | 7 | 0000 0111 | Z02 | - | 0000 0111 | 7 |
| Z02 | -8 | 1000 1000 | Z01 | - | 1000 1000 | -8 |
从改造结果来看,选手Z02' 也就是那个克隆体,成为了人生赢家,修为增长到了13,摩托直接变飞机!而X02改造后武功尽失,成为了废人!
5.变异(咸鱼翻身的机会)
此时,"邪派“教主看大事不好,趁人不备向场中扔了2个仙丹,谁吃了仙丹谁就能获得修为变化的机会(变异),变得更好或变得更坏都有可能,这是给想翻身的人的一次机会!
于是场中的X02和Z01瞅准机会,飞身抓住仙丹,迅速吞服了下去,很快身体就出现了变化:
| 选手 | 是否吞服了仙丹(变异) | 基因(变异前) | 基因(变异后) | 变异前修为 | 变异后修为 |
|---|---|---|---|---|---|
| Z02' | 否 | 1000 1101 | 1000 1101 | -13 | -13 |
| X02 | 是 | 0000 0000 | 0001 0000 | 0 | 16 |
| Z01 | 是 | 0000 0111 | 0000 0101 | 7 | 5 |
| Z02 | 否 | 1000 1000 | 1000 1000 | -8 | -8 |
第一轮至此结束,每个剩余选手的编号十位数增长了1,表示经过了一轮。吃瓜群众迫不及待的想看看现在到底谁更厉害了,于是又扔了4个骰子进场:
0.82, 0.23, 0.66, 0.30
| 选手 | 修为(x) | 基因(二进制编码) | 威力值(x²) | 适应度(fix(x)) | 击破次数 |
|---|---|---|---|---|---|
| Z12' | -13 | 1000 1101 | 169 | 2 | |
| X12 | 16 | 0001 0000 | 256 | 2 | |
| Z11 |
5 |
0000 0101 | 25 | 0 | |
| Z12 | -8 | 1000 1000 | 64 | 0 |
于是,循环往复的过程开始了,不断循环“选择”->“交叉”-“变异”的过程后,来到了第17轮的交叉,此时情况如下:
| 选手 | 修为(x) | 基因(二进制编码) | 交叉对象 | 交叉位 | 改造后(子代) | 改造后修为 |
|---|---|---|---|---|---|---|
| Z172^'17 | -98 | 1110 0010 | Z172^'15 | 1 | 1110 0011 | 99 |
| X172^'15 |
88 |
0101 1000 | X172^'16 | 2 | 0101 1010 | 90 |
| Z172^'15 | -79 | 1100 1111 | Z172^'17 | 1 | 1100 1110 | -78 |
| X172^'16 | 90 | 0101 1010 | X172^'15 | 2 | 0101 1000 | 88 |
最终,第17代克隆人Z172号选手凭借顶级“葵花宝典”神功一路披荆斩棘,取得了“绝世高手”的称号(达到函数最终解之一 x = -99)。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)