【计算智能】基本遗传算法在优化问题中的应用与实验【理论到程序】

文章目录

  • 1. 引言:遗传算法简介
  • 2. 基本遗传算法(SGA)
    • 2.1 基本遗传算法的构成要素
      • 1. 染色体编码
      • 2. 适应度函数
      • 3. 遗传算子
    • 2.2 实验设计与方法
      • 1. 算法流程
      • 2. 伪代码
      • 3. python实现
        • 1. 导入模块
        • 2. 目标函数 f(x)
        • 3 初始化种群
        • 4. 计算适应度
        • 5. 选择操作:轮盘赌选择
        • 6. 单点交叉操作
        • 7. 变异操作
        • 8. 遗传算法
        • 9. 主程序
    • 2.3 实验结果与分析
    • 2.4 结论与展望
  • 3. 遗传算法的改进
  • 4. 遗传算法的应用
  • 5. 代码整合
    • 6. 随笔

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

1. 引言:遗传算法简介

  遗传算法是一种启发式优化算法,模拟了生物进化的过程,通过选择、交叉和变异等操作来搜索解空间中的最优解或近似解,其在解决复杂的优化问题和搜索空间较大的问题时表现出色。

2. 基本遗传算法(SGA)

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

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

  基本遗传算法由染色体编码方法、适应度函数和遗传算子三个主要要素组成。下面将对每个要素进行详细说明:

1. 染色体编码

  染色体编码方法指将问题的解空间映射到染色体上的过程。通常采用二进制编码方法,将问题的解表示为一个二进制串。例如,在解决一个优化问题时,可以将每个解编码为一个二进制串,其中每一位代表一个决策变量的取值。除了二进制编码,还可以使用整数编码、浮点数编码或字符编码,根据问题的特性选择合适的编码方法。

2. 适应度函数

  适应度函数(又称适应值/适应函数)用于评价染色体的优劣程度,即衡量染色体对问题解的贡献或适应程度。适应度函数的设计应与问题的特性密切相关,通常通过问题的目标函数来定义。例如,在优化问题中,适应度函数可以直接使用目标函数的值作为染色体的适应度,或根据问题的约束条件进行适当的调整。

3. 遗传算子

  遗传算子是基本遗传算法的核心组成部分,包括选择算子、交叉算子和变异算子。

  • 选择算子(Selection):又称复制算子,按照某种策略从父代中挑选个体进入下一代,常见的选择算子包括比例选择、轮盘赌选择、锦标赛选择等。
    • 选择算子的目标是按染色体的适应度进行选择,以保留适应度较高的个体,促进种群的进化。
  • 交叉算子(Crossover):又称杂交算子,用于从选定的父代染色体中产生子代染色体。常见的交叉算子包括单点交叉、多点交叉等。
    • 交叉算子通过交换染色体的部分信息产生新的个体,增加种群的多样性。
  • 变异算子(Mutation):用于对染色体的个别基因进行随机变化。
    • 变异算子的作用是引入种群的随机性,避免陷入局部最优解。常见的变异算子包括单点变异、均匀变异等,通常具有较小的概率,以保持种群的稳定性

  基本遗传算法能够模拟自然进化的过程,通过选择、交叉和变异等遗传操作逐步优化种群,求得问题的最优解或近似解。

2.2 实验设计与方法

1. 算法流程

Created with Raphaël 2.3.0 开始 初始化群体 适应值评价,保存最优染色体 选择 交配 变异 重新评价适应值,更新最优染色体 满足终止条件? 结束 yes no

2. 伪代码

Procedure GeneticAlgorithm()t = 0 // 初始化迭代次数InitializePopulation(P(t)) // 初始化种群Evaluate(P(t)) // 评估种群中个体的适应度Best = KeepBest(P(t)) // 保留当前最优个体while (not TerminationConditionMet()) doP(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) thenBest = ReplaceBest(P(t)) // 更新最优个体end ifend whilereturn Best // 返回找到的最优解
End Procedure

3. python实现

  本实验选择了一个简单的二次函数 m a x f ( x ) = x 2 , x ∈ [ 0 , 31 ] max f(x) = x^2, x \in [0, 31] maxf(x)=x2,x[0,31] 作为优化目标:

  • 对函数的解空间进行二进制编码
  • 随机生成初始种群
  • 计算每个个体的适应度使用选择、交叉和变异操作优化种群,直到达到设定的迭代次数。
  • 评估最优解的适应度并输出结果。
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 fitness(chromosome):return f(decode(chromosome))

这个函数计算染色体的适应度,即目标函数的取值。它通过先解码染色体,然后将解码后的值代入目标函数 f(x) 中来计算适应度。

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

6. 单点交叉操作
def crossover(parent1, parent2):crossover_point = random.randint(1, len(parent1) - 1)child1 = parent1[:crossover_point] + parent2[crossover_point:]child2 = parent2[:crossover_point] + parent1[crossover_point:]print("\t\t交叉过程:{} ————> {}\n\t\t\t\t{} ————> {}".format(parent1, child1, parent2, child2))return child1, child2

  随机选择一个交叉点,然后将两个父代个体在交叉点处进行交换,生成两个新的子代个体。

7. 变异操作
def mutation(population, mutation_rate):mutated_population = []for individual in population:mutated_individual = ''for bit in individual:if random.random() < mutation_rate:mutated_bit = '0' if bit == '1' else '1'else:mutated_bit = bitmutated_individual += mutated_bitif mutated_individual != individual:print("\t\t变异过程:{} ————> {}".format(individual, mutated_individual))mutated_population.append(mutated_individual)return mutated_population

  对于染色体中的每个基因,根据指定的变异率,以一定概率对其进行变异(由 0 变为 1 或由 1 变为 0)。

8. 遗传算法
def genetic_algorithm(population_size, chromosome_length, crossover_rate, mutation_rate, max_iterations):population = initialize_population(population_size, chromosome_length)best_individual = Nonebest_fitness = float('-inf')print(f"初始化群体:{population}")for iteration in range(max_iterations):print(f"第{iteration}代群体:{population}")# 评估种群中所有个体的适应度fitness_values = evaluate_population(population)print(f"\t 适应度: {fitness_values}")# 选择操作population = selection(population, fitness_values)print(f"\t选择操作:{population}")# 交叉操作for i in range(0, len(population), 2):if random.random() < crossover_rate:population[i], population[i + 1] = crossover(population[i], population[i + 1])print(f"\t交叉操作:{population}")# 变异操作population = mutation(population, mutation_rate)print(f"\t变异操作:{population}")# 更新最优个体max_fitness = max(fitness_values)if max_fitness > best_fitness:best_fitness = max_fitnessbest_individual = population[fitness_values.index(max_fitness)]return best_individual, best_fitness
9. 主程序
if __name__ == '__main__':# 设置参数population_size = 4  # 群体大小chromosome_length = 5  # 由于 x ∈ [0, 31],因此需要 5 位二进制编码crossover_rate = 0.9  # (提高)交叉率, 发生交叉的概率较大  𝑃_𝑐=0.8 , 0.9…# 哪两个个体配对交叉是随机的,交叉点位置的选取是随机的(单点交叉)mutation_rate = 0.01  # (降低)变异率, 变异概率𝑃_𝑚=0.01,0.05 … 交叉点位置的选取是随机的max_iterations = 2  # (增加)迭代次数# 运行遗传算法best_solution, max_fitness = genetic_algorithm(population_size, chromosome_length, crossover_rate, mutation_rate,max_iterations)# 输出结果decoded_best_solution = int(best_solution, 2)print("最优解:", decoded_best_solution)print("最大适应度:", max_fitness)

在这里插入图片描述

