进化算法------代码示例

news2025/7/18 4:59:43

前言

遗传算法就是在一个解空间上,随机的给定一组解,这组解称为父亲种群,通过这组解的交叉,变异,构建出新的解,称为下一代种群,然后在目前已有的所有解中抽取表现好的解组成新的父亲种群,然后继续上面的过程,直到达到了迭代条件或者获取到了最优解。

进化算法流程框架
在这里插入图片描述
下面我们来解释下这个流程图里面的一些概念

  • 适应度

所谓的适应度,本质上可以理解为一个代价函数,或者一个规则,通过对初始种群中的个体计算适应度,能够得到对初始种群中的个体是否优劣的一个度量

  • 选择

选择操作是根据种群中的个体的适应度函数值所度量的优、劣程度决定它在下一代是被淘汰还是被遗传

  • 交叉
    交叉操作是将选择的两个个体p1和 p2
    作为父母节点,将两者的部分码值进行交换。假设有下面的两个节点的二进制编码表示:
    在这里插入图片描述
    随机产生一个1到7之间的随机数,假设为3,则将p1和 p2的低三位进行互换,如下图所示,就完成了交叉操作:
    在这里插入图片描述
  • 变异
    变异操作就是改变一个DNA序列上某一个点,
    在这里插入图片描述
    我们以一定的概率进行变异的操作,例如上方的DNA序列的第6个结点,由1变成了0
    在这里插入图片描述

代码示例

1、寻找函数最大值

在这里插入图片描述

首先我们生成POP_SIZE个长度为DNA_SIZE的DNA序列
在这里插入图片描述

pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))

定义函数图像

def F(x):
    """
    定义一个函数,就是图像中的线条
    :param x:
    :return:
    """
    return np.sin(10*x)*x + np.cos(2*x)*x     # to find the maximum of this function

我们可以将DNA转换为函数中x轴中的某个点,将0 1 DNA序列翻译成范围在(0, 5)的数字

def translateDNA(pop):
    """
    将0 1 DNA序列翻译成范围在(0, 5)的数字
    :param pop:
    :return:
    """
    return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * X_BOUND[1]

x轴上对应的y轴上的值,我们将其称为适应度

def get_fitness(pred):
    """
    获取个体的适用度
    :param pred:
    :return:
    """
    return pred + 1e-3 - np.min(pred)   #防止适应度为负数

我们从种群中选择个体
注意: 并不是每次都选择适应度最高的个体,只是适应度高的个体选择的概率比较大,其它适应度较低的个体,选择的概率小,将来适应度低的个体变异后,适应度可能会变大

def select(pop, fitness):    # nature selection wrt pop's fitness
    """
    从种群中选择
    :param pop:
    :param fitness:
    :return: 所选个体的下标,可重复选择replace=True
    """
    idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,
                           p=fitness/fitness.sum())
    return pop[idx]

 pop = select(pop, fitness)

之后我们对选择后的种群进行交叉和变异


def crossover(parent, pop):     # mating process (genes crossover)
    """
    交叉配对
    :param parent:
    :param pop:
    :return:
    """
    if np.random.rand() < CROSS_RATE:
        i_ = np.random.randint(0, POP_SIZE, size=1)                             # select another individual from pop 从种群中选择一个个体,
        cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool_)   # choose crossover points  生成要交叉的位置
        parent[cross_points] = pop[i_, cross_points]                            # mating and produce one child   进行交叉
    return parent

def mutate(child):
    """
    变异
    :param child:
    :return:
    """
    for point in range(DNA_SIZE):
        if np.random.rand() < MUTATION_RATE:
            child[point] = 1 if child[point] == 0 else 0
    return child

 # 复制一个副本
 pop_copy = pop.copy()
 # 进行遗传 和变异
 for parent in pop:
     child = crossover(parent, pop_copy)
     child = mutate(child)
     parent[:] = child  # parent is replaced by its child 父亲个体被孩子代替

最后,我们对其迭代多次

    for _ in range(N_GENERATIONS):
        # 得到图像上的y值
        F_values = F(translateDNA(pop))
        # 更新散点图
        if 'sca' in globals(): sca.remove()
        sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5)
        plt.pause(0.1)
        # 获取每一个个体的适应度
        fitness = get_fitness(F_values)

        #获取最好适用度的个体下标
        i = np.argmax(fitness)
        print("最优DNA",pop[i,:])
        pop = select(pop, fitness)
        # 复制一个副本
        pop_copy = pop.copy()
        # 进行遗传 和变异
        for parent in pop:
            child = crossover(parent, pop_copy)
            child = mutate(child)
            parent[:] = child  # parent is replaced by its child 父亲个体被孩子代替

完整代码:

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import time

import numpy as np
import matplotlib.pyplot as plt

