今天带大家用Python代码,遗传算法训一波龙~
开发工具
Python版本:3.6.4
相关模块:
numpy模块;
argparse模块;
pygame模块;
以及一些python自带的模块。
关注公众号:Python学习指南,回复:"小恐龙游戏3" 获取源码及相关文件
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
遗传算法,即:
Genetic Algorithm, GA 是一种元启发式算法,其核心思想与达尔文的进化理论很相似。简单而言就是物种在进化过程中,好的基因将得到保留,不好的基因将被淘汰。经过很多代的演变之后,物种当前保留下来的基因就可以看作是对当前环境适应度最好的基因了。
具体应用到我们的小恐龙小游戏上,我们设计算法的思路如下。首先,随机生成若干个小恐龙(比如100个):
self.dinos = [Dinosaur(cfg.IMAGE_PATHS['dino']) for _ in range(self.population_size)]
每个恐龙的行动由一个小的神经网络来控制:
self.populations = [Network() for _ in range(self.population_size)]
其中,每个神经网络都是由两个全连接层组成,且他们的权重矩阵都是随机生成的:
'''define the network''' class Network(): def __init__(self, fc1=None, fc2=None, **kwargs): self.fc1 = np.random.randn(5, 16) if fc1 is None else fc1 self.fc2 = np.random.randn(16, 2) if fc2 is None else fc2 self.fitness = 0 '''predict the action''' def predict(self, x): x = x.dot(self.fc1) x = self.activation(x) x = x.dot(self.fc2) x = self.activation(x) return x '''activation function''' def activation(self, x): return 0.5 * (1 + np.tanh(0.5 * x))
每个全连接层的输出结果由以下函数激活以保证输出值的范围都在0到1之间:
网络的输入值有5个,分别为:
- 当前离小恐龙最近的障碍物与小恐龙的水平距离;
- 当前离小恐龙最近的障碍物离地面的高度;
- 当前离小恐龙最近的障碍物的宽度;
- 当前离小恐龙最近的障碍物的高度;
- 小恐龙水平方向上的奔跑速度.
画个示意图就是:
接着,我们让这些神经网络来控制对应的小恐龙进行游戏:
'''make decision for all dinos''' def makedecision(self, x): threshold = 0.55 actions = self.ai.predict(x) for i in range(len(actions)): action = actions[i] if self.dinos[i].is_dead: continue if action[0] >= threshold: self.dinos[i].jump(self.sounds) elif action[1] >= threshold: self.dinos[i].duck() else: self.dinos[i].unduck() self.ai.populations[i].fitness = self.dinos[i].score
直到所有的神经网络都让自己控制的小恐龙因为撞到路上的障碍物而死掉。接下来,我们从这些神经网络中选出几个让小恐龙存活的时间最久的(比如选两个,也就是对应控制的小恐龙得分最高的两个):
def keepbest(self): self.populations.sort(key=lambda x: x.fitness, reverse=True) self.keeped_nets = self.populations[:self.num_keeped_nets]
让选出的神经网络的权重矩阵进行交叉和变异,从而生成新的一批神经网络:
'''crossover''' def crossover(self): def crossoverweight(fc1, fc2): assert len(fc1) == len(fc2) crossover_len = int(len(fc1) * random.uniform(0, 1)) for i in range(crossover_len): fc1[i], fc2[i] = fc2[i], fc1[i] return fc1, fc2 nets_new = [] size = min(self.num_keeped_nets * self.num_keeped_nets, self.population_size) for _ in range(size): net_1 = copy.deepcopy(random.choice(self.keeped_nets)) net_2 = copy.deepcopy(random.choice(self.keeped_nets)) for _ in range(self.num_crossover_times): net_1.fc1, net_2.fc1 = crossoverweight(net_1.fc1, net_2.fc1) net_1.fc2, net_2.fc2 = crossoverweight(net_1.fc2, net_2.fc2) nets_new.append(net_1) return nets_new '''mutate''' def mutate(self, net): def mutateweight(fc, prob): if random.uniform(0, 1) < prob: return fc * random.uniform(0.5, 1.5) else: return fc net = copy.deepcopy(net) net.fc1 = mutateweight(net.fc1, self.mutation_prob) net.fc2 = mutateweight(net.fc2, self.mutation_prob) return net
同样地,这批神经网络每个都会分别控制一只新的小恐龙来进行游戏,直到这批新的神经网络控制下的小恐龙再次全部死掉。此时,重复之前的动作,即选择其中表现最好的几个神经网络并进行交叉变异,然后再次开始新的游戏,如此反复循环,直到得到满意的效果。
嗯,原理大概就是这样,完整源代码详见相关文件呗~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
利用卷积神经网络学习脑电地形图表示进行分类
点击上面"脑机接口社区"关注我们 更多技术干货第一时间送达 脑电图(EEG)地形图表征(Electroencephalography topographical representation, ETR)可以监测区域大脑活动,是一种可以用于探索皮层机制和联系的技术。然而,如何找到一种鲁棒的方法来支持多目标对象、多通道的具有低信噪比的高维EEG数据是一个挑战。为了解决这一问题,厦门大学、海西研究院泉州装备制造研究所、华中师范大学以及云南民族大学等多所研究机构的研究人员联合提出了一种新的ETR能量计算方法,用于使用卷积神经网络学习大脑活动的EEG模式。它能够在一个通用的学习模型中识别多个对象。具体而言,研究人员在实验中使用里来自2008年脑机接口(BCI)竞赛IV-2a的数据集进行五类分类,其中包含四个运动想象动作和一个放松动作。在该项研究中,提出的分类框架的平均准确率比最好的分类方法高10.11%。另外,研究人员通过对ETR参数优化的研究,得到了一种用于BCI应用的用户界面,并实现了一种实时优化方法。 本研究的主要过程涉及生成ETR特征图并使用它们来训练CNN模型,从而实现对不同目标对象中...
- 下一篇
万字详解Ribbon架构,针对面试高频题多角度细说Ribbon
为什么要使用Ribbon 上一章节我们学习了注册中心《阿里面试官问我:到底知不知道什么是Eureka,这次,我没沉默》,我们知道但我们存在多个服务提供者的时候,我们会让所有的服务提供者将服务节点信息都注册到EurekaServer中,然后让客户端去拉取一份服务注册列表到本地,服务消费者会从服务注册列表中找到合适的服务实例信息,通过IP:Port的方式去调用服务。 那么,消费者是如何决定调用哪一个服务实例呢,此时,本章节的主人公Ribbon默默的站了起来,笑着说,没错,正是在下。 Srping Cloud Ribbon 是基于 Netflix Ribbon实现的一套 客户端负载均衡的工具。 简单的说,Ribbon是Netflix发布的开源顶目,主要功能是解析配置中或注册中心的服务列表,通过客户端的软件负均衡算法来实现服务请求的分发。 Ribbon客户端组件提供一系列完善配置项如连接超时,重试等。 简单的说,就是在配置文件中列出LoadBalancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(筒单轮洵,随机连接等)去连接这些机器。 我们也很容易使Ribbon实现自定义负载均衡...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8