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

这篇具有很好参考价值的文章主要介绍了python遗传算法(应用篇1)--求解一元函数极值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面我们使用遗传算法尝试求解一元函数的最值
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))

运行结果
遗传算法一元二次方程求解,# 数学建模python版,python,数学建模,遗传算法

解码(二进制>十进制)

  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)

运行结果

遗传算法一元二次方程求解,# 数学建模python版,python,数学建模,遗传算法

完整代码及其可视化版本

可视化,即使用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) + 4

plt.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 = 0

bound = [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_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 - 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

运行结果
遗传算法一元二次方程求解,# 数学建模python版,python,数学建模,遗传算法

其他

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中抽取随机样本文章来源地址https://www.toymoban.com/news/detail-739798.html

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

到了这里,关于python遗传算法(应用篇1)--求解一元函数极值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接一元二次方程的几种解法,用python代码实现

    一元二次方程的解法有以下几种:公式法、因式分解法、配方法、求根公式法。 下面是使用Python代码实现一元二次方程的解法: ```python import math def solve_quadratic_equation(a, b, c):     delta = b**2 - 4*a*c     if delta 0:         return \\\"无实根\\\"     elif delta == 0:         x = -b / (2*a)    

    2024年02月07日
    浏览(46)
  • Python 第三代非支配排序遗传算法(NSGA-III)求解多目标高次函数的帕累托前沿

    文章目录         我前面有博客介绍了第二代非支配排序遗传算法(NSGA-II)求解多目标高次函数的帕累托前沿的代码,本篇博客则是介绍NSGA-III求解多目标高次函数的帕累托前沿。         研究的模型为:min(y1=,x[-10,10]), min(y2=,x[-10,10])。 即求解两个目标函数最小值的问题

    2024年02月06日
    浏览(42)
  • 计算一元二次方程

    从键盘输入a, b, c的值,编程计算并输出一元二次方程ax^2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4*a*c的三种情况计算并输出方程的根。 输入描述: 多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax^2 +

    2024年02月16日
    浏览(51)
  • 一元二次方程虚数解

    对一元二次方程ax²+bx+c=0 (a≠0);若判别式△=b²-4ac0,则方程无实根,虚数解为:x=(-b± i√(4ac-b²))/(2a)。 只含有一个未知数(一元),并且未知数项的最高次数是2(二次)的整式方程叫做一元二次方程[1] 。一元二次方程经过整理都可化成一般形式ax²+bx+c=0(a≠0)。其中ax²叫作

    2024年02月02日
    浏览(36)
  • 遗传算法求解旅行商问题(含python源代码)

    目录 前言 编码初始化种群 计算适应度 选择 交叉 变异 完整代码 总结 这次的算法有一点不能确定是否正确,希望有大佬能够批评指正。 遗传算法的一般步骤 种群(population) 指同一时间生活在一定自然区域内,同种生物的所有个体。 所以种群是由个体组成的,所以先需要

    2024年01月23日
    浏览(68)
  • 遗传算法求解车辆路径优化问题VRP(Python代码实现)

    学会了前面两篇遗传算法,但是那都是针对抽象的数学问题求解的,那么应用到现实中的实际问题中,我们又该怎样把遗传算法套进去呢,然后我第一个接触到的问题就是车辆路径优化问题VRP,当然也是找到了一篇比较好的文章,物流管理论文实现:基于遗传算法的带时间窗

    2024年01月18日
    浏览(52)
  • PTA( 求一元二次方程的根)——C语言)细解

    本题目要求一元二次方程ax2+bx+c=0的根,结果保留2位小数。(注意:0.00会在gcc下被输出为-0.00,需要做特殊处理,输出正确的0.00。) 输入格式: 输入在一行中给出3个浮点系数a、b、c,中间用空格分开。 输出格式: 根据系数情况,输出不同结果: 1)如果方程有两个不相等的

    2024年02月06日
    浏览(49)
  • 【数学建模】二次规划求解约束极值问题(Python+Gurobi实现)

    目录 1 概述 2 算例及Python代码实现 2.1 算例 2.2 方法1 2.3 方法1求解结果 2.4 方法2         根据约束条件的不同,二次规划可分为等式约束二次规划问题和不等式约束二次规划问题。等式约束二次规划问题即只含有等式约束,常见的解法有直接消去法、广义消去法、拉格朗日

    2024年02月08日
    浏览(69)
  • C语言:从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根

    C语言实战题目:【if-else条件分支语句】 从键盘任意输入a,b,c的值,编程计算并输出一元二次方程ax2+bx+c=0的根,当a=0时,输出“该方程不是一元二次方程”,当a≠0时,分b2−4ac0、b2−4ac=0、b2−4ac0三种情况计算并输出方程的根。 **输入格式要求:\\\"%f,%f,%f\\\" 提示信息:“Ple

    2023年04月26日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包