遗传算法(GA)
基本原理
算法介绍
遗传算法(Genetic Algorithm,简称GA)是一种基于自然选择和遗传学原理的搜索和优化技术。它模拟了生物进化过程,通过选择、交叉(重组)和变异等操作,逐步优化问题的解。
遗传算法可以类比为选择性的枚举——更科学的说,遗传算法是一种启发式的仿生算法,其中,仿生指的是模仿自然规律或生物行为;启发式指的是基于一定经验和规则的算法,在遗传算法当中,就应用了“物竞天择”这一法则。
基因编码
在GA当中,所有的解都要理解为基因编码,因此,基因编码的方式尤为重要,常见的编码方式有:二进制编码,实数编码(用于解决连续优化问题)列编码(用于解决排序问题)
基本步骤
1.初始化
种群初始化:随机生成一组初始解,称为种群(Population)。每个解称为个体(Individual),通常用二进制编码或其他合适的编码方式表示。
适应度评估:计算每个个体的适应度(Fitness),适应度函数根据问题的目标来评估个体的优劣。适应度高的个体更有可能被选中进入下一代。
2.选择
选择操作是指选择合适的种群进入下一代,常见的选择方法如下:
轮盘赌选择(Roulette Wheel Selection)
根据个体适应度占总适应度的比例来选择个体。适应度高的个体被选中的概率更大
锦标赛选择(Tournament Selection)
随机选择若干个个体,比较它们的适应度,选择适应度最高的个体进入下一代。
排名选择(Rank Selection)
根据个体的适应度排名来选择个体,排名高的个体被选中的概率更大。
3.交叉
交叉是指将两个父代个体的部分基因片段进行交换来产生新的子代个体。
常见的交换算法如下:
单点交叉(Single-point Crossover):
随机选择一个交叉点,将两个父代个体在该点处的基因片段进行交换。
多点交叉(Multi-point Crossover):
选择多个交叉点,将基因片段进行交换。
均匀交叉(Uniform Crossover):
每个基因位都有一定的概率从另一个父代个体中继承。
4.变异
变异操作是对个体的基因进行随机改变,以一定的概率改变个体的某些基因。变异操作虽然概率较低,但能够防止算法陷入局部最优解,增加种群的多样性。常见的变异方法包括:
位变异(Bit-flip Mutation)
对于二进制编码的个体,随机选择一个或多个基因位,将其值取反。
均匀变异(Uniform Mutation)
随机选择一个基因位,将其值替换为随机生成的新值。
5.适应度评估与替换
1.适应度评估
对新生成的子代个体进行适应度评估。
2.替换
根据一定的策略用子代个体替换种群中的一些个体,形成新一代种群。
常见的替换策略如下:
完全替换:用所有子代个体替换种群中的所有个体。
部分替换:用部分子代个体替换种群中适应度较低的个体。
精英保留:保留种群中适应度最高的若干个个体,直接进入下一代,以防止最优解丢失。
6.迭代
重复上述选择、交叉、变异和适应度评估的过程,直到满足终止条件(终止条件可以是达到一定的适应度,迭代次数,或者物种多样性降低到一定程度等等)。
应用
假设我们要用遗传算法解决一个简单的优化问题:最大化函数 f(x) = x^2,其中 x \in [0, 31]。
(1)初始化种群大小:10编码方式:二进制编码,5位二进制数可以表示0到31的整数。初始种群:随机生成10个5位二进制数,如 [01010, 11001, 00110, 10101, 11110, 01101, 10010, 00011, 11010, 01111] 。
# 1. 初始化种群
def initialize_population(pop_size, chrom_length):population = []for _ in range(pop_size):individual = ''.join(random.choice('01') for _ in range(chrom_length))population.append(individual)return population
(2)适应度评估计算每个个体的适应度,即 f(x) = x^2。例如,个体 01010 表示十进制的10,其适应度为 10^2 = 100。
# 2. 适应度评估
def evaluate_fitness(population):fitness = []for individual in population:x = int(individual, 2)fitness.append(x ** 2)return fitness
(3)选择使用轮盘赌选择法,根据适应度比例选择个体进入下一代。
# 3. 轮盘赌选择
def roulette_wheel_selection(population, fitnesses):total_fitness = sum(fitnesses)pick = random.uniform(0, total_fitness)current = 0for i in range(len(population)):current += fitnesses[i]if current > pick:return population[i]return population[-1] # 防止浮点误差
(4)交叉随机选择两个父代个体进行单点交叉。例如,选择 01010 和 11001 ,交叉点为第3位,交叉后生成子代 01001 和 11010 。
# 4. 交叉操作
def crossover(parent1, parent2, crossover_rate):if random.random() < crossover_rate:crossover_point = random.randint(1, len(parent1) - 1)child1 = parent1[:crossover_point] + parent2[crossover_point:]child2 = parent2[:crossover_point] + parent1[crossover_point:]else:child1, child2 = parent1, parent2return child1, child2
(5)变异对子代个体进行变异操作。例如,选择 01001 ,随机变异第2位,变为 00001 。
# 5. 变异操作
def mutate(child, mutation_rate):mutated = list(child)for i in range(len(mutated)):if random.random() < mutation_rate:mutated[i] = '1' if mutated[i] == '0' else '0'return ''.join(mutated)
(6)替换用新生成的子代个体替换种群中的一些个体,形成新一代种群。
(7)迭代重复上述过程,直到满足终止条件(如达到最大迭代次数100)。通过上述步骤,遗传算法能够逐步优化解,最终找到接近最优解的个体。
# 主函数流程
def genetic_algorithm():pop_size = 10 #种群规模chrom_length = 5 #染色体长度max_generations = 100 #迭代次数crossover_rate = 0.8 # 交叉概率mutation_rate = 0.1 # 变异概率# 初始化种群population = initialize_population(pop_size, chrom_length)print("初始种群:", population)for gen in range(max_generations):# 计算适应度fitnesses = evaluate_fitness(population)# 生成新一代new_population = []while len(new_population) < pop_size:# 选择父代parent1 = roulette_wheel_selection(population, fitnesses)parent2 = roulette_wheel_selection(population, fitnesses)# 交叉生成子代child1, child2 = crossover(parent1, parent2, crossover_rate)# 变异操作child1 = mutate(child1, mutation_rate)child2 = mutate(child2, mutation_rate)new_population.extend([child1, child2])# 确保种群大小不变(截断多余个体)population = new_population[:pop_size]# 打印当前最优解current_fitness = evaluate_fitness(population)best_fitness = max(current_fitness)best_index = current_fitness.index(best_fitness)print(f"Generation {gen+1}: Best = {population[best_index]} (x={int(population[best_index], 2)}, f(x)={best_fitness})")# 最终结果final_fitness = evaluate_fitness(population)best_idx = final_fitness.index(max(final_fitness))best_individual = population[best_idx]print("\n最优解:")print(f"个体: {best_individual}, x = {int(best_individual, 2)}, f(x) = {int(best_individual, 2)**2}")# 运行算法
genetic_algorithm()
评价
GA算法有较强的全局搜索能力和并行能力,能较好的找到优秀解,但也存在着局部最优解,参数选择困难,计算量大等问题
例如在上例中,我们将种群数量设置为10,而得出的结果有很大的可能性是30,因为30和31的适应度相差不多,因此在发生配对时,末尾的1很有可能因为局部最优解的问题而被0取代
假如我们把种群规模更改为100的确很好的扩充的基因库,也让我们的结果更加准确了,但毫无疑问,在复杂的现实应用当中,这对于算力是一个极大的挑战,有时候,尽可能优秀的结果会比完美的结果更加适用
相关文章:
遗传算法(GA)
基本原理 算法介绍 遗传算法(Genetic Algorithm,简称GA)是一种基于自然选择和遗传学原理的搜索和优化技术。它模拟了生物进化过程,通过选择、交叉(重组)和变异等操作,逐步优化问题的解。 遗传…...
EPS三维测图软件
EPS三维测图软件EPS2016...
设计模式-命令模式
写在前面 Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正! 一、什么是命令模式? 命令模式是行为模式中的一种,通过将请求封装成对象,使开发者可…...
深入理解主从数据库架构与主从复制
目录 前言1. 主从数据库概述1.1 什么是主从数据库?1.2 主从数据库的应用场景 2. 主从数据库的工作原理2.1 主从数据库的读写分离2.2 数据同步机制2.3 异步与同步复制模式 3. 主从复制的实现步骤3.1 配置主库3.2 配置从库 4. 主从数据库架构的优缺点4.1 优点4.2 缺点…...
【C】初阶数据结构15 -- 计数排序与稳定性分析
本文主要讲解七大排序算法之外的另一种排序算法 -- 计数排序 目录 1 计数排序 1) 算法思想 2) 代码 3) 时间复杂度与空间复杂度分析 (1) 时间复杂度 (2) 空间复杂度 4) 计…...
@PostConstruct @PreDestroy
PostConstruct 是 Java EE(现 Jakarta EE)中的一个注解,用于标记一个方法在对象初始化完成后立即执行。它在 Spring 框架、Java Web 应用等场景中广泛使用,主要用于资源初始化、依赖注入完成后的配置等操作。 1. 基本作用 执行时…...
2025数维杯数学建模A题完整限量论文:空中芭蕾——蹦床运动的力学行为分析
2025数维杯数学建模A题完整限量论文:空中芭蕾——蹦床运动的力学行为分析 ,先到先得 A题完整论文https://www.jdmm.cc/file/2712067/ 蹦床( Trampoline )是一项运动员利用蹦床的反弹,在空中展示技能 技巧的竞技运动&…...
Kubernetes Gateway API 部署详解:从入门到实战
引言 在 Kubernetes 中管理网络流量一直是一个复杂而关键的任务。传统的 Ingress API 虽然广泛使用,但其功能有限且扩展性不足。Kubernetes Gateway API 作为新一代标准,提供了更强大的路由控制能力,支持多协议、跨命名空间路由和细粒度的流量管理。本文将带你从零开始部署…...
移动设备常用电子屏幕类型对比
概述 LCD 家族 (TN、STN、TFT、IPS、VA)依赖背光,性能差异主要来自液晶排列和驱动方式。OLED 以自发光为核心优势,但成本与寿命限制其普及。E-Paper 专为低功耗静态显示设计,与传统屏幕技术差异显著。 参数LCD&#…...
HarmonyOS开发-组件市场
1. HarmonyOS开发-组件市场 HarmonyOS NEXT开源组件市场是一个独立的插件,需通过DevEco Studio进行安装,可以点击下载,无需解压,直接通过zip进行安装,具体安装和使用方法可参考HarmonyOsNEXT组件市场使用说明。Harmony…...
效果图云渲染:价格、优势与使用技巧
对于做3D设计来说,渲染效果图会占用设计电脑的资源,如果能免去这个环节就好了。用设计电脑渲不仅拖慢电脑速度,遇到紧急情况无法快速渲染出来还可能耽误进度。而云渲染的出现,正是针对这个点——渲的快,价格便宜&#…...
OptiStruct实例:声振耦合超单元应用
如图10-11所示,本例采用一个简化的整车模型,模型分为车身(含声腔)与底盘两部分。首先分别运用CMS与CDS方法对车身(含声腔)模型进行缩聚,生成.h3d格式的CMS超单元和cps超单元,然后进行…...
排序算法-插入排序
插入排序是一种简单直观的排序算法,其核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置,类似于整理扑克牌。 插入排序步骤 初始化:将序列的第一个元素视为已排序部分,其余为未排序部分。 选择元素:从未排…...
Uniapp Android/IOS 获取手机通讯录
介绍 最近忙着开发支付宝小程序和app,下面给大家介绍一下 app 获取通讯录的全部过程吧,也是这也是我app开发中的一项需求吧。 效果图如下 勾选配置文件 使用uniapp开发的童鞋都知道有一个配置文件 manifest.json 简单的说一下,就是安卓/ios/…...
【RAG】index环节中 关于嵌入模型和 ColBERT
1. 什么是嵌入模型?是不是把数据源转换为向量表示的模型? 是的,嵌入模型(Embedding Model)的核心功能就是将各种类型的数据(例如,文本、图像、音频等)转换成低维、稠密的向量表示。…...
一文掌握 LVGL 9 的源码目录结构
文章目录 📂 一文掌握 LVGL 9 的源码目录结构🧭 顶层目录概览📁 1. src/ — LVGL 的核心源码(🔥重点)📁 2. examples/ — API 示例📁 3. demos/ — 综合演示项目📁 4. do…...
ROS1 和 ROS2 在同一个系统中使用
一、环境变量设置 echo "ros noetic(1) or ros2 foxy(2)?" read edition if [ "$edition" -eq "1" ]; thensource /opt/ros/noetic/setup.bash elsesource /opt/ros/foxy/setup.bash fi 二、针对不同的ROS版本创建不同的工作空间work space...
Redis 8.0携新功能,重新开源
01 引言 Redis从7.4版本起,将开源许可证改成 RSALv2(Redis 源代码可用许可证)与 SSPLv1(服务器端公共许可证)的双重授权策略。简单来说,就是不能随意商用。为了抵制Redis,Redis的替代品Valkey、…...
AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”
一、问题描述 AD原理图复制较多元器件时报错:AD原理图复制较多元器件时报错:“InvalidParameter Exception Occurred In Copy”。如下图 二、问题分析 破解BUG。 三、解决方案 1、打开参数配置 2、打开原理图优先项中的通用配置,取消勾选G…...
【wpf】12 在WPF中实现HTTP通信:封装HttpClient的最佳实践
一、背景介绍 在现代桌面应用开发中,网络通信是不可或缺的能力。WPF作为.NET平台下的桌面开发框架,可通过HttpClient轻松实现与后端API的交互。本文将以一个实际的HttpsMessages工具类为例,讲解如何在WPF中安全高效地封装HTTP通信模块。 二、…...
从概念表达到安全验证:智能驾驶功能迎来系统性规范
随着辅助驾驶事故频发,监管机制正在迅速补位。面对能力表达、使用责任、功能部署等方面的新要求,行业开始重估技术边界与验证能力,数字样机正成为企业合规落地的重要抓手。 2025年以来,围绕智能驾驶功能的争议不断升级。多起因辅…...
金贝灯光儿童摄影3大布光方案,解锁专业级童趣写真
随着亲子消费的持续升温,儿童摄影行业对高效、专业、灵活的专业灯光需求日益迫切。为精准解决儿童拍摄中孩子好动难配合、氛围单调、出片效率低下等痛点,深耕影像光源行业三十年,拥有丰富的商业人像摄影灯光解决方案的金贝品牌,近…...
双端口ram与真双端口ram的区别
端口独立性 真双端口RAM:拥有两个完全独立的读写端口(Port A和Port B),每个端口都有自己的地址总线、数据总线、时钟、使能信号和写使能信号。这意味着两个端口可以同时进行读写操作,且互不干扰。 伪双端口RAM&…...
Java设计模式之单例模式:从入门到精通
一、单例模式概述 1.1 什么是单例模式 定义:单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。 专业解释:单例模式通过限制类的实例化过程,保证在整个应用程序生命周期中,某个类最多只有一个实例存在,…...
sqli-labs靶场18-22关(http头)
目录 less18(user-agent) less19(referer) less20(cookie) less21(cookie) less22(cookie) less18(user-agent) 这里尝试了多次…...
【图像大模型】Stable Diffusion Web UI:深度解析与实战指南
Stable Diffusion Web UI:深度解析与实战指南 一、项目概述核心功能 二、项目运行方式与执行步骤1. 环境准备2. 安装步骤在Windows上安装在Linux上安装 3. 使用Web UI 三、执行报错及问题解决方法1. Python版本不兼容2. CUDA未正确安装3. 依赖库安装失败4. 内存不足…...
Linux 学习笔记1
Linux 学习笔记1 一、用户和用户组管理用户组操作用户操作 二、文件权限管理权限查看权限修改归属权修改 三、系统快捷操作四、软件管理包管理工具服务管理 五、文件系统操作软链接 六、时间管理七、网络管理基础命令端口与进程进程管理 八、环境变量基础操作 九、其他重要概念…...
单例模式的两种设计
单例模式确保一个类只有一个实例,并提供一个全局访问点。 1. 饿汉模式 (Eager Initialization) 饿汉模式在程序启动时就创建实例,线程安全。 cpp class EagerSingleton { public:// 删除拷贝构造函数和赋值运算符EagerSingleton(const EagerSingleton…...
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
在“HarmonyOS NEXTAI大模型打造智能助手APP(仓颉版)”课程里面,有学员提到了这样一个问题: 鸿蒙的主推开发语言不是ArkTS吗,本课程为什么使用的是仓颉编程语言? 这里就这位同学的问题,统一做下回复,以方便…...
20250509 相对论中的\*\*“无空间”并非真实意义上的虚无,而是时空结构尚未形成\*\*的状态。 仔细解释下这个
相对论中的**“无空间”并非真实意义上的虚无,而是时空结构尚未形成**的状态。 仔细解释下这个 相对论中的“无空间”这一概念,严格来说并非绝对的虚无,而是指在物理学上时空结构尚未形成或无法定义的状态。这种状态通常出现在宇宙起源和黑洞…...
T-SQL在SQL Server中判断表、字段、索引、视图、触发器、Synonym等是否存在
SQL Server创建或者删除表、字段、索引、视图、触发器前判断是否存在。 目录 1. SQL Server创建表之前判断表是否存在 2. SQL Server新增字段之前判断是否存在 3. SQL Server删除字段之前判断是否存在 4. SQL Server新增索引之前判断是否存在 5. SQL Server判断视图是否存…...
C——数组和函数实践:扫雷
此篇博客介绍用C语言写一个扫雷小游戏,所需要用到的知识有:函数、数组、选择结构、循环结构语句等。 所使用的编译器为:VS2022。 一、扫雷游戏是什么样的,如何玩扫雷游戏? 如图,是一个标准的扫雷游戏初始阶段。由此…...
Java中的分布式缓存与Memcached集成实战
一、概述 分布式缓存是提升系统性能和扩展性的关键技术之一。Memcached作为一种高性能的分布式内存对象缓存系统,在许多场景下被广泛使用。本文将深入探讨如何在Java项目中集成Memcached,实现高效的分布式缓存。 二、Memcached简介 Memcached是一种高…...
OpenCV播放摄像头视频
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 播放摄像头视频和播放视频文件类似,也是通过类VideoCapture来实现,只不过调用open的时候传入的是摄像头的索引号。如果计算机安装了一个摄像头,则open的第一个参数通常是0&…...
[计算机科学#13]:算法
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 算法是解决问题的系统化步骤,不同的问题…...
git相关
1.将 dev 变基到 origin/master git rebase 是一个本地操作,它只会修改你当前所在分支的提交历史,而不会直接影响远程仓库或任何其他分支。 保持提交历史的线性和整洁: 这是 git rebase 最主要的目的。 想象一下 dev 分支是从 master 分支分…...
Web端项目系统访问页面很慢,后台数据返回很快,网络也没问题,是什么导致的呢?
Web端访问缓慢问题诊断指南(测试工程师专项版) ——从浏览器渲染到网络层的全链路排查方案 一、问题定位黄金法则(前端性能四象限) 1. [网络层] 数据返回快 ≠ 资源加载快(检查Content Download时间) 2. [渲染层] DOM复杂度与浏览器重绘(查看FPS指标) 3. [执行层…...
计算机系统结构-第九章-互联网络 第十章
目录 恒等函数:I(没变) 交换函数:某一位取反 如下 角标为0,第0位取反 均匀洗牌函数、混洗函数Shuffle :σ 左移一位 (左移右边补0,右移左边补0) 蝶式互连函数but…...
H5 移动端适配最佳实践落地指南。
文章目录 前言一、为什么需要移动端适配?二、核心适配方案1. 视口(Viewport)设置2. 三种适配方案 (仅供参考)(1)rem 适配方案(2)vw/vh 适配方案(3)…...
从电动化到智能化,法雷奥“猛攻”中国汽车市场
当前,全球汽车产业正在经历前所未有的变革,外资Tier1巨头开始向中国智能电动汽车市场发起新一轮“猛攻”。 在4月23日-5月2日上海国际车展期间,博世、采埃孚、大陆集团、法雷奥等全球百强零部件厂商纷纷发布战略新品与转型计划。在这其中&am…...
智能网联汽车 “中央计算” 博弈:RTOS 与跨域融合的算力分配挑战
一、引言 随着智能驾驶技术的飞速发展,汽车逐渐从传统的交通工具演变为移动的智能终端。智能网联汽车的核心竞争力日益体现在其强大的计算能力和高效的算力管理上。汽车电子电气架构(EEA)正经历从分布式架构向 “中央计算 区域控制” 架构的…...
springboot 加载 tomcat 源码追踪
加载 TomcatServletWebServerFactory 从 SpringApplication.run()方法进入 进入到 refresh () 方法 选择实现类 ServletWebServerApplicationContext 进入到 AbstractApplicationContext onRefresh() 方法创建容器 找到加载bean 得到 webServer 实例 点击 get…...
AI预测3D新模型百十个定位预测+胆码预测+去和尾2025年5月9日第72弹
从今天开始,咱们还是暂时基于旧的模型进行预测,好了,废话不多说,按照老办法,重点8-9码定位,配合三胆下1或下2,杀1-2个和尾,再杀6-8个和值,可以做到100-300注左右。 (1)定…...
企业高性能WEB服务器—Nginx
Nginx介绍 Nginx是一款轻量级的网页服务器、反向代理服务器以及电子邮件代理服务器。 具有高并发(特别是静态资源)、占用系统资源少的特性。它不仅是Web服务软件,还具有反向代理负载均衡功能和缓存服务功能 具备如下基本特性 可针对静态资…...
neo4j图数据库基本概念和向量使用
一.节点 1.新建节点 create (n:GroupProduct {name:都邦高保额团意险,description: "保险产品名称"} ) return n CREATE:Neo4j 的关键字,用于创建新节点或关系。 (n:GroupProduct): n 是节点的临时别名(变量名&#…...
安全核查基线-3.用户umask设置策略
在Linux中,umask(用户文件创建掩码)是一个重要的权限管理机制,用于控制新创建的文件和目录的默认权限。umask的值决定了文件或目录的初始权限中哪些权限位会被屏蔽(即不可用)。 1. umask 的作用 文件默认权…...
UE像素流是什么
UE像素流是什么 UE像素流送是一种云渲染技术,由虚幻引擎(UE)提出,用于在浏览器中运行高画质3D应用或游戏。其原理是在远程计算机(可以是云端服务器或本地高性能服务器)上运行UE开发的应用程序,…...
【C】初阶数据结构14 -- 归并排序
本篇文章主要是讲解经典的排序算法 -- 归并排序 目录 1 递归版本的归并排序 1) 算法思想 2) 代码 3) 时间复杂度与空间复杂度分析 (1) 时间复杂度 (2) 空间复杂度 2 迭代版本的归并…...
02_线性模型(回归线性模型)
描述 线性模型是在实践中广泛使用的一类模型,线性模型利用输入特征的线性函数(linear function)进行预测。 用于回归的线性模型 对于回归问题,线性模型预测的一般公式如下: $ \widehat y w[0]*x[0]w[1]*x[1]…w[p…...
当当网Top500书籍信息爬取与分析
爬取当当网的Top500书籍信息,并对书籍的评价数量进行排序,然后绘制前十名的条形图,然后对各个出版社出版的书籍数量进行排序,绘制百分比的饼图 # 导入所需的模块 import re # 正则表达式模块,用于提取文本中的特定模…...