iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >小白易懂的遗传算法(Python代码实现)
  • 565
分享到

小白易懂的遗传算法(Python代码实现)

pythonnumpy开发语言 2023-09-16 20:09:28 565人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

无约束的遗传算法(最简单的) 最开始真正理解遗传算法,是通过这个博主的讲解,安利给小白们看一看,遗传算法的Python实现(通俗易懂),我觉得博主写的让人特别容易理解,关键是代码也不报错,然后我就照着

无约束的遗传算法(最简单的)

最开始真正理解遗传算法,是通过这个博主的讲解,安利给小白们看一看,遗传算法的Python实现(通俗易懂),我觉得博主写的让人特别容易理解,关键是代码也不报错,然后我就照着他的代码抄了一遍,认真地理解了一下每一个模块,:编码、解码、适应度函数写法、选择、交叉和变异的实现过程,下面也谈一谈我在整个过程中的认识,以及对代码的一种通俗解释:
1、编码:这里主要运用的就是一种二进制的编码,将要求解的问题的解,从十进制的自然数以某一种方式用二进制表达出来,每一个0或1作为是一个基因位,一个数的众多基因构成一条染色体,也就是一个个体,进而众多染色体构成一个种群,所说的种群规模其实就是这些染色体的个数,最后用这个种群去参与到遗传算法的各个过程中,并且二进制的编码对于交叉和变异的操作会简单一点。
2、解码:因为适应度函数是用十进制的自然数写的,所以在每一次迭代中,要把二进制的染色体,再变成十进制的数,才能参与到适应度的计算中,就照着解码公式写出来就好了。

##解码函数def decode(pop):   return   pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) *(X_max-X_min)/ float(2**DNA_SIZE-1) +X_min

适应度函数:作为遗传变异的根据,这个函数通常跟我们目标函数有关系,因为后面在选择过程中,是保留适应度值更大的个体,所以适应度值我们都认为是越大越好,那么目标函数是求最大值的时候,那也就是说适应度值越大,越接近目标,所以令适应度函数=目标函数。
目标函数求最小值时,如果也想达到这样的效果,则令适应度函数=1/目标函数。
但是在这里又遇到了一个问题,因为适应度值必须是正的,因为要求占比,但目标函数值有可能是负的,所以就做了下面的这个转换,让求出来的适应度值是正的,并且与目标函数值的变化是一致的,如果以后遇到的话,也可以尝试着自己去想表达式来解决,只要明白这个目的。

"""求解的目标表达式为:y = 10 * math.sin(5 * x) + 7 * math.cos(4 * x)x=[0,5]"""def aim(x):    return 10*np.sin(5*x)+7*np.cos(4*x)##适应度计算函数def fitnessget(pred):    return pred + 1e-3 - np.min(pred)

选择:最常用的就是轮盘赌方式,了解完他的定义之后发现他的代码实现也不难,比如有五个个体的种群,索引序号是[0,1,2,3,4],那就是计算适应度值,并且求一下在总的适应度里面的占比,得到[0.1,0.2,0.3,0.1,0.3],然后根据这每一个个体的比例来随机抽数,得到[2,4,2,1,4],就比如两个0.3的概率最大,那么抽取到个体2和4的概率就更大,最终根据这个序号去选择种群中对应的个体,进行保留到下一代,这就实现了适应环境的留下,不适应的淘汰。

##自然选择函数(轮盘赌)def select(pop, fitness):               # print(abs(fitness))    # print(fitness.sum())    idx = np.random.choice(np.arange(pop_size), size=pop_size, replace=True,p=fitness/fitness.sum())    # print(idx)    return pop[idx]

交叉:二进制的交叉就是针对每一个个体,随机找到一个个体,然后再随机找到某几个基因位,这两个个体的这些基因位进行交换,这里我看的时间比较久,实在不懂就打印出来看看是啥咯

def change(parent, pop):    x = np.random.rand()    print('x:{}'.fORMat(x))    if x < PC:    #交叉        i_ = np.random.randint(0, pop_size, size=1)  ##随机找到要与之交叉的某一行,也就是某另一个个体        print('i_:{}'.format(i_))        cross_points = np.random.randint(0, 2, size=DNA_SIZE)##生成一个只有0和1的列表,长度等于基因长度        print('cross_points:{}'.format(cross_points))        cross_points = cross_points.astype(np.bool)  ##1的地方就是True        print('cross_points:{}'.format(cross_points))        print(np.where(cross_points==True))   ##np.where()就是找到True的地方,就是用这种方法来找到1的地方,作为交叉的基因位        print('cross_points:{}'.format(cross_points))        print('parent[cross_points]:{}'.format(parent[cross_points]))        parent[cross_points] = pop[i_, cross_points]        print('parent:{}'.format(parent))    return parent