2.3 实验结果与分析

  为了保持遗传算法较好的运行性能,变异概率P_c应该设置在一个合适的范围。变异操作通过改变原有染色体的基因,在提高群体多样性方面具有明显的促进作用如果P过小,算法容易早熟。但是在算法运行的过程中,已找到的较优解可能在变异过程中遭到破坏,如果P的值过大,可能会导致算法目前所处的较好的搜索状态倒退回原来较差的情况。因此,我们应该将种群的变异限制在一定范围内。一般地,P_c可设定在 0.001~0.1之间。

  实验结果显示,在给定的迭代次数内,遗传算法成功找到了函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2 x ∈ [ 0 , 31 ] x \in [0, 31] x[0,31] 范围内的最大值。最终的最优解为 x = 31 x = 31 x=31,对应的最大适应度为 f ( 31 ) = 961 f(31) = 961 f(31)=961。通过动画展示了遗传算法的演化过程,直观地呈现了优化过程中种群的变化和适应度的提升。

2.4 结论与展望

  本文介绍了遗传算法的基本原理和实现过程,并通过实验展示了其在优化问题中的应用。实验结果表明,遗传算法能够有效地搜索解空间,并找到近似最优解。未来,可以进一步研究和优化遗传算法的参数设置、种群初始化和选择策略,以提高算法的性能和收敛速度。

3. 遗传算法的改进

4. 遗传算法的应用

5. 代码整合

import random# 定义目标函数
def f(x):return x ** 2# 初始化种群
def initialize_population(population_size, chromosome_length):return [bin(random.randint(0, 31))[2:].zfill(chromosome_length) for _ in range(population_size)]# 计算个体的适应度
def evaluate_individual(individual):x = int(individual, 2)return f(x)# 评估种群中所有个体的适应度
def evaluate_population(population):return [evaluate_individual(individual) for individual in population]# 选择操作 - 轮盘赌选择算法
"""
从轮盘赌选择的机制中可以看到,较优染色体的P值较大,被选择的概率就相对较大。
但由于选择过程具有随机性,并不能保证每次选择均选中这些较优的染色体,因此也给予了较差染色体一定的生存空间。
"""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# 单点交叉操作
def crossover(parent1, parent2):crossover_point = random.randint(1, len(parent1) - 1)child1 = parent1[:crossover_point] + parent2[crossover_point:]child2 = parent2[:crossover_point] + parent1[crossover_point:]print("\t\t交叉过程:{} ————> {}\n\t\t\t\t{} ————> {}".format(parent1, child1, parent2, child2))return child1, child2def mutation(population, mutation_rate):mutated_population = []for individual in population:mutated_individual = ''for bit in individual:if random.random() < mutation_rate:mutated_bit = '0' if bit == '1' else '1'else:mutated_bit = bitmutated_individual += mutated_bitif mutated_individual != individual:print("\t\t变异过程:{} ————> {}".format(individual, mutated_individual))mutated_population.append(mutated_individual)return mutated_population# 主程序
def genetic_algorithm(population_size, chromosome_length, crossover_rate, mutation_rate, max_iterations):population = initialize_population(population_size, chromosome_length)best_individual = Nonebest_fitness = float('-inf')print(f"初始化群体:{population}")for iteration in range(max_iterations):print(f"第{iteration}代群体:{population}")# 评估种群中所有个体的适应度fitness_values = evaluate_population(population)print(f"\t 适应度: {fitness_values}")# 选择操作population = selection(population, fitness_values)print(f"\t选择操作:{population}")# 交叉操作for i in range(0, len(population), 2):if random.random() < crossover_rate:population[i], population[i + 1] = crossover(population[i], population[i + 1])print(f"\t交叉操作:{population}")# 变异操作population = mutation(population, mutation_rate)print(f"\t变异操作:{population}")# 更新最优个体max_fitness = max(fitness_values)if max_fitness > best_fitness:best_fitness = max_fitnessbest_individual = population[fitness_values.index(max_fitness)]return best_individual, best_fitnessif __name__ == '__main__':# 设置参数"""为了保持遗传算法较好的运行性能,变异概率P_c应该设置在一个合适的范围。变异操作通过改变原有染色体的基因,在提高群体多样性方面具有明显的促进作用如果P过小,算法容易早熟。但是在算法运行的过程中,已找到的较优解可能在变异过程中遭到破坏,如果P的值过大,可能会导致算法目前所处的较好的搜索状态倒退回原来较差的情况。因此,我们应该将种群的变异限制在一定范围内。一般地,P_c可设定在 0.001~0.1之间。"""population_size = 4  # 群体大小chromosome_length = 5  # 由于 x ∈ [0, 31],因此需要 5 位二进制编码crossover_rate = 0.9  # (提高)交叉率, 发生交叉的概率较大  𝑃_𝑐=0.8 , 0.9…# 哪两个个体配对交叉是随机的,交叉点位置的选取是随机的(单点交叉)mutation_rate = 0.01  # (降低)变异率, 变异概率𝑃_𝑚=0.01,0.05 … 交叉点位置的选取是随机的max_iterations = 2  # (增加)迭代次数# 运行遗传算法best_solution, max_fitness = genetic_algorithm(population_size, chromosome_length, crossover_rate, mutation_rate,max_iterations)# 输出结果decoded_best_solution = int(best_solution, 2)print("最优解:", decoded_best_solution)print("最大适应度:", max_fitness)

6. 随笔

  遗传算法作为一种启发式优化算法,在解决复杂问题和搜索空间较大的问题时表现出色。本文介绍了遗传算法的基本原理和应用,并通过实验展示了其在优化问题中的效果。希望本文能够对读者理解和应用遗传算法有所帮助。

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

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

相关文章

再谈有效地访问Github

文章目录 1. 知识回顾2. 问题描述3. 问题解决3.1 Mac系统3.2 Windows系统4. 内容总结1. 知识回顾 我们在之前的内容中介绍过如何有效地访问Github。如果大家忘记的话可以点击这里查看。之前的内容主要偏重于问题的分析和解决的思路,有些朋友看了后还是不清楚如何解决问题。 …

设计模式之工厂模式FactoryPattern(二)

一、简单工厂 package com.xu.demo.factoryPattern;/*** 简单工厂模式类*/ public class SimpleFactoryPattern {public static Phone create(String name) {//根据输入对象名称判断返回相匹配的对象if("IPhone".equals(name)) {//返回对象return new IPhone();}else…

【补充】图神经网络前传——图论

本文作为对图神经网络的补充。主要内容是看书。 仅包含Introduction to Graph Theory前五章以及其他相关书籍的相关内容&#xff08;如果后续在实践中发现前五章不够&#xff0c;会补上剩余内容&#xff09; 引入 什么是图&#xff1f; 如上图所示的路线图和电路图都可以使用…

国家开放大学2024年春《Matlab语言及其应用》实验一熟悉Matlab 操作环境参考答案

实验报告 姓名&#xff1a; 学号&#xff1a; 实验一名称&#xff1a;熟悉 Matlab 操作环境 实验目标&#xff1a;通过简单变量和矩阵的录入、计算和查看相关信息&#xff0c;了解 Matlab 操作界面 及各子窗口使用方法。熟悉一系列便于使用的 Matlab 函数和文件的工具。 实…

复旦 北大 | 从头训练中文大模型:CT-LLM

引言 当前&#xff0c;绝大多数大模型&#xff08;LLMs&#xff09;基本上都是以英文语料库训练得到的&#xff0c;然后经过SFT来匹配不同的语种。然而&#xff0c;今天给大家分享的这篇文章旨在从头开始训练中文大模型&#xff0c;在训练过程中「主要纳入中文文本数据」&…

qt5-入门-2D绘图-Graphics View 架构

参考&#xff1a; Qt Graphics View Framework_w3cschool https://www.w3cschool.cn/learnroadqt/4mvj1j53.html C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 基础知识 QPainter比较适合少量绘图的情…

10个使用NumPy就可以进行的图像处理步骤

图像处理是一种数学计算。数字图像由称为像素的彩色小点组成。每个像素由红、绿、蓝(RGB)三个独立的颜色组成。每个像素中的主色由每个RGB分量的数值决定。 本文将介绍10个使用使用NumPy就可以进行的图像处理步骤&#xff0c;虽然有更强大的图像处理库&#xff0c;但是这些简单…

光伏管理系统:降本增效解决方案。

现在是光伏发展的重要节点&#xff0c;如何在众多同行中脱颖而出并且有效的达到降低成本、提高效率也是很多企业都在考虑的问题&#xff0c;鹧鸪云的团队研发出了光伏管理系统&#xff0c;通过更高效、更智能、更全面的管理方式来帮助企业实现降本增效的转型&#xff0c;小编带…

公考学习平台|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.1论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

笔记-word导出PDF老是更新域导致图片和表格题注发生变化

问题描述&#xff1a;微软word 导出PDF时&#xff0c;老是更新域&#xff0c;导致图片和表格题注否跟着变化 以下是解决方法的具体描述。 目录 一、准备工作二、操作步骤 一、准备工作 1、工具版本&#xff1a;微软 word 2016&#xff08;其他微软word版本也OK&#xff09; …

【自研网关系列】过滤器链 -- 鉴权过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

智能化未来:Agent AI智能体的崛起与全球挑战

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Redis源码学习记录:列表 (ziplist)

ziplist redis 源码版本&#xff1a;6.0.9。ziplist 的代码均在 ziplist.c / ziplist.h 文件中。 定义 ziplist总体布局如下&#xff1a; <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend> zlbytes&#xff1a;uin…

高德优评项目,一单29.9,拷贝+评价,日入500

项目概述&#xff1a; 下载 地 址 &#xff1a; laoa1.cn/1836.html 本项目的核心非常简单&#xff0c;即在高德地图上撰写评论。每条评论完成后&#xff0c;参与者将获得8元的奖励。 此外&#xff0c;高德地图还会提供视频会员作为奖励。我们可以将这些视频会员进行变现…

LLM 构建Data Multi-Agents 赋能数据分析平台的实践之③:数据分析之二(大小模型协同)

一、概述 随着新一代信息技术在产业数字化中的应用&#xff0c;产生了大量多源多模态信息以及响应的信息处理模式&#xff0c;数据孤岛、模型林立的问题也随之产生&#xff0c;使得业务系统臃肿、信息处理和决策效率低下&#xff0c;面对复杂任务及应用场景问题求解效率低。针…

做外贸如何主动开发外贸客户

在外贸业务中&#xff0c;主动开发客户是至关重要的一步&#xff0c;它能够帮助你扩大市场覆盖范围&#xff0c;建立稳定的客户基础。以下是一些有效的策略和方法&#xff0c;可以帮助你更有效地主动开发外贸客户&#xff1a; 明确目标市场&#xff1a;首先&#xff0c;你需要确…

【快速入门】数据库的增删改查与结构讲解

文章的操作都是基于小皮php study的MySQL5.7.26进行演示 what 数据库是能长期存储在计算机内&#xff0c;有组织的&#xff0c;可共享的大量数据的集合。数据库中的数据按照一定的数据模型存储&#xff0c;具有较小的冗余性&#xff0c;较高的独立性和易扩展性&#xff0c;并为…

【docker】Docker开启远程访问

将构建的镜像自动上传到服务器。 需要开放 Docker 的端口&#xff0c;让我们在本地能连接上服务器的 Docker&#xff0c;这样&#xff0c;才能上传构建的镜像给 Docker。 开启远程访问 首先在服务器打开 Docker 的服务文件 vim /usr/lib/systemd/system/docker.service修改…

LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)

0x01 产品简介 LiveGBS是安徽青柿信息科技有限公司研发的一款国标(GB28181)流媒体服务软件,可提供提供用户管理及Web可视化页面管理,开源的前端页面源码;提供设备状态管理,可实时查看设备是否掉线等信息等。 0x02 漏洞概述 LiveGBS user/save 接口处存在逻辑缺陷漏洞,未…

浅论汽车研发项目数字化管理之道

随着汽车行业竞争不断加剧&#xff0c;汽车厂商能否快速、高质地推出贴合市场需求的新车型已经成为车企竞争的重要手段&#xff0c;而汽车研发具备流程复杂、专业领域多、协作难度大、质量要求高等特点&#xff0c;企业如果缺少科学健全的项目管理体系&#xff0c;将会在汽车研…