莫烦python进化算法_算法篇——进化算法(一)

本文介绍了进化算法的核心思想,以遗传算法为例,通过Python实现寻找一元高次函数的极值问题。通过模拟自然选择和变异过程,逐步逼近最优解,展示了遗传算法的简单应用。
摘要由CSDN通过智能技术生成

题外话

各位读者大家好呀!

大一转眼就过去了,时间过得真的很快,还来不及细细回味过去的一年,大二已经在不远的前方挥手示意了。也曾心比天高的想要趁这个暑假学完好多东西,不过后来总是不尽人意。新一届的挑战杯已经开始,在大二这个传说中最能出成绩的时间段,我也不禁为自己捏一把冷汗,我能够做些什么?有时候不仅仅只是个人的技术能力问题,而是说这个世界需要你的地方何在?

我觉得如果能够实现从事自己喜欢的工作,为这个建设社会贡献一份自己的力量,那应该是很幸福的事情。如果仅仅为了一份养家糊口的996工作而去学习,不免有些提不起劲。我还想周游各国,从事社会文化的研究工作呢。

前言

前半个暑假零零碎碎的学了python的一些内容。主要是神经网络和进化算法、以及简单的用matplotlib画图(数据可视化)。

神经网络我觉得是有点深奥的,主要是在用python(pytorch)实现一个简单的神经网络的过程中,深感有关的数学知识被隐藏了。一句简单的反向传播

loss.backward()

蕴含着关于向量求导、矩阵梯度等线性代数的硬核内容。

有的人说,我知道可以用这行代码来实现反向传播就行了啊,能实现程序运行出结果就行,编程难道不就是这样的嘛?

我觉得是不够的,编程确实都是从模仿起步,但是这里不行,因为神经网络涉及的数学知识较多,没有理解该方法的来历,是无法大胆的使用它的,更无法作出创新与改进。

就此打住吧。接下来切入正题。(此篇文章仅供感兴趣的小伙伴/初学者参考,大佬可以点击右上角离开)

注:想要自主实现代码的话,需要python3,以及numpy和matlpotlib两个python库。

一、何谓进化算法能够生存下来的物种,不是最强的,也不是最聪明的,而是最能适应变化的。

查尔斯·达尔文的这句话就是整个进化算法的核心思想。

进化算法(也叫演化算法,Evolutionary Algorithms)包括遗传算法(Genetic Algorithms)、遗传规划(Genetic Programming)、进化策略(Evolution Strategies)和进化规划(Evolution Programming)4种典型方法。第一类方法比较成熟,现已广泛应用,进化策略和进化规划在科研和实际问题中的应用也越来越广泛。

今天要讲的,也就是第一类——遗传算法。

很多时候,在解决实际问题时,特别是最优解问题时,我们并不要求找到完完全全的最优解,而往往是近似最优解。这个时候,遗传算法通常可以大展身手。

二、举个例子

比如一个简单的问题:求一元高次函数的极值(最值)

数学上我们可以通过求导来求解一个函数的极值点,但是当函数的次数高于3次时,这个问题就开始变地棘手了。而编程的一大乐趣恰恰在于,你不需要担心你的计算能力。只要你能给出正确的指令,剩下的就是泡一杯coffee,静静等待计算机的运算结果就行。

那么如何来用编程解决这个问题呢?

这里我们采用遗传算法。

具体一点,比如我们要求函数:y = - (x+5) * x * (x-8) * (x-15) 的极值(最值)。

先通过python的matplotlib绘制一下函数的图像。

引入数学函数库numpy和数据绘图包matlpotlib

import numpy as np

import matplotlib

import matplotlib.pyplot as plt

然后

plt.figure() # 创建一个图形实例

x = np.linspace(-10,20,100) # 在[-10,20]区间上等间距的取100个点

y = - (x+5) * x * (x-8) * (x-15) # 这些点的横纵坐标满足函数y=...

plt.plot(x, y, color="blue") # 绘制函数图像,曲线颜色为“蓝色”

plt.show() # 展示实例

