python遗传算法(应用篇1)--求解一元函数极值

article/2025/10/2 0:06:43

目录

  • 遗传算法求解过程
    • 算法参数
    • 构建初始化种群
    • 解码(二进制>十进制)
    • 自然选择
    • 交叉
    • 变异
    • 解码(新种群>十进制)
    • 计算新种群的适应度
  • 完整代码及其可视化版本
  • 其他
    • numpy中的随机数

下面我们使用遗传算法尝试求解一元函数的最值
y = s i n ( x 2 − 1 ) + 2 c o s ( 2 x ) , x ∈ [ 0 , 10 ] y=sin(x^2-1)+2cos(2x),x\in [0,10] y=sin(x21)+2cos(2x)x[0,10]

遗传算法求解过程

算法参数

# 种群数量
m_population = 50
# 迭代次数(种群进化代数)
epoch = 99
# 基因个数
L = 40
# 交叉概率
mp = 0.5
# 变异概率
mm = 0.01# 最大函数值
mf = 0
# 最大函数值对应的自变量
mx = 0
# 变量约束
bound = [0, 10]
# 存储每一代的最优个体
f_list = []
x_list = []

构建初始化种群

生成二进制数组,形状为(种群个体数,个体基因个数),即(m_population, L)

population = np.random.randint(0, 2, (m_population, L))

运行结果
在这里插入图片描述

解码(二进制>十进制)

  1. 将生成的二进制数组先转换为十进制数字,便于计算个体适应度
    二进制转十进制有多种方法,这里笔者提供一种:由于个体基因是以二进制数组的形式存在,我们先将二进制数组转换为二进制字符串,然后使用int()函数实现转换过程
for i in range(m_population):transform_middle = int(''.join(map(lambda x: str(x), population[i])), 2)
  1. 然后进行标准化。由于二进制字符串的长度为40,转化得到的十进制数字将会非常大,我们的自变量约束区域为 b o u n d = [ 0 , 10 ] bound=[0,10] bound=[0,10],我们将得到的十进制数字都转化到 0 − 10 0-10 010之间,
    transform_[i] = bound[0] + (bound[1] - bound[0]) * transform_middle / pow(2, L)	
  1. 求不同个体的的适应度
f = fun(transform_)

自然选择

这是事关重要的一步,我们知道适应度大的个体有更大的概率存活下来,如何使用代码实现这一过程?
我们使用频数来代替概率,在原来种群的基础之上,我们通过概率选择一些个体出来,数量等于原来的种群个体数量相等,这样选择出来的个体在组成一个新的种群,这样我们便完成了自然选择这一过程

bingo = np.random.choice(np.arange(m_population), m_population, True, f / sum(f))
select_populaton = population[bingo]# 生成目前种群的两个复制版本,实际上不生成也行,但是这样有利于模拟两个体的交配过程
last_gen = select_populaton
new_gen = select_populaton.copy()

交叉

交叉相当于两个个体(染色体)交配。遗传算法中有多种方式实现交叉,笔者在这里采用一种叫做单点交叉的方式

match = np.random.choice(np.arange(m_population), m_population, False)
for i in range(m_population // 2):# 种群中的个体两两结合if np.random.rand() < mp:# 以交叉概率location = np.random.randint(0, L)# 交叉点last_gen[match[i]][:location], new_gen[match[L - i - 1]][:location] = \new_gen[match[L - i - 1]][:location], last_gen[match[i]][:location]

变异

for i in range(m_population):for j in range(L):if np.random.rand() < mm:new_gen[i][j] = 1 if new_gen[i][j]==0 else 0

此时上一代繁衍基本结束,new_gen即为新一代种群

将population更新为新种群

population = new_gen

解码(新种群>十进制)

transform_1 = np.zeros(m_population)
for i in range(m_population):transform_middle = int(''.join(map(lambda x: str(x), new_gen[i])), 2)transform_1[i] = bound[0] + (bound[1] - bound[0]) * transform_middle / pow(2, L)

计算新种群的适应度

# 计算适应度
new_f = fun(transform_1) - 4
# 选择出最优的个体
mx = transform_1[np.argmax(new_f)]
# 最优适应度
mf = new_f.max()
# 将每一代最优个体及其适应度添加到数组中便于统计
f_list.append(mf)
x_list.append(mx)

运行结果

在这里插入图片描述

完整代码及其可视化版本

可视化,即使用matplotlib库动态绘制遗传算法求解该问题的过程,主要添加的代码如下

  1. 绘制该函数图像
  2. 以散点图的形式绘制每一代个体的最优个体及其适应度
import numpy as np
import matplotlib.pyplot as plt# 定义适应度函数
def fun(x):return np.sin(x ** 2 - 1) + 2 * np.cos(2 * x) + 4plt.ion()
inputs=np.arange(0,10,0.1)
output=[fun(i)-4 for i in inputs]
plt.plot(inputs,output)
# 种群数量
m_population = 50
# 迭代次数
epoch = 99
# 基因个数
L = 40
# 交叉概率
mp = 0.5
# 变异概率
mm = 0.01# 最大函数值
mf = 0
# 最大函数值对应的自变量
mx = 0bound = [0, 10]f_list = []
x_list = []
# 生成二进制种群
population = np.random.randint(0, 2, (m_population, L))
transform_ = np.zeros(m_population)
# 二进制>十进制,并标准化
for i in range(m_population):transform_middle = int(''.join(map(lambda x: str(x), population[i])), 2)transform_[i] = bound[0] + (bound[1] - bound[0]) * transform_middle / pow(2, L)
# 计算当前种群适应度
f = fun(transform_)
for num in range(epoch):# 自然选择bingo = np.random.choice(np.arange(m_population), m_population, True, f / sum(f))select_populaton = population[bingo]# 生成目前种群的两个复制版本,实际上不生成也行,但是这样有利于模拟两个体的交配过程last_gen = select_populatonnew_gen = select_populaton.copy()# 交叉match = np.random.choice(np.arange(m_population), m_population, False)for i in range(m_population // 2):if np.random.rand() < mp:location = np.random.randint(0, L)last_gen[match[i]][:location], new_gen[match[L - i - 1]][:location] = \new_gen[match[L - i - 1]][:location], last_gen[match[i]][:location]# 变异for i in range(m_population):for j in range(L):if np.random.rand() < mm:new_gen[i][j] = 1 - new_gen[i][j]# 现在new_gen就是新生成的种群,我们需要将其转化为十进制# 我们先生成一个空数组,然后使用它储存转化后的种群十进制transform_1 = np.zeros(m_population)for i in range(m_population):transform_middle = int(''.join(map(lambda x: str(x), new_gen[i])), 2)transform_1[i] = bound[0] + (bound[1] - bound[0]) * transform_middle / pow(2, L)# 计算适应度new_f = fun(transform_1) - 4# 选择出最优的个体mx = transform_1[np.argmax(new_f)]# 将当前的种群视为最优的种群population = new_gen# 最优适应度mf = new_f.max()f_list.append(mf)x_list.append(mx)plt.scatter(mx,mf)plt.title(f'epoch:{num+1}')plt.pause(0.1)
plt.ioff()
plt.show()print(max(x_list), max(f_list))
>>> 9.93222096441059 2.9685353661257627

运行结果
在这里插入图片描述

其他

numpy中的随机数

  1. np.random.randint
numpy.random.randint(low, high=None, size=None, dtype=int)

返回 ( l o w , h i g h ] (low,high] (low,high]之间的随机整数或形状为size的随机整数数组

  1. np.random.choice
numpy.random.choice(a, size=None, replace=True, p=None)

从一维数组a中抽取随机样本

参数描述
sizeint or tuple of ints, optional随机样本的数组形状
replaceboolean, optional表示样本是否可以重复出现
p1-D array-like, optional每个样本被抽取到的概率

http://chatgpt.dhexx.cn/article/uoaMLlV9.shtml

相关文章

python遗传算法解决分段线性约束问题

问题描述 模型 分析 带有分段约束和max最值&#xff0c;导致使用一般的线性规划pulp问题进行求解会比较麻烦如果将分段约束转化为0/1整数规划&#xff0c;其余变量 u i u_i ui​未必还是整数&#xff0c;就涉及混整问题相对麻烦&#xff0c;所以考虑使用遗传算法进行求解 Py…

Python 遗传算法路径规划

了却一个心愿 文章目录 目录 文章目录 前言 二、主要内容 三、使用步骤 1.将压缩包下载解压 2.读入数据 3.最终结果 前言 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律…

遗传算法的python实现(手撕python遗传算法)

遗传算法简介 假设有无约束优化问题&#xff1a; z f ( x , y ) zf(x,y) zf(x,y) 如何通过遗传算法求解&#xff1f; 在这里需要将该优化问题与遗传算法中的概念进行对比。 f f f 对应遗传算法的适应度函数。自变量 x , y x,y x,y 对应遗传算法的个体&#xff0c;注意&#…

Python 遗传算法 Genetic Algorithm

粒子群算法常常用于在连续解空间内搜索&#xff0c;而在不连续、离散的空间内常常会出现搜索越界的问题 例如旅行商问题&#xff0c;寻找可以遍历 15 个地点的最短路径&#xff08;当然可以用二进制状态压缩 动态规划解决&#xff09;&#xff0c;以 {0, 1, ..., 14} 表示这些…

python遗传算法之geatpy学习

&#x1f63b;今天我们来学习python中的遗传算法的使用&#xff0c;我们这里使用的是geatpy的包进行学习&#xff0c;本博客主要从geatpy中的各种数据结构一步一步进行学习&#xff0c;请大家耐心看完。 &#x1f424;其实以前也学习过遗传算法&#xff0c;但是主要使用matlab…

遗传算法详解 附python代码实现

遗传算法 遗传算法是用于解决最优化问题的一种搜索算法。从名字来看&#xff0c;遗传算法借用了生物学里达尔文的进化理论&#xff1a;”适者生存&#xff0c;不适者淘汰“&#xff0c;将该理论以算法的形式表现出来就是遗传算法的过程。 问题引入 上面提到遗传算法是用来解…

遗传算法【Python】

遗传算法概念 基本思想&#xff1a; 遗传算法(GA)是一种全局寻优搜索算法&#xff0c;它依据的是大自然生物进化过程中“适者生存”的规律。它首先对问题的可行解进行编码&#xff0c;组成染色体&#xff0c;然后通过模拟自然界的进化过程&#xff0c;对初始种群中的染色体进…

遗传算法python实现

遗传算法python实现 一、问题引入二、遗传算法的步骤1.初始化2.个体评价3.选择运算4.交叉运算5.变异运算6.终止条件判断 三、实现思路1.编码的设计2.适应度函数3.选择函数4.交叉函数5.变异函数6.迭代 四、具体实现1.编码解码函数2.适应度函数3.选择函数4.交叉函数5.变异函数6.选…

遗传算法(Python)

一、遗传算法 1、遗传算法的定义 遗传算法是一种现代优化算法。根据自然界适者生存的法则&#xff0c;种群中优秀个体的基因进行遗传。每个个体的染色体通过选择、交叉和变异等过程产生新的适应度更大的染色体&#xff0c;其中适应度越大的个体越优秀&#xff0c;种群得到优化…

python遗传算法(详解)

学习代码来源于&#xff1a;遗传算法python 一.主要思想 遗传算法是根据达尔文的“适者生存&#xff0c;优胜劣汰”的思想来找到最优解的额&#xff0c;其特点是所找到的解是全局最优解&#xff0c;相对于蚁群算法可能出现的局部最优解还是有优势的。 二.主要名词 个体&…

DH算法、DHE算法、ECDHE算法演进

ECDHE 算法解决了 RSA 算法不具备前向安全的性质 和 DH 算法效率低下的问题。 ECDHE 算法具有前向安全。所以被广泛使用。 由什么演变而来 DH 算法 -- > DHE 算法 -- > ECDHE 算法 DH 算法是非对称加密算法&#xff0c;该算法的核心数学思想是离散对数。 核心数学思…

DH 算法思想 SSH解决内容篡改问题

DH算法用于交换密钥 交换密钥的目的是生成仅双方共享的密钥 交换密钥的基本过程&#xff1a; 双方确定公开的内容用各自的私钥分别对公共内容加密&#xff08;加密本质就是数学运算&#xff09;并发送给对方这时双方使用自己的密钥对收到的内容加密&#xff08;要设计运算保证…

ECDH算法详解

ECDH算法详解 ECDH算法详解DH密钥交换原理结合ECC椭圆曲线算法ECDSA签名算法 参考资料 ECDH算法详解 DH密钥交换原理 进一步解释&#xff1a; 两端&#xff08;Alice 和 Bob&#xff09;想要安全的交换信息并且第三方不能获取到该信息。当然这也是TLS协议中的目的之一&#xf…

DH算法(密钥交换算法)

一 对称加密缺点 密钥传递过程复杂&#xff0c;这是对称加密带来的困扰。 二 DH密钥交换算法特点 构建本地密钥 双方密钥一致 三 DH相关参数 四 DH算法实现过程 1、初始化发送方的密钥&#xff08;KeyPairGenerator、KeyPair、PublicKey&#xff09; 2、初始化接受方的密钥&…

SSL/TLS中的DH算法、DHE算法、 ECDHE算法介绍

❤️SSL/TLS专栏导航页❤️ 文章目录 1. DH算法简介2. DH算法协商流程3. DH算法证明4. SSL/TLS中的DH算法 1. DH算法简介 Diffie-Hellman密钥交换算法是在1976年由这两个人发明的算法。它可以在不安全的网络中&#xff0c;通过交换一些公开的信息协商出共享密钥&#xff0c;使…

一文读懂DH密钥交换算法

DH 算法是 Diffie和Hellman于1976年提出了一种的密钥交换协议。这种加密算法主要用于密钥的交换&#xff0c;可以在非安全信道下为双方创建通信密钥&#xff0c;通讯双方可以使用这个密钥进行消息的加密、解密&#xff0c;并且能够保证通讯的安全。 换而言之&#xff0c;算法希…

密钥协商算法的演变 —— RSA算法 - DH算法 - DHE算法 - ECDHE算法

文章目录 1. RSA算法RSA握手过程RSA秘钥协商算法最大的缺陷 2. DH算法3. DHE算法4. ECDHE算法ECDHE秘钥协商算法的TSL握手&#xff1a; 1. RSA算法 传统的 TLS 握⼿基本都是使⽤ RSA 算法来实现密钥交换的。在 RSA 密钥协商算法中&#xff0c;客户端会⽣成随机密钥&#xff0c…

openswan中DH算法说明

Author :Email : vip_13031075266163.comDate : 2021.01.11Copyright : 未经同意不得转载&#xff01;&#xff01;&#xff01;Version &#xff1a; openswan-2.6.51.5Reference&#xff1a;https://download.openswan.org/openswan/ 目录 1. ope…

DH法理解

旋转关节机器人 四个参数&#xff1a;a&#xff0c;α&#xff0c;d&#xff0c;θ 四个参数实际上是两组&#xff0c;先有a&#xff0c;α&#xff0c;再有d&#xff0c;θ。 a是两个转轴之间的距离&#xff08;Z轴&#xff09;&#xff0c;异面直线公垂线的长度&#xff0c;也…

DH算法及源码解读

【主流的密钥交换方式】 敏感数据信息安全传输需要对敏感信息加密&#xff0c;加密的密钥涉及到传输两端的密钥协商和交换&#xff0c;目前主要两种密钥交换的机制有&#xff1a; 1. 基于非对称密钥的实现&#xff1a;请求方用接收方的公钥加密自己的密钥&#xff0c;接收方用…