【计算智能】遗传算法(二):基本遗传算法在优化问题中的应用【实验】

前言

本系列文章架构概览:

  本文将介绍基本遗传算法在解决优化问题中的应用,通过实验展示其基本原理和实现过程:选取一个简单的二次函数作为优化目标,并利用基本遗传算法寻找其在指定范围内的最大值。

2. 基本遗传算法(SGA)

  基本遗传算法(Simple Genetic Algorithm : SGA)又称为简单遗传算法,使用选择算子、交叉算子和变异算子这三种基本的遗传算子,操作简单、容易理解,是其它遗传算法的雏形和基础。

2.1 基本遗传算法的构成要素

  基本遗传算法由染色体编码方法、适应度函数和遗传算子三个主要要素组成,前文已经对每个要素进行了详细说明:

2.2 算法流程

算法流程

  • 初始化种群: 随机生成一定数量的个体,每个个体对应一个可能的解,用二进制或其他编码方式表示。
  • 适应度评价: 计算每个个体的适应度,适应度值反映了个体解的优劣程度。
  • 选择操作: 根据个体的适应度值,使用一定的选择策略(如轮盘赌选择、锦标赛选择等)从当前种群中选择出一部分个体,作为下一代种群的父代。
  • 交叉操作: 对选中的父代个体进行交叉操作,产生新的子代个体。交叉操作通过==重组父代个体的基因==,产生新的解空间。
  • 变异操作: 对交叉后的子代个体以一定的小概率进行变异操作,==引入新的基因==,增加种群的多样性。
  • 终止条件判断: 检查是否满足算法终止条件(如达到最大迭代次数、找到满意解等),若满足则终止,否则回到步骤2,进行下一代种群的进化。

  通过不断重复上述过程,种群中个体的适应度将逐渐提高,最终converge到问题的最优解或近似最优解。

2.3 伪代码

Procedure GeneticAlgorithm()
    t = 0 // 初始化迭代次数
    InitializePopulation(P(t)) // 初始化种群
    Evaluate(P(t)) // 评估种群中个体的适应度
    Best = KeepBest(P(t)) // 保留当前最优个体

    while (not TerminationConditionMet()) do
        P(t) = Selection(P(t)) // 选择操作
        P(t) = Crossover(P(t)) // 交叉操作
        P(t) = Mutation(P(t))  // 变异操作
        t = t + 1 // 更新迭代次数
        P(t) = P(t-1)
        Evaluate(P(t)) // 重新评估种群中个体的适应度
        if (BestIndividual(P(t)) > Best) then
            Best = ReplaceBest(P(t)) // 更新最优个体
        end if
    end while

    return Best // 返回找到的最优解
End Procedure

3. 应用到优化问题中

3.1 理论分析

3.2 代码实现

1. 导入所需库

import random

2. 目标函数 f(x)

def f(x):
    return x ** 2

3 初始化种群

def initialize_population(population_size, chromosome_length):
    return [bin(random.randint(0, 31))[2:].zfill(chromosome_length) for _ in range(population_size)]

  生成指定大小的种群,每个个体都是一个长度为 chromosome_length (本实验为5)的二进制字符串,代表一个取值范围在 0 到 31 之间的整数。函数可以拆分为:

def initialize_population(size):
    return [encode(random.randint(0, 31)) for _ in range(size)]
  • 染色体编码函数 encode(x)
def encode(x):
    return bin(x)[2:].zfill(5)

  将整数 x 编码成一个长度为 5 的二进制字符串。内置的 bin() 函数将整数转换为二进制字符串,然后使用 zfill() 函数填充到长度为 5。

4. 计算适应度

def evaluate_individual(individual):
    x = int(individual, 2)
    return f(x)

def evaluate_population(population):
    return [evaluate_individual(individual) for individual in population]
  • evaluate_individual函数计算单个个体的适应度,将个体的二进制编码转换为十进制数x,然后计算目标函数f(x)的值作为适应度;
  • evaluate_population函数遍历整个种群,计算每个个体的适应度,返回一个包含所有个体适应度值的列表。

5. 选择操作:轮盘赌选择

def selection(population, fitness_values):
    total_fitness = sum(fitness_values)
    # 计算每个个体被选中的概率
    probabilities = [fitness / total_fitness for fitness in fitness_values]
    # print("\t选择概率: {}".format(probabilities))
    selected_population = []
    for _ in range(len(population)):
        selected_individual = random.choices(population, weights=probabilities)[0]
        # print("\t被选个体: {}".format(selected_individual))
        selected_population.append(selected_individual)
    return selected_population

  从轮盘赌选择的机制中可以看到,较优染色体的P值较大,被选择的概率就相对较大。但由于选择过程具有随机性,并不能保证每次选择均选中这些较优的染色体,因此也给予了较差染色体一定的生存空间。

点击【计算智能】遗传算法(二):基本遗传算法在优化问题中的应用【实验】——古月居可查看全文

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Laravel 谨慎使用Storage::append()

在 driver 为 local 时,Storage::append()在高并发下,会存在丢失数据问题,文件被覆写,而非尾部添加,如果明确是本地文件操作,像日志写入,建议使用 Illuminate\Filesystem\Filesystem或者php原生…

跨境干货|最新注册Google账号方法分享

谷歌账号对做跨境外贸业务的人来说是刚需,目前来说大部分的海外社媒平台、工具都可以用谷歌账号来注册。但是仍然有很多朋友并不知道如何注册这个谷歌账号,今天就来给大家分享2个注册谷歌账号的方法,一个是手机号注册,一个是如何跳…

品牌营销新趋势:独立站如何与TikTok达人互动共赢

在当今数字化营销时代,独立站与TikTok达人的互动营销已成为一种高效的推广方式。通过精心设计的互动环节,独立站不仅能够增强用户参与感,还能显著提升带货效果。本文Nox聚星将和大家探讨独立站如何与TikTok达人进行高效互动,吸引用…

如何有效管理你的Facebook时间线?

Facebook作为全球最大的社交平台之一,每天都有大量的信息和内容在用户的时间线上展示。有效管理你的Facebook时间线,不仅可以提升用户体验,还能够帮助你更好地控制信息流和社交互动。本文将探讨多种方法和技巧,帮助你有效管理个人…

开发者评测|操作系统智能助手OS Copilot

操作系统智能助手OS Copilot 文章目录 操作系统智能助手OS CopilotOS Copilot 是什么优势功能 操作步骤创建实验重置密码创建Access Key配置安全组安装 os-copilot环境变量配置功能评测命令行模式多轮交互模式 OS Copilot 产品体验评测反馈OS Copilot 产品功能评测反馈 参考文档…

C++基础(七):类和对象(中-2)

上一篇博客学的默认成员函数是类和对象的最重要的内容,相信大家已经掌握了吧,这一篇博客接着继续剩下的内容,加油! 目录 一、const成员(理解) 1.0 引入 1.1 概念 1.2 总结 1.2.1 对象调用成员函数 …

使用 mongo2neo4j 和 SemSpect 通过各种方式进行图探索

用于可视化和探索每个 MEAN 堆栈背后的数据图的 ETL 您是否正在努力回答有关 MEANS Web 服务数据的紧急问题?哪里有 BI 可以快速回答“上个季度哪些亚洲的artisan.plus 用户触发了订单?”这个问题,而无需编写查询?使用 mongo2neo4…

Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

上次结束了基础IO:Linux:基础IO(三.软硬链接、动态库和静态库、动精态库的制作和加载) 文章目录 1.认识进程间通信2.管道2.1匿名管道2.2pipe()函数 —创建匿名管道2.3匿名管道的四种情况2.4管道的特征 3.基于管道的进程池设计4.命…

FineBI在线学习资源-数据处理

FineBI在线学习资源汇总: 学习资源 视频课程 帮助文档 问答 数据处理学习文档: 相关资料: 故事背景概述-https://help.fanruan.com/finebi6.0/doc-view-1789.html 基础表处理-https://help.fanruan.com/finebi6.0/doc-view-1791.html …

软件设计之Java入门视频(11)

软件设计之Java入门视频(11) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

Ubuntu 24.04 上安装 Kubernetes,超级详细的教程!

Kubernetes 是一个免费的开源容器编排工具,它允许基于容器的应用程序的自动化部署、扩展和管理。 我们将介绍如何使用 Kubeadm 逐步在 Ubuntu 24.04 上安装 Kubernetes 此次演示中,我们将使用以下三个 Ubuntu 24.04 实例 Instance 1 : Master Node (k…

计算机视觉——opencv快速入门(二) 图像的基本操作

前言 上一篇文章中我们介绍了如何配置opencv,而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。 图像的读取,显示与存储 读取图像文件 在opencv中我们利用imread函数来读取图像文件,函数语法如下: imagecv2.imre…

植物大战僵尸融合版最新版1.0下载及安装教程

《植物大战僵尸融合版》最新版1.0已经发布,为粉丝们带来了全新的游戏体验。这个版本由B站UP主蓝飘飘fly精心打造,引入了创新的植物融合玩法,让玩家可以享受策略和创意的结合。以下是游戏的详细介绍和安装指南: 游戏特色介绍 全新…

TF-IDF计算过程一步步推导详解含代码演示

相关概念 TF-IDF TF-IDF(Term Frequency–Inverse Document Frequency)是一种用于资讯检索与文本挖掘的常用加权技术。TF-IDF是一种统计方法,用以评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在…

lua入门(2) - 数据类型

前言 本文参考自: Lua 数据类型 | 菜鸟教程 (runoob.com) 希望详细了解的小伙伴还请查看上方链接: 八个基本类型 type - 函数查看数据类型: 测试程序: print(type("Hello world")) --> string print(type(10.4*3)) --> number print(t…

pdf可以删除其中一页吗?6个软件教你快速进行pdf编辑

pdf可以删除其中一页吗?6个软件教你快速进行pdf编辑 编辑PDF文件并删除特定页面是处理文档时常见的需求,特别是在需要定制或精简文件内容时。以下是几款广受欢迎的PDF编辑软件,它们提供了强大的页面删除功能,帮助用户轻松管理和修…

Vue3学习笔记(n.0)

vue指令之v-for 首先创建自定义组件&#xff08;practice5.vue&#xff09;&#xff1a; <!--* Author: RealRoad1083425287qq.com* Date: 2024-07-05 21:28:45* LastEditors: Mei* LastEditTime: 2024-07-05 21:35:40* FilePath: \Fighting\new_project_0705\my-vue-app\…

安卓开发定时截屏

此处有两种方式&#xff1a;&#xff08;都是定时截屏&#xff0c;不需要定时功能可以剔除service&#xff09; 1.app内截屏 https://download.csdn.net/download/hdhhd/89517797 2.截取当前任意手机显示屏幕 https://download.csdn.net/download/hdhhd/89517800 第一种…

hitcontraining_uaf

BUUCTF[PWN][堆] 题目&#xff1a;BUUCTF在线评测 (buuoj.cn) 程序del是没有将申请的指针清零&#xff0c;导致可以再次调用输出print。 查看add_note函数&#xff1a;根据当前 notelist 是否为空&#xff0c;来申请了一个8字节的空间将地址(指针)放在notelist[i]中&#xff…

海尔智家:科技优秀是一种习惯

海尔智家&#xff1a;科技优秀是一种习惯 2024-06-28 15:19代锡海 6月24日&#xff0c;2023年度国家科学技术奖正式揭晓。海尔智家“温湿氧磁多维精准控制家用保鲜电器技术创新与产业化”项目荣获国家科学技术进步奖&#xff0c;成为家电行业唯一牵头获奖企业。 很多人说&…