变异:二进制的变异就很简单了,就是选择基因位,然后0变成1,1变成0,代码也比较容易实现。

def variation(child,pm):                  #变异    for point in range(DNA_SIZE):        if np.random.rand() < pm:            child[point] = 1 if child[point] == 0 else 0    # print(child)    return child

遗传算法主体

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt##定义全局变量pop_size = 5  # 种群数量PC=0.6 # 交叉概率PM=0.01 #变异概率X_max=5    #最大值X_min=0     #最小值DNA_SIZE=10  #DNA长度与保留位数有关,2**10 当前保留3位小数点,这个应该是二进制考虑的问题,保留的规则可以去搜一下,有的实际问题需要实数编码的话,就直接看着所要求的问题设置编码长度就好了N_GENERATIONS=100    ##迭代次数##生成初始解,这个初始种群就是一个可行解的集合,在这样的条件下进行选择、交叉和变异操作,选出最适应当前环境的个体,也就得到了我们的最优解pop = np.random.randint(2, size=(pop_size, DNA_SIZE))   ###得到初始化种群# print(pop)X = np.arange(0,N_GENERATIONS,1)Y = [None]*N_GENERATIONS   ##先产生一个全部都是0的列表,用于存放每一次迭代的最优值,最后进行画图展示迭代过程for i in range(N_GENERATIONS):  ##上面写的选择、交叉、变异都是在一次进化中的操作,每一次迭代都要进行    #解码    # print(pop)    X_value= decode(pop)        #获取目标函数值    F_values = aim(X_value)        #获取适应值    fitness = fitnessget(F_values)    # print(fitness)    if(i==0):        max=np.max(F_values)        max_DNA = pop[np.argmax(F_values), :]  ##取取得适应度最大值的那个个体            if(max<np.max(F_values)):        max=np.max(F_values)        max_DNA=pop[np.argmax(F_values), :]            if (i % 10 == 0):        print("Most fitted value and X: \n",              np.max(F_values), decode(pop[np.argmax(F_values), :]))    #选择    pop = select(pop,fitness)    # print(pop)    pop_copy = pop.copy()    # print(pop_copy)    for index,parent in enumerate(pop):        # print(parent)        child = change(parent,pop_copy)        child = variation(child,PM)        # print(child)        pop[index] = child    Y[i] = maxprint("目标函数最大值为:",max)print("其DNA值为:",max_DNA)print("其X值为:",decode(max_DNA))plt.plot(X,Y)

结果如下:
在这里插入图片描述

好了,大家把上面的代码和解释全部认真读一遍,小白也能懂遗传算法了。

来源地址:https://blog.csdn.net/weixin_43697614/article/details/127541300

--结束END--

本文标题: 小白易懂的遗传算法(Python代码实现)

本文链接: https://www.lsjlt.com/news/410413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 小白易懂的遗传算法(Python代码实现)
    无约束的遗传算法(最简单的) 最开始真正理解遗传算法,是通过这个博主的讲解,安利给小白们看一看,遗传算法的Python实现(通俗易懂),我觉得博主写的让人特别容易理解,关键是代码也不报错,然后我就照着...
    99+
    2023-09-16
    python numpy 开发语言
  • 怎么用python代码实现遗传算法
    要使用Python代码实现遗传算法,可以按照以下步骤进行操作:1. 定义问题:首先,需要明确要解决的问题是什么,例如优化问题、寻找最...
    99+
    2023-10-10
    python
  • 使用Python实现遗传算法的完整代码
    目录遗传算法具体步骤:1.2 实验代码1.3 实验结果1.4 实验总结1、如何在算法中实现“优胜劣汰”?2 、如何保证进化一直是在正向进行?3、交叉如何实现?...
    99+
    2023-03-23
    Python 遗传算法 python算法
  • 使用Python实现的遗传算法 附完整代码
    遗传算法是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,它借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,它能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最优解。遗传算...
    99+
    2023-09-26
    Python 遗传算法 flask Powered by 金山文档
  • python实现高效的遗传算法
    遗传算法属于一种优化算法。 如果你有一个待优化函数,可以考虑次算法。假设你有一个变量x,通过某个函数可以求出对应的y,那么你通过预设的x可求出y_pred,y_pred差距与你需要的...
    99+
    2024-04-02
  • Python优化算法之遗传算法案例代码
    目录一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法,尤其是启发式的仿生智能...
    99+
    2023-02-18
    Python遗传算法 Python优化算法
  • Python怎么实现遗传算法
    这篇文章给大家分享的是有关Python怎么实现遗传算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。(一)问题遗传算法求解正方形拼图游戏(二)代码#!/usr/bin/env python# ...
    99+
    2023-06-21
  • 如何使用Python实现遗传算法
    本篇内容介绍了“如何使用Python实现遗传算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!遗传算法是模仿自然界生物进化机制发展起来的随机...
    99+
    2023-07-05
  • python如何实现高效的遗传算法
    小编给大家分享一下python如何实现高效的遗传算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!遗传算法属于一种优化算法。如果你有一个待优化函数,可以考虑次算法...
    99+
    2023-06-14
  • Python实现遗传算法(虚拟机中运行)
    目录(一)问题(二)代码(三)运行结果(四)结果描述(一)问题 遗传算法求解正方形拼图游戏 (二)代码 #!/usr/bin/env python # -*- coding: u...
    99+
    2024-04-02
  • Python中怎么实现一个遗传算法框架
    本篇文章给大家分享的是有关Python中怎么实现一个遗传算法框架,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。算法特点以决策变量的编码作为运算对象,使得优化过程借鉴生物学中的概...
    99+
    2023-06-17
  • Matlab实现遗传算法的示例详解
    目录1算法讲解1.1何为遗传算法1.2遗传算法流程描述1.3关于为什么要用二进制码表示个体信息1.4目标函数值与适应值区别1.5关于如何将二进制码转化为变量数值1.6关于代码改进2M...
    99+
    2024-04-02
  • Python中怎么实现一个简单遗传算法
    今天就跟大家聊聊有关Python中怎么实现一个简单遗传算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。遗传算法遗传算法是模仿自然选择过程的优化算法。 他们没有使用"数学技...
    99+
    2023-06-16
  • python实现使用遗传算法进行图片拟合
    目录引言预备知识及准备工作打开图片随机生成生物族群按照生物性状画图对比生物个体和目标图片的相似度保存图片算法主体交叉互换基因突变基因片段易位增加基因片段减少基因片段变异繁殖淘汰拟合示...
    99+
    2024-04-02
  • Python地图四色原理的遗传算法着色实现
    目录1 任务需求2 代码实现2.1 基本思路2.3 结果展示总结1 任务需求   首先,我们来明确一下本文所需实现的需求。   现有一个由多个...
    99+
    2024-04-02
  • 如何用Python从零开始实现简单遗传算法
    今天就跟大家聊聊有关如何用Python从零开始实现简单遗传算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。遗传算法是一种随机全局优化算法。连同人工神经网络,它可能是最流行和广为人知...
    99+
    2023-06-15
  • golang简易令牌桶算法实现代码
    基本思路:定义一个chan,chan大小为需要限制的qps大小,go一个协程启动tick,每1000/qps时间在tick中写入数值,启动另一个协程,读取chan中的值,如果读取到c...
    99+
    2024-04-02
  • 算法介绍及实现——基于遗传算法改进的BP神经网络算法(附完整Python实现)
    目录 一、算法介绍 1.1 遗传算法 1.2 为什么要使用遗传算法进行改进 二、算法原理 三、算法实现 3.1 算子选择 3.2 代码实现 一、算法介绍 1.1 遗传算法         遗传算法是受启发于自然界中生物对于自然环境 “...
    99+
    2023-09-04
    神经网络 pytorch
  • python如何实现使用遗传算法进行图片拟合
    小编给大家分享一下python如何实现使用遗传算法进行图片拟合,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!引言算法思路假设我们有这样一个生物族群,他们的每个基因片段都是一个个三角形(即只含三个点和颜色信息),他们每个个体...
    99+
    2023-06-29
  • matlab遗传算法求解车间调度问题分析及实现源码
    目录一、车间调度简介1 车间调度定义2 传统作业车间调度二、遗传算法简介1 遗传算法概述2 遗传算法的特点和应用3 遗传算法的基本流程及实现技术3.1 遗传算法的基本流程3.2 遗传...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作