DNA_SIZE = 10            # DNA length  DNA长度
POP_SIZE = 100           # population size  种群大小
CROSS_RATE = 0.8         # mating probability (DNA crossover)  交叉配对的概率
MUTATION_RATE = 0.003    # mutation probability  编译的概率
N_GENERATIONS = 200     #   代数
X_BOUND = [0, 5]         # x upper and lower bounds   x轴范围

def F(x):
    """
    定义一个函数,就是图像中的线条
    :param x:
    :return:
    """
    return np.sin(10*x)*x + np.cos(2*x)*x     # to find the maximum of this function

def get_fitness(pred):
    """
    获取个体的适用度
    :param pred:
    :return:
    """
    return pred + 1e-3 - np.min(pred)   #防止适应度为负数
def translateDNA(pop):
    """
    将0 1 DNA序列翻译成范围在(0, 5)的数字
    :param pop:
    :return:
    """
    return pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * X_BOUND[1]


def select(pop, fitness):    # nature selection wrt pop's fitness
    """
    从种群中选择
    :param pop:
    :param fitness:
    :return: 所选个体的下标,可重复选择replace=True
    """
    idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True,
                           p=fitness/fitness.sum())
    return pop[idx]



def crossover(parent, pop):     # mating process (genes crossover)
    """
    交叉配对
    :param parent:
    :param pop:
    :return:
    """
    if np.random.rand() < CROSS_RATE:
        i_ = np.random.randint(0, POP_SIZE, size=1)                             # select another individual from pop 从种群中选择一个个体,
        cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool_)   # choose crossover points  生成要交叉的位置
        parent[cross_points] = pop[i_, cross_points]                            # mating and produce one child   进行交叉
    return parent

def mutate(child):
    """
    变异
    :param child:
    :return:
    """
    for point in range(DNA_SIZE):
        if np.random.rand() < MUTATION_RATE:
            child[point] = 1 if child[point] == 0 else 0
    return child



if __name__ == '__main__':
    # initialize the pop DNA   s生成0-1的POP_SIZE行 DNA_SIZE列的种群
    pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))
    plt.ion()  # something about plotting
    # x轴
    x = np.linspace(*X_BOUND, 200)
    plt.plot(x, F(x))
    # 迭代N_GENERATIONS次
    for _ in range(N_GENERATIONS):
        # 得到图像上的y值
        F_values = F(translateDNA(pop))
        # 更新散点图
        if 'sca' in globals(): sca.remove()
        sca = plt.scatter(translateDNA(pop), F_values, s=200, lw=0, c='red', alpha=0.5)
        plt.pause(0.1)
        # 获取每一个个体的适应度
        fitness = get_fitness(F_values)

        #获取最好适用度的个体下标
        i = np.argmax(fitness)
        print("最优DNA",pop[i,:])
        pop = select(pop, fitness)
        # 复制一个副本
        pop_copy = pop.copy()
        # 进行遗传 和变异
        for parent in pop:
            child = crossover(parent, pop_copy)
            child = mutate(child)
            parent[:] = child  # parent is replaced by its child 父亲个体被孩子代替

    plt.ioff()
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux开发工具:vim的介绍和用法及其简单配置

前言 Vim 简介. 编辑. Vim是从 vi 发展出来的一个文本编辑器。. 代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用&#xff0c;和Emacs并列成为类Unix系统用户最喜欢的文本编辑器。. [1] vim的设计理念是命令的组合。. 用户学习了各种各样的…

公众号主体注销被冻结了,怎么迁移?

公众号迁移的好处有哪些&#xff1f;迁移后原公众号还能用吗&#xff1f;1&#xff09;获得更多权限功能如果公众号是个人主体&#xff0c;想进行认证&#xff0c;拥有更多权限功能。例如菜单栏跳转外部链接&#xff0c;相拥有留言功能&#xff0c;服务号认证获得开发权限等。就…

java社区商店生鲜商城电商平台springboot+vue

使用Vue框架的开发可以把前后台完全分离&#xff0c;前后端代码互不影响&#xff0c;代码上完全独立。而且Vue是用MVC或者称为MVVC的方式&#xff0c;使得前端代码也区分出model&#xff0c;controller and view层&#xff0c;代码做到更好的控制运行也更流畅。 jdk版本&#x…

Django 使用Mysql数据库

目录 Django 使用Mysql数据库本地安装Mysql数据服务安装好Pymysql服务Django配置数据库迁移各种报错无法找到mysqlclient数据库拒绝连接 Django 使用Mysql数据库 本地安装Mysql数据服务 安装好Pymysql服务 python3 -m pip install PyMySQL官方文档介绍 Django配置 官网文档 …

访问量突破1W,纪念一下~

Mr.kanglong&#xff0c; 继续加油&#xff01;

LeetCode讲解篇之138. 随机链表的复制

