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

news2025/2/23 10:27:37

前言

本系列文章架构概览:

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

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值较大,被选择的概率就相对较大。但由于选择过程具有随机性,并不能保证每次选择均选中这些较优的染色体,因此也给予了较差染色体一定的生存空间。

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

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

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

相关文章

柯桥小语种学校成人生活口语学习|西班牙语中H为什么不发音…

01 H en el alfabeto espaol 西语字母表中的h 字母H是唯一一个在标准西班牙语中不再代表任何音素的字母。尽管在它单独出现时被叫做HACHE,但在大多数单词拼写中,它只是一个没有声音对应关系的字母,因此RAE称其为“无声的H”(hac…

如何正确安装与维护电化学一氧化碳传感器?专业指南

电化学一氧化碳传感器是一种用于检测空气中一氧化碳(CO)浓度的设备,它基于电化学原理运作。这类传感器的核心组成部分包括电极、电解质和透气膜,它们共同构成一个微型的电化学电池。 电化学一氧化碳传感器的特点包括:…

滑动窗口练习3-最大连续1的个数(三)

题目链接:. - 力扣(LeetCode) 题目描述: 给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1…

平面设计考试题

考试题 缺省页作用:缓减缺省页带来的负面情绪,增加s用户与产品的粘度,提升产品的用户体验 网站基本类型 c端b端 c端 面向用户和消费者的 门户站 产品网站 企业网站 电商网站 专题页面 游戏网站 视频网站 h5移动端 四大门户网站:新浪&…

【Android源码】Gerrit上传Android源码

关于Gerrit的安装参考下面链接 【Android源码】Gerrit安装 要实现上传Android源码,需要经历以下几步: 下载Android代码创建源码仓库创建manifests仓库上传源码其他电脑下载源码 要证明Gerrit中的源码真实可用,肯定是以其他人能真正共享到代…

idea中maven全局配置

配置了就不需要每次创建项目都来设置maven仓库了。 1.先把项目全关了 2. 进入全局设置 3.设置maven的仓库就可以了

绝地求生PUBG都准备了但是一直不匹配怎么办

绝地求生PUBG,作为一款备受玩家喜爱的射击游戏,以其真实的战斗体验和策略性决策而著称。玩家们在游戏中需要熟悉地图、选择适合的装备和战斗方式,并与队友进行默契的团队合作,才能在战场上取得优势。最近很多玩家都开始下载游玩绝…

RedHat9 | kickstart无人值守批量安装

一、知识补充 kickstart Kickstart是一种用于Linux系统安装的自动化工具,它通过一个名为ks.cfg的配置文件来定义Linux安装过程中的各种参数和设置。 kickstart的工作原理 Kickstart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,…

昇思25天学习打卡营第17天|ChatGLM-6B聊天demo

一、简介: 本次实验,基于MindNLP和ChatGLM6B模型搭建一个小的聊天应用,ChatGLM6B 是基于 GLM-4 模型开发的开源对话机器人,拥有 62 亿个参数,能够进行自然流畅的语言交流。在对话中,ChatGLM6B 可以胜任文案…

实现原理:远程过程调用(RPC)

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…

破解在制品管理不透明难题

在快节奏的现代工业浪潮中,每一个细微的管理环节都直接关系到企业的竞争力与盈利能力。在车间生产中,在制品管理流程不透明是一个常见问题,它可能导致生产效率低下、成本增加、库存积压以及沟通障碍等负面影响。 在制品管理流程不透明&#x…

人员定位技术的行业应用,你有没有了解过?

在之前的文章中,新锐科创为大家讲述了,将人员定位技术实际应用于工厂人员定位的效果,大家感觉是不是有点新颖,那么,你又是否清楚人员定位技术的行业应用呢?如果你从来都没有了解过,建议看看本篇…

【EFK】efk 8收集docker容器日志测试

前言 目前,efk 全家桶已经更新到版本8 了,本章节我们使用8版本的elk搭建日志收集系统,了解它的配置运行过程,方便以后在更复杂的环境中更好的使用。 版本默认就是8最新的,也可以自己指定其他8的版本 elasticsearch: …

php简单商城小程序系统源码

🛍️【简单商城小程序】🛍️ 🚀一键开启,商城搭建新体验🚀 你还在为繁琐的商城搭建流程头疼吗?现在,有了简单商城系统小程序,一切变得轻松又快捷!无需复杂的编程知识&a…

Stable Diffusion美得令人心动亚洲女性真人模型、提示词分享!

前言 提示词1: 电影灯光 Prompt: xxmixgirl, a mysterious woman, fog, movie lights, 【colors】 theme, smiling 提示词:神秘女子,迷雾,电影灯光,【颜色】主题,微笑 颜色:可以指定一种或多种…

晨持绪电商:大学毕业生投资抖音网店怎么样

在这个数字化飞速发展的时代,传统的职业路径已不再是唯一的选择。对于充满激情和创意的大学毕业生来说,投资抖音网店或许是一个颇具前景的选择。 抖音作为一个流量巨大的社交媒体平台,为年轻人提供了一个展示自我、推广产品的绝佳舞台。与传统…

Kotlin/Android中执行网络请求

方式一:使用okhttp3 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar 使用网络请求时需要把网络的权限打开&a…

Web缓存—Nginx和CDN应用

目录 一、代理的工作机制 二、概念 三、作用 四、常用的代理服务器 二.Nginx缓存代理服务器部署 1.在三台服务器上部署nginx 此处yum安装 2.准备测试界面 三、CDN概念及作用 1.CDN的工作过程 一、代理的工作机制 (1)代替客户机向网站请求数据…

echarts横向立体3D柱状图

实现原理:series中包含两个普通的柱状图bar,其宽度各占一半且设置间距barGap为0,再添加一个象形柱状图pictorialBar,symbol设为菱形diamond,调整其位置大小层级等数据以达到覆盖在柱状图顶部的立体效果。 运行效果&am…

找不到d3dcompiler43.dll如何修复,分享5种方法助你解决问题

电脑提示找不到d3dcompiler43.dll,这是一个常见的小问题,主要是由于该dll文件丢失所导致。在日常使用电脑的过程中,我们可能会遇到此类丢失问题。为了解决该问题,我们只需进行相关的文件修复操作即可。以下是几种常见的d3dcompile…