(与C语言等不同,python中的单行注释采用#而非//)

就可以看到函数图像啦

可见,这个函数应该是有最大值的,其范围粗略估计在(10,15)内。

接下来,我们来找这个最高点。

因为问题比较简单,所以遗传算法的代码也比较简单。

首先,我们得要有初始的种群。

这里我们在函数上随机取两个点,分别命名为Tree和Seed。

Tree_x = np.random.uniform(-10.0,20.0) # Tree的横坐标

Tree_y = - (Tree_x + 5) * Tree_x * (Tree_x - 8) * (Tree_x - 15) # Tree的纵坐标

Seed_x = np.random.uniform(-10.0,20.0) # Seed的横坐标

Seed_y = - (Seed_x + 5) * Seed_x * (Seed_x - 8) * (Seed_x - 15) # Seed的纵坐标

(其中np.random.uniform(-10.0,20.0)表示随机生成(-10.0,20.0)区间内的实数。)

接下来,我们要做的,就是模拟大自然的选择过程。谁更适合环境呢?在这里,我们就是大自然,我们希望找到的点的纵坐标越高越好,所以纵坐标的大小就是我们选择的依据。

选择:比较两个点的纵坐标大小,把纵坐标大的点赋值给纵坐标小的点,也就是淘汰较不适应环境的弱者,而让较适应环境的强者的基因得到遗传(这里强者的基因就是点的坐标)

并且,发生变异:在强者基因得到遗传的同时,它也会发生变异(变异在自然界是个概率事件,但是这里,因为群里数目只有两个,为了保证算法的效率,我们可以让每一代都发生一次变异,以更快地得到我们想要的点)

if Seed_y > Tree_y : # 如果种子优于大树,则这个种子长成新的大树

Tree_x = Seed_x # 遗传

Tree_y = Seed_y # 遗传

Seed_x = np.random.uniform(-10.0,20.0) #变异

Seed_y = - (Seed_x + 5) * Seed_x * (Seed_x - 8) * (Seed_x - 15) #变异

else:# 如果种子没有优于大树,则由该大树的种子作为下一代的大树

Seed_x = Tree_x # 遗传

Seed_y = Tree_y # 遗传

Tree_x = np.random.uniform(-10.0,20.0) #变异

Tree_y = - (Tree_x + 5) * Tree_x * (Tree_x - 8) * (Tree_x - 15) #变异

最后,我们给这个演化过程确定一个时间,比如说繁衍1000代。(理论上讲,在环境条件不变的情况下,经历的时间越长,繁衍代数越多,种群的适应性就越强,所以你可以试试100代、300代、1000代甚至更长时间,大概率会是繁衍代数越多,最终结果也越接近顶点)

也就是一个简单的for循环

for i in range(1,1001):

考虑到大家可能还不熟悉python的matlpotlib操作,这里我给出完整代码。

# 先从一种类型简单的进化算法说起

import numpy as np

import matplotlib

import matplotlib.pyplot as plt

plt.ion()

plt.figure()

x = np.linspace(-10,20,100)

y = - (x+5) * x * (x-8) * (x-15)

Tree_x = np.random.uniform(-10.0,20.0)

Tree_y = - (Tree_x + 5) * Tree_x * (Tree_x - 8) * (Tree_x - 15)

Seed_x = np.random.uniform(-10.0,20.0)

Seed_y = - (Seed_x + 5) * Seed_x * (Seed_x - 8) * (Seed_x - 15)

for i in range(1,1001):

plt.clf()

plt.plot(x, y, color="blue")

plt.scatter(Tree_x, Tree_y, color="red")

plt.scatter(Seed_x, Seed_y, color="red")

if Seed_y > Tree_y : # 如果种子优于大树,则这个种子长成新的大树

Tree_x = Seed_x

Tree_y = Seed_y

Seed_x = np.random.uniform(-10.0,20.0)

Seed_y = - (Seed_x + 5) * Seed_x * (Seed_x - 8) * (Seed_x - 15)

print('The heightest point ',i,':',Tree_x,Tree_y) # 打印目前最高点的坐标

else:# 如果种子没有优于大树,则由该大树的种子作为下一代的大树

Seed_x = Tree_x

Seed_y = Tree_y

Tree_x = np.random.uniform(-10.0,20.0)

Tree_y = - (Tree_x + 5) * Tree_x * (Tree_x - 8) * (Tree_x - 15)

print('The heightest point ',i,':',Seed_x,Seed_y) # 打印目前最高点的坐标

plt.pause(0.001)

plt.ioff()

plt.show()

主要的代码行之前都已经解释过,其余行都是为了让整个过程肉眼可见,更加直观,感兴趣的同学可以自己去了解学习matplotlib的使用方法。

最后的实现效果如下:知乎视频​www.zhihu.com

三、结束语

以上只是遗传算法的一个简单实现,如果你想学习更多的相关知识,推荐你一个平台,那就是大名鼎鼎的莫烦老师啦~莫烦Python​mofanpy.com

如果你能够看懂和复现莫烦大佬的几个遗传算法程序,那么,棒棒哒!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值