LeetCode讲解篇之138. 随机链表的复制 文章目录 LeetCode讲解篇之138. 随机链表的复制题目描述题解思路题解代码 题目描述 题解思路 先遍历一遍链表&#xff0c;用哈希表保存原始节点和克隆节点的映射关系&#xff0c;先只克隆节点的Val&#xff0c;然后再次遍历链表&#xff…

【SOA-KELM分类】基于海鸥算法优化核极限学习机分类研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

macbook笔记本电脑内存怎么清理才能干净流畅?

假如你还在为“你的系统内存不足”的提示所困扰&#xff0c;或者你的Mac电脑突然运行缓慢和卡顿&#xff0c;那么你一般需要认真了解一下macbook内存怎么清理了? MacBook是功能强大的电脑&#xff0c;这点毫无疑问&#xff0c;但是它仍旧会随着时间推移变得运行缓慢。值得庆幸…

【C++】继承 -- 详解

一、继承的概念及定义 1、继承的概念 继承 (inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈现了面向对象 程序设…

asp.net老年大学信息VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net老年大学信息管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net老年大学信息管理系统…

Linux 基础(从环境搭建到基础命令)

前言 一般来说&#xff0c;当我们写好一个网站&#xff0c;是需要部署到服务器上的。而服务器层面&#xff0c;最主流的操作系统就是 Linux。本章就重点来总结一下 Linux 环境搭建 以及最常用的一些 命令。 一、Linux环境搭建 1、购买云服务器 对于Linux来说&#xff0c;有…

基于PHP的芒果销售交易平台

有需要请加文章底部Q哦 可远程调试 基于PHP的芒果销售交易平台 一 介绍 芒果销售交易平台基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。用户可注册登录&#xff0c;购物下单&#xff0c;评论等。管理员登录后台可对芒果&#xff0c;用户&#xff0c;订…

Stable Diffusion绘画,卡通,教室

1 girl, parted lips, blush, makeup, light smile, school uniform, classroom, light rays, glow, thighs, collarbone, narrow waist, (masterpiece), wallpaper 1个女孩&#xff0c;双唇&#xff0c;腮红&#xff0c;化妆&#xff0c;浅笑&#xff0c;校服&#xff0c;教室…

python openai playground使用教程

文章目录 playground介绍Playground特点模型设置和参数选择四种语言模型介绍 playground应用构建自己的playground应用playground python使用 playground介绍 OpenAI Playground是一个基于Web的工具&#xff0c;旨在帮助开发人员测试和尝试OpenAI的语言模型&#xff0c;如GPT-…

微信小程序备案内容常见问题汇总

一、备案时间点 自2023年09月01日起,新的微信小程序,必须备案后才能上架; 在2024年03月31日前,所有小程序都必须完成备案; 于2024年04月01日起,对未备案小程序进行清退处理。 微信小程序备案系统已于9月4日上线。 二、备案流程 [找备案入口]–[填主体信息]–[填小程…

VMware使用ubuntu安装增强功能实现自动缩放

VMware使用ubuntu安装增强功能实现自动缩放 1.下载 VMware Tools2.安装tool 1.下载 VMware Tools 1.需要先弹出DVD 2.虚拟机-安装VMware Tools 进入终端 3.把media下的VMware压缩包拷贝到home/下 4.去home下解压 2.安装tool 进入vmware-tools-distrib sudo ./vmware-ins…

Liunx中系统安全及文件系统(极其粗糙版)

系统安全&#xff1a; 系统安全和数据防护&#xff0c;数据备份的资质 比如三台服务器&#xff1a; 500万 工信部是有要求的&#xff0c;组织必须保证处理的个人数据的安全性 品牌形象如何维护呢 基于liunx的安全加固措施&#xff1a; 权限进行控制 账号安全&#xff1a;…

latex中appendix附录怎么写

这个很简单&#xff0c;我一开始以为很复杂。 \begin{document} #这里是“正文”。 #这里是“引用”。 #下面开始是附录。 \appendix \section{Proofs}#和正文一样&#xff0c;甚至比如subsection,subsubsection之类的也一样。 This paper proposed a nice work!\section{Addi…

商品API接口优秀案例 │ 国家电网办公物资电商化采购项目API解决方案

苏宁易购集团股份有限公司&#xff08;以下简称“苏宁”&#xff09;作为中国领先的O2O智慧零售商&#xff0c;在互联网、物联网、大数据盛行的时代&#xff0c;持续推进智慧零售和线上线下融合战略&#xff0c;全品类经营&#xff0c;全渠道运营&#xff0c;开放苏宁物流云、数…

Leetcode232.用栈实现队列

本专栏内容为&#xff1a;leetcode刷题专栏&#xff0c;记录了leetcode热门题目以及重难点题目的详细记录 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;Leetcode &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &…