【数学建模】(启发式算法)遗传算法:自然选择的计算模型
遗传算法:自然选择的计算模型
文章目录
- 遗传算法:自然选择的计算模型
- 1. 引言
- 2. 遗传算法的基本原理
- 2.1 基本概念
- 2.2 算法流程
- 3. 编码方式
- 3.1 二进制编码
- 3.2 实数编码
- 3.3 排列编码
- 4. 选择操作
- 4.1 轮盘赌选择
- 4.2 锦标赛选择
- 4.3 精英保留策略
- 5. 交叉操作
- 5.1 单点交叉
- 5.2 双点交叉
- 5.3 均匀交叉
- 6. 变异操作
- 6.1 位翻转变异
- 6.2 高斯变异
- 7. Python实现示例
- 8. 遗传算法的优缺点
- 优点
- 缺点
- 9. 应用领域
- 10. 总结与展望
- 参考文献
1. 引言
遗传算法(Genetic Algorithm, GA)是一种受自然选择和遗传学原理启发的优化算法,由约翰·霍兰德(John Holland)在20世纪70年代首次提出。它通过模拟生物进化过程中的自然选择、交叉和变异等机制,在搜索空间中寻找最优或近似最优解。作为计算智能中的重要分支,遗传算法已被广泛应用于函数优化、机器学习、路径规划、调度问题等众多领域。
2. 遗传算法的基本原理
遗传算法的核心思想是通过模拟达尔文进化论中的"适者生存"原则,让问题的可能解经历选择、交叉和变异等操作,逐代进化,最终收敛到最优或近似最优解。
2.1 基本概念
- 个体(Individual): 问题的一个可能解
- 种群(Population): 多个个体的集合
- 基因(Gene): 编码后的决策变量
- 染色体(Chromosome): 个体的一组基因
- 适应度(Fitness): 评价个体优劣的指标
- 选择(Selection): 根据适应度选择优秀个体
- 交叉(Crossover): 两个个体交换部分基因
- 变异(Mutation): 个体基因的随机改变
2.2 算法流程
- 初始化: 随机生成初始种群
- 评价: 计算每个个体的适应度
- 选择: 根据适应度选择优秀个体作为父代(其余淘汰)
- 交叉: 父代个体两两配对进行基因交换,产生子代
- 变异: 以一定概率对子代个体的基因进行随机变异
- 更新: 用新生成的子代替换部分或全部父代,形成新一代种群
- 终止: 达到终止条件(如最大迭代次数)时停止,否则返回步骤2
3. 编码方式
遗传算法中,需要将问题的解编码为染色体形式。常见的编码方式包括:
3.1 二进制编码
最经典的编码方式,将解表示为0和1组成的串。
# 二进制编码示例
chromosome = [1, 0, 1, 1, 0, 1, 0, 0]
3.2 实数编码
直接使用实数表示解,适用于连续优化问题。
# 实数编码示例
chromosome = [3.14, 2.71, 1.41, 1.73]
3.3 排列编码
用于表示排列问题,如TSP(旅行商问题)。
# 排列编码示例(城市访问顺序)
chromosome = [3, 1, 4, 2, 5]
4. 选择操作
选择操作用于从当前种群中选出优秀个体进行繁殖。常见的选择方法有:
4.1 轮盘赌选择
按照适应度比例分配选择概率,适应度越高被选中的概率越大。
4.2 锦标赛选择
随机选取k个个体,从中选择适应度最高的个体。
4.3 精英保留策略
直接将当前种群中适应度最高的几个个体保留到下一代。
5. 交叉操作
交叉操作是遗传算法的核心,通过父代个体的基因重组产生新的子代。
5.1 单点交叉
在染色体上随机选择一个交叉点,交换两个父代在该点后的基因片段。
父代1: [1, 0, 1 | 1, 0, 1]
父代2: [0, 1, 0 | 0, 1, 0]↓
子代1: [1, 0, 1 | 0, 1, 0]
子代2: [0, 1, 0 | 1, 0, 1]
5.2 双点交叉
选择两个交叉点,交换两点之间的基因片段。
5.3 均匀交叉
对每个基因位置,以一定概率决定是否交换两个父代的对应基因。
6. 变异操作
变异操作通过随机改变个体的某些基因,增加种群的多样性,防止算法陷入局部最优。
6.1 位翻转变异
对于二进制编码,随机选择某些位置进行0/1翻转。
6.2 高斯变异
对于实数编码,在原值基础上加上一个服从高斯分布的随机数。
7. Python实现示例
下面是一个简单的遗传算法Python实现,用于求解函数f(x) = x^2的最大值:
import numpy as np
import matplotlib.pyplot as plt# 参数设置
DNA_SIZE = 10 # DNA长度
POP_SIZE = 100 # 种群大小
CROSSOVER_RATE = 0.8 # 交叉概率
MUTATION_RATE = 0.003 # 变异概率
N_GENERATIONS = 200 # 迭代次数
X_BOUND = [0, 5] # x的取值范围# 适应度函数
def fitness(x):return x**2 # 求解x^2的最大值# 解码:将二进制DNA转换为十进制x
def decode_DNA(pop):x = pop.dot(2 ** np.arange(DNA_SIZE)[::-1]) / float(2**DNA_SIZE-1) * (X_BOUND[1] - X_BOUND[0]) + X_BOUND[0]return x# 自然选择
def select(pop, fitness_values):idx = np.random.choice(np.arange(POP_SIZE), size=POP_SIZE, replace=True, p=fitness_values/fitness_values.sum())return pop[idx]# 交叉操作
def crossover(parent, pop):if np.random.rand() < CROSSOVER_RATE:i_ = np.random.randint(0, POP_SIZE, size=1) # 随机选择另一个个体cross_points = np.random.randint(0, 2, size=DNA_SIZE).astype(np.bool_) # 随机的交叉点parent[cross_points] = pop[i_, cross_points] # 交叉return parent# 变异操作
def mutate(child):for point in range(DNA_SIZE):if np.random.rand() < MUTATION_RATE:child[point] = 1 if child[point] == 0 else 0return child# 初始化种群
pop = np.random.randint(2, size=(POP_SIZE, DNA_SIZE))# 进化过程
plt.ion() # 交互模式打开
x = np.linspace(*X_BOUND, 200)
plt.plot(x, fitness(x))for _ in range(N_GENERATIONS):# 将二进制转化为十进制x = decode_DNA(pop)# 计算适应度F = fitness(x)# 绘制当前种群if 'sca' in globals(): sca.remove()sca = plt.scatter(x, F, s=200, lw=0, c='red', alpha=0.5)plt.pause(0.05)# 选择pop = select(pop, F)# 产生下一代pop_copy = pop.copy()for parent in pop:child = crossover(parent, pop_copy)child = mutate(child)parent[:] = child # 子代取代父代plt.ioff()
plt.show()# 输出结果
best_idx = np.argmax(fitness(decode_DNA(pop)))
print("最优解: x =", decode_DNA(pop)[best_idx])
print("最优值: f(x) =", fitness(decode_DNA(pop)[best_idx]))
8. 遗传算法的优缺点
优点
- 全局搜索能力强,不易陷入局部最优
- 具有内在的并行性,可以同时评估多个解
- 只需要目标函数信息,不需要导数等梯度信息
- 适用范围广,可以处理各种类型的优化问题
缺点
- 参数设置较多,需要经验调整
- 收敛速度可能较慢
- 对于高维问题,计算复杂度高
- 理论基础相对薄弱,难以严格证明收敛性
9. 应用领域
遗传算法已被广泛应用于各个领域:
- 工程优化: 结构设计、参数优化
- 机器学习: 特征选择、神经网络权重优化
- 组合优化: 旅行商问题、背包问题
- 调度问题: 作业调度、资源分配
- 图像处理: 图像分割、特征提取
- 控制系统: PID控制器参数调整
- 金融领域: 投资组合优化
在数学建模问题中,存在一类NP难问题(NP-hard),已经被证明只能通过枚举所有策略来选择最佳策略(如旅行商问题、哈密顿回路问题等)。遗传算法可以将不同策略进行“遗传与进化”,从而尽可能接近最优解。
关于这方面内容的更多介绍,可以参考我的这篇文章:“【数学建模】(启发式算法)模拟退火算法:原理、实现与应用 ”当中的第4.1节:旅行商问题(TSP)的相关介绍。
10. 总结与展望
遗传算法作为一种启发式优化方法,通过模拟生物进化过程,为复杂优化问题提供了一种有效的解决思路。随着计算能力的提升和算法的不断改进,遗传算法与其他智能算法的结合(如遗传神经网络、遗传模糊系统等)将为人工智能领域带来更多可能性。
未来研究方向包括:提高算法效率、改进编码方式、设计更有效的遗传算子、与深度学习的结合等。随着这些技术的发展,遗传算法将在更广泛的领域发挥重要作用。
参考文献
- Holland J H. Adaptation in natural and artificial systems[M]. MIT press, 1992.
- Goldberg D E. Genetic algorithms in search, optimization, and machine learning[M]. Addison-Wesley, 1989.
- Mitchell M. An introduction to genetic algorithms[M]. MIT press, 1998.
希望这篇文章对您了解遗传算法有所帮助!如有任何问题,欢迎在评论区留言讨论。
相关文章:
【数学建模】(启发式算法)遗传算法:自然选择的计算模型
遗传算法:自然选择的计算模型 文章目录 遗传算法:自然选择的计算模型1. 引言2. 遗传算法的基本原理2.1 基本概念2.2 算法流程 3. 编码方式3.1 二进制编码3.2 实数编码3.3 排列编码 4. 选择操作4.1 轮盘赌选择4.2 锦标赛选择4.3 精英保留策略 5. 交叉操作…...
嵌入式八股,static在Linux驱动编写时的用处
1. 限制作用域 static关键字可以用来限制函数或变量的作用域,使其只能在当前文件内被访问。这有助于避免命名冲突,并提高代码的模块化和可维护性。 只能在当前文件里访问,或调用当前文件里有的函数。 // 文件 A.h static int globalVar 1…...
RCE——回调后门
目录 rce简述 rce漏洞 rce漏洞产生分类 rce漏洞级别 创造tips的秘籍——回调后门 call_user_func 解析 如何执行后门 call_user_func_array array_filter、array_map 解析 如何执行后门 php5.4.8中的assert——二参数的回调函数 uasort uksort array_reduce() …...
JavaScript 调试入门指南
JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...
字节真题,问a,b,c指的地址是否相同?
题目: class A{ int a, int d } class B { int b }class C: public A,public B { int b } C* c new C; A* a c; B* b c; 问a,b,c指的地址是否相同? 在 C 中,由于类的继承关系以及内存布局的规则,a、b 和 c 指针的地址可能不…...
2025年03月18日柯莱特(外包宁德)一面前端面试
目录 自我介绍你怎么从0到1搭建项目的webpack 的构建流程手写webpack插件你有什么想问我的吗 2. 你怎么从 0 到 1 搭建项目的 在面试中回答从 0 到 1 搭建前端项目,可按以下详细步骤阐述: 1. 项目前期准备 需求理解与分析 和产品经理、客户等相关人…...
OpenGL ES 2.0与OpenGL ES 3.1的区别
如果硬件支持且需要更高质量的图形效果,推荐3.1;如果兼容性和开发简便更重要,且效果需求不高,2.0更合适。不过现代车载系统可能越来越多支持3.x版本,所以可能倾向于使用3.1,但具体情况还需调查目标平台的硬…...
Unity Shader 学习17:合批渲染
一、基础概念 合批主要是针对这三个概念进行优化减少: ① SetPass Call:一次渲染状态切换,也就是每次切换 材质/Pass 时,就会触发一次SetPass Call ② Draw Call:cpu 调用一次 gpu 绘制函数 ③ Batch:表示…...
带你从入门到精通——自然语言处理(十. BERT)
建议先阅读我之前的博客,掌握一定的自然语言处理前置知识后再阅读本文,链接如下: 带你从入门到精通——自然语言处理(一. 文本的基本预处理方法和张量表示)-CSDN博客 带你从入门到精通——自然语言处理(二…...
vue3 数据监听(watch、watchEffect)
1、watch 1.1基本使用 作用:数据监听 语法: watch(监听的数据, (改变后的数据, 改变前的数据) > { console.log(newVal, oldVal); }) 注意点:watch写法上支持一个或者多个监听源,这些监听源必须只能是getter/effect函数…...
Vue 3中的Teleport:超越组件边界的渲染
Vue 3引入了许多新特性,其中之一便是Teleport。它为开发者提供了一种强有力的方式来控制组件的渲染位置,使得我们可以将组件的内容“传送”到DOM树的任何地方,而不仅仅局限于其父级组件的边界内。这在创建模态框、通知系统或任何需要脱离当前…...
【计算机网络】DHCP工作原理
DHCP(动态主机配置协议) Dynamic Host Configuration Protocol 基于UDP协议传输 DHCP分配IP地址的过程 (1)DHCP DISCOVER客户机请求 IP 地址: 当一个 DHCP 客户机启动时,客户机还没有 IP 地址,所以客户机要通过 DHC…...
Linux网站搭建(新手必看)
1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址:宝塔面板 - 简单好用的Linu…...
JVM - 年轻代和老年代
通过一些问题来讨论 JVM 中年轻代和老年代的内容 为什么要区分年轻代和老年代?哪些对像会进入老年代?什么时候会进行年轻代GC?什么时候会进行老年代GC? 1. 为什么要区分年轻代和老年代? 年轻代中的对象大部分都是短期…...
【C++初阶】---类和对象(上)
1.类的定义 1.1类的定义格式 • class为定义类的关键字,Data为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。 •…...
【数据库事务、消息队列事务、Redis 事务、Spring 事务 详细分析】
数据库事务、消息队列事务、Redis 事务、Spring 事务** 的详细分析 在分布式系统和应用开发中,事务管理是确保数据一致性和可靠性的关键机制。以下是针对 数据库事务、消息队列事务、Redis 事务、Spring 事务 的详细分析,包括原理、特点、适用场景和对比…...
2-1 基本放大电路
放大的概念 mV →V mA→A 特征:放大功率(电压与电流)。 本质:能量在控制下的转换。(外接供电电源) 必要条件:有源元件(能量控制原件) 前提:不失真 测试的…...
什么是矩阵账号
矩阵账号是指在同一平台或多个平台上,围绕同一品牌或个人,创建的多个相互关联、协同工作的账号组合。这些账号虽然独立,但在内容定位和运营策略上有所区分,同时又相互引流,共同形成一个网络结构,类似于矩阵…...
【Linux】Ubuntu 24.04 LTS 安装 OpenJDK 8
目录 通过 apt-get 直接安装 JDK 1. 更新 apt 软件源 2. 检查 JDK 是否已安装 3. 安装OpenJDK 4. 检查 JDK 是否成功安装 5. 设置 JAVA_HOME 环境变量 找到需要设置的 Java 路径 使用文本编辑器打开/etc/environment文件 添加 Java 安装路径 应用更改和验证配置 通过…...
xcode开发swiftui项目的时候,怎么调试ui占位和ui大小
有时候元素之间可能存在很大的空间间隔,但是又不知道怎么产生的,无奈我又看不懂xcode里面的Debug View Hierarchy功能,只能使用笨方法,就是给不同的块元素设置上不同的背景色,然后看一下间隙区域到底是哪个背景色填充的…...
测试用例的优先级划分规则
测试用例的优先级划分是根据 业务重要性、风险程度、测试资源 等因素,确定测试执行的顺序,以最大化测试效率和风险控制。以下是常见的优先级划分规则和操作方法: 一、优先级划分的核心原则 风险驱动 高风险功能(如核心支付流程&a…...
信息安全的数学本质与工程实践
信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...
第 6 章:优化动态分配内存的变量_《C++性能优化指南》_notes
优化动态分配内存的变量 第六章核心知识点详解总结第六章 动态内存优化 重点难点梳理 一、多选题(每题至少2个正确答案)二、设计题答案与详解多选题答案设计题答案示例 第六章核心知识点详解 动态内存分配的开销 知识点:动态内存分配需要调用…...
k8s kubernetes dashboard一直CarshLoopBackoff
使用 kubectl get pods -A -o wide 发现pod一直CarshLoopBackoff 通过 kubectl describe pod kubernetes-dashboard-7c4f8ff86d-7k7bd -n kubernetes-dashboard 获取详细信息 发现一直报错 Warning Unhealthy 10m (x31 over 34m) kubelet Liveness probe fail…...
[C++面试] 你了解视图吗?
一、入门 1、什么是 C 视图(View)?请简要说明其概念和用途 它提供了对序列(如数组、容器等)的非拥有性、只读或可写的访问。(就像是个透明的放大镜,它能让你去看一组数据,但它自己…...
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…...
ollama迁移已下载的单个模型到服务器
ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的…...
Photoshop 2025安装教程包含下载安装包,2025最新版图文安装教程
文章目录 前言一、Photoshop 2025下载二、Photoshop 2025安装教程1. 安装包解压2. 找到安装程序3. 以管理员身份运行4. 安装选项设置5. 选择安装路径6. 开始安装7. 安装完成8. 启动软件9. 软件主界面 前言 无论你是专业设计师,还是刚接触图像处理的新手,…...
【Python · PyTorch】时域卷积网络 TCN
1. 概念 1.1 定义 TCN 是时域卷积网络(Temporal Convolutional Network)的简称。TCN是于2018年 Shaojie Bai 等人提出的一个处理时序数据的卷积模型。 TCN结合了CNN卷积并行性计算和RNN长期依赖的优势,CNN可在多个通道同时处理卷积核运算&…...
Mysql update更新数据执行流程
update 的执行流程是以select查询为基础执行的!!你不明白select执行流程?没关系,这篇博客照样让你明白,update执行流程! 存储引擎是什么? 如果把数据库比作一个大仓库,那么存储引擎…...
