优化算法:1.遗传算法(GA)及Python实现
一、定义
遗传算法就像是在模拟“优胜劣汰”的进化过程,通过选择最优秀的个体,交配产生下一代,并引入一定的变异,逐步优化解决问题。
二、具体步骤
-
初始化种群(Initialization):
假设你要找到一个迷宫的最佳出口路径。首先,你随机生成一群“路径”作为初始种群(就像是一群随机的迷宫探险者)。生成初始种群 P(0),其中 P(0)={x1,x2,…,xN}。每个个体
是一个解的候选向量,随机生成。
-
计算适应度(Fitness Calculation):
每条路径都有一个“适应度”,代表了它的好坏。比如,走的距离短、碰到的墙少的路径适应度更高。对种群中的每个个体,计算其适应度值
,适应度函数 f 用于评估个体的优劣。
-
选择 (Selection):
根据适应度选择一些表现最好的路径。适应度高的路径被选中的概率更大(就像在自然界中适应环境的生物更容易生存)。根据适应度值选择个体,以组建下一代。常用的方法包括轮盘赌选择、排序选择等。假设用轮盘赌选择,每个个体被选择的概率为:
-
交叉(交配)(Crossover):
选择出来的好路径进行“交配”,生成新的路径(下一代)。交配的过程类似于把两条路径的不同部分组合在一起,形成新的路径。从选出的个体中随机配对进行交叉,生成新的子代。假设单点交叉,两个个体 x1 和 x2 在位置 k 进行交叉生成新个体:
-
变异 (Mutation):
在新生成的路径中,随机改变一些部分(变异)。比如,某条路径的某一步骤突然改变方向。这就像是自然界中的基因突变。对新个体进行变异操作,即随机改变个体的某些基因。假设变异在第 j 个位置,对 xi 变异后得到 xi′:
其中
是变异后的值。
-
重复(Iteration):
重复上述过程多次,每次都选择最好的路径进行交配和变异。经过若干代的进化,路径会越来越接近理想的解决方案。重复步骤2到5,直到满足终止条件(如达到最大迭代次数或适应度满足某个阈值)。
三、例子
想象你在一个迷宫里找出口,你和一群朋友决定用遗传算法来找最快的路。
- 第一步:每个人随便走一条路,大家都出发了。
- 第二步:回来后,大家比较谁走的路最短,谁碰到的障碍最少。
- 第三步:选出几个走得最好的朋友,让他们把自己的路线告诉大家。
- 第四步:大家根据好朋友的路线,进行一些组合和调整,再次出发。
- 第五步:有时候,你们会决定“赌一把”,随便改变下路线中的某个部分,希望能找到更好的路。
- 第六步:重复这个过程,经过多次尝试,你们最终找到了迷宫的最佳出口路径。

四、Python示例
举一个简单的例子,我们不妨用遗传算法优化一个一维二次函数 。这个函数在数学上是一个凸函数,其最小值为
0,出现在 x=0 处。尽管简单,但它展示了遗传算法的基本原理和步骤,包括种群初始化、适应度评估、选择、交叉和变异等。可以直观地理解遗传算法是如何通过迭代逐步逼近最优解的。我已将详细的注释写在了代码中。
import numpy as np
import matplotlib.pyplot as plt# 定义目标函数
# 最小化的函数是 x^2
def fitness(x):return x ** 2# 初始化种群
# 生成一个大小为 size 的种群,每个个体的值在 bounds 范围内。生成的是一个二维数组,每个个体是一个一维数组
def initialize_population(size, bounds):return np.random.uniform(bounds[0], bounds[1], (size, 1))# 选择个体(轮盘赌选择)
# 基于个体的适应度值进行选择。适应度值越低的个体被选择的概率越高(因为我们在最小化函数)
def selection(pop, fitness_values):total_fitness = np.sum(fitness_values) # 所有个体的总适应度值probabilities = fitness_values / total_fitness # 每个个体被选择的概率indices = np.random.choice(len(pop), size=len(pop), p=probabilities.flatten()) # 根据这些概率随机选择个体,生成新的种群return pop[indices]# 交叉操作(单点交叉)
def crossover(pop, crossover_rate=0.7):offspring = []for i in range(0, len(pop), 2): # 以步长为2遍历种群parent1, parent2 = pop[i], pop[i + 1] # 随机选择两个父代if np.random.rand() < crossover_rate and parent1.size > 1: # 如果随机数小于交叉概率且父代长度大于1cross_point = np.random.randint(1, parent1.size) # 选择一个交叉点child1 = np.concatenate([parent1[:cross_point], parent2[cross_point:]]) # 在该点进行单点交叉生成两个子代child2 = np.concatenate([parent2[:cross_point], parent1[cross_point:]])else: # 如果不满足交叉条件,直接复制父代作为子代。child1, child2 = parent1, parent2offspring.append(child1)offspring.append(child2)return np.array(offspring)# 变异操作(简单变异)
def mutation(pop, mutation_rate=0.01, bounds=(-10, 10)):for i in range(len(pop)):if np.random.rand() < mutation_rate: # 如果随机数小于变异概率mut_point = np.random.randint(0, pop[i].size) # 随机选择该个体中的一个基因位置pop[i][mut_point] = np.random.uniform(bounds[0], bounds[1])return pop# 主遗传算法流程
def genetic_algorithm(pop_size, bounds, num_generations, crossover_rate, mutation_rate):# 初始化种群pop = initialize_population(pop_size, bounds)best_solutions = []for gen in range(num_generations):# 计算适应度fitness_values = fitness(pop)# 选择selected_pop = selection(pop, fitness_values)# 交叉offspring = crossover(selected_pop, crossover_rate)# 变异pop = mutation(offspring, mutation_rate, bounds)# 保存当前代的最佳个体best_solutions.append(np.min(fitness_values))return pop, best_solutions# 参数设置
pop_size = 5000 # 种群大小 增大种群规模: 5000->100000
bounds = (-10, 10) # 每个个体的取值范围
num_generations = 200 # 遗传算法运行的代数 增加迭代次数: 100->200
crossover_rate = 0.7 # 交叉概率
mutation_rate = 0.01 # 变异概率 增加变异率以增加多样性: 0.01->0.05# 运行遗传算法
final_pop, best_solutions = genetic_algorithm(pop_size, bounds, num_generations, crossover_rate, mutation_rate)# 绘制结果
plt.plot(best_solutions)
plt.xlabel('Generation')
plt.ylabel('Fitness (Minimized Value of x^2)')
plt.title('Genetic Algorithm Optimization')
plt.show()# 输出最终的最佳解
best_individual = final_pop[np.argmin(fitness(final_pop))]
print("Best solution found:", best_individual)
print("Fitness of the best solution:", fitness(best_individual))
结果如下:

Best solution found: [0.09278514]
Fitness of the best solution: [0.00860908]
该结果已经找到了一个较精确的解,接近全局最优解(即 x=0)。我们不妨将 pop_size 增大到 10000,以覆盖更大的搜索空间;将 num_generations 增加到 400,让算法有更多时间收敛;将 mutation_rate 增加到 0.05,以增加种群的多样性,经过漫长的等待,会得到一个更加精确的结果。
Best solution found: [-0.01888039]
Fitness of the best solution: [0.00035647]
若要进一步提高算法的表现,我们还可以尝试以下几种改进方法:
- 调整选择策略:使用锦标赛选择等替代选择策略。
- 增加种群多样性:引入精英保留策略,将最优个体直接保留到下一代。
- 检查适应度函数:确保适应度函数正确计算。
- 调整初始化种群范围:可能初始化范围太大导致搜索空间过于分散。
相关文章:
优化算法:1.遗传算法(GA)及Python实现
一、定义 遗传算法就像是在模拟“优胜劣汰”的进化过程,通过选择最优秀的个体,交配产生下一代,并引入一定的变异,逐步优化解决问题。 二、具体步骤 初始化种群(Initialization): 假设你要找到一个迷宫的最佳出口路径。…...
企业化运维(8)Docker容器技术
###1.Docker介绍### 什么是Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间…...
Unity C#底层原理(二)
委托 方法的容器:委托可以存储一个或多个方法的引用。可以使用委托对象来调用这些方法。函数/方法的变量类型:委托类型可以像变量一样声明和使用,存储方法的引用。存储、传递方法:委托可以作为参数传递给方法,也可以作…...
计算机网络-配置路由器ACL(访问控制列表)
配置访问控制列表ACL 拓扑结构 拓扑结构如下: 要配置一个ACL,禁止PC0访问PC3,禁止PC4访问PC0,其它正常。 配置Router0 配置接口IP地址: interface fastethernet 0/0 ip address 192.168.1.1 255.255.255.0 no shu…...
51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理:2.3 使用方法: 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…...
VLC输出NDI媒体流
目录 1. 下载安装VLC Play 2. 首先在电脑上安装NDI Tools 3. 运行VLC进行输出配置 4. 播放视频 5. 验证 (1)用Studio Monitor验证 (2)用OBS验证 NDI(Network Device Interface)即网络设备接口,是由美国 NewTek 公司开发的免费标准,它可使兼容的视频产品以高质量…...
WiFi 局域网通信 - 发现服务和解析
1. nsdManager nsdManager requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager2. NsdManager.DiscoveryListener 注意:在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法࿰…...
ChatGPT建议前端学习计划
HTML&CSS基础 - 学习HTML标签、CSS属性、页面布局等基础知识 JavaScript基础 - 学习变量、数据类型、控制流、函数等基础知识 jQuery - 学习如何使用jQuery处理文档对象模型(DOM)、事件、动画等 Ajax - 全称为 Asynchronous JavaScript and XML&…...
YOLO5项目目录最强解析
YOLO5项目目录解析 YOLOv5 项目目录下的文件和目录的结构,以下是对每个目录和文件的解释: 目录 📁 .github: 存放 GitHub 相关配置和文件,如 GitHub Actions 工作流文件、Issue 模板等,用于自动化构建和持续集成等功…...
【python】sklearn基础教程及示例
【python】sklearn基础教程及示例 Scikit-learn(简称sklearn)是一个非常流行的Python机器学习库,提供了许多常用的机器学习算法和工具。以下是一个基础教程的概述: 1. 安装scikit-learn 首先,确保你已经安装了Python和…...
Linux:传输层(2) -- TCP协议(2)
目录 1. 流量控制 2. 滑动窗口 3. 拥塞控制 4. 延迟应答 5. 捎带应答 6. 面向字节流 7. 粘包问题 8. TCP异常情况 1. 流量控制 接收端处理数据的速度是有限的. 如果发送端发的太快 , 导致接收端的缓冲区被打满 , 这个时候如果发送端继续发送 , 就会造成丢包, 继而引…...
AcWing 802. 区间和
var说明add存储了插入操作,在指定 x x x下标所在位置 a [ x ] c a[x]c a[x]cquery是求 [ L , R ] [L,R] [L,R]区间和用到的数组,最后才用到alls 是存储离散化之后的值 , 对于会访问到的每个下标,统统丢到 a l l s 里面 ,会把 x 和 [ L , R …...
实验2-2-1 温度转换
#include<stdio.h> #include <math.h> int main(){int c,f150;c5*(f-32)/9;printf("fahr 150, celsius %d",c); }...
Spark实时(六):Output Sinks案例演示
文章目录 Output Sinks案例演示 一、File sink 二、Memory Sink 三、Foreach Sink 1、foreachBatch 2、foreach Output Sinks案例演示 当我们对流式…...
在SQL编程中DROP、DELETE和TRUNCATE的区别
在SQL编程中,DROP、DELETE和TRUNCATE都是用于删除数据的命令,但它们之间有着显著的区别,主要体现在它们删除数据的范围、操作的不可逆性、对表结构的影响、性能以及事务日志的影响上。 DROP: 作用:DROP命令用于删除整个表及其所有…...
【AI大模型】Prompt 提示词工程使用详解
目录 一、前言 二、Prompt 提示词工程介绍 2.1 Prompt提示词工程是什么 2.1.1 Prompt 构成要素 2.2 Prompt 提示词工程有什么作用 2.2.1 Prompt 提示词工程使用场景 2.3 为什么要学习Prompt 提示词工程 三、Prompt 提示词工程元素构成与操作实践 3.1 前置准备 3.2 Pro…...
学习记录day18——数据结构 算法
算法的相关概念 程序 数据结构 算法 算法是程序设计的灵魂,结构式程序设计的肉体 算法:计算机解决问题的方法护额步骤 算法的特性 1、确定性:算法中每一条语句都有确定的含义,不能模棱两可 2、有穷性:程序执行一…...
一篇文章带你学完Java所有的时间与日期类
目录 一、传统时间与日期类 1.Date类 构造方法 获取日期和时间信息的方法 设置日期和时间信息的方法 2.Calendar类 主要特点和功能 常用方法 1. 获取当前日历对象 2. 获取日历中的某个信息 3. 获取日期对象 4. 获取时间毫秒值 5. 修改日历的某个信息 6. 为某个信息增…...
利用GPT4o Captcha工具和AI技术全面识别验证码
利用GPT4o Captcha工具和AI技术全面识别验证码 🧠🚀 摘要 GPT4o Captcha工具是一款命令行工具,通过Python和Selenium测试各种类型的验证码,包括拼图、文本、复杂文本和reCAPTCHA,并使用OpenAI GPT-4帮助解决验证码问…...
大学生算法高等数学学习平台设计方案 (第一版)
目录 目标用户群体的精准定位 初阶探索者 进阶学习者 资深研究者 功能需求的深度拓展 个性化学习路径定制 概念图谱构建 公式推导展示 交互式问题解决系统 新功能和创新点的引入 虚拟教室环境 数学建模工具集成 算法可视化平台 学术论文资源库 技术实现的前瞻性…...
Crystal语言Web框架实战:构建高性能API服务的轻量级方案
1. 项目概述:一个轻量级、高性能的Crystal语言Web框架最近在探索一些新兴的编程语言生态时,我注意到了Crystal语言,以及一个名为jvpflum/Crystal的GitHub仓库。乍一看这个标题,可能会让人有些困惑:这究竟是Crystal语言…...
Cortex-R52内存管理与实时性优化技术解析
1. Cortex-R52内存管理架构解析Cortex-R52作为Armv8-R架构的旗舰级实时处理器,其内存管理系统针对高可靠性场景进行了深度优化。与传统MMU不同,R52采用了增强型MPU(Memory Protection Unit)设计,通过16-24个可编程保护…...
2026AI大模型API聚合系统排行榜:四大主流中转API及特色玩家谁能脱颖而出?
随着AI技术大规模落地,AI大模型API聚合系统成为企业快速接入前沿智能能力、降低技术门槛的关键工具。目前市场上的服务商众多,企业在选择时往往会考虑稳定性、合规性、接入成本等因素。为了帮助企业解决这一难题,本文对当下主流的四大AI大模型…...
ClawGuard:为Clawdbot AI智能体打造的安全监控与熔断防护系统
1. 项目概述:ClawGuard 是什么,以及为什么你需要它如果你正在使用或开发基于 Clawdbot 框架的 AI 智能体,那么“安全”和“可控”这两个词,大概率已经在你脑海里盘旋过无数次了。我接触过不少团队,从最初的兴奋于 AI 智…...
Python网络爬虫实战:构建自动化招聘信息聚合工具JobClaw
1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目,叫 JobClaw。这名字起得挺形象,“Claw”是爪子的意思,合起来就是“工作抓取器”。简单来说,它是一个帮你从各大招聘网站上自动抓取、聚合和分析职位信息的工具。对于正在找…...
开源密钥管理器VSV:一个加密文件搞定多环境密钥管理
1. 项目概述:一个面向开发者的加密密钥管理器最近在折腾一个内部项目,需要管理不同环境(开发、测试、生产)的数据库密码、API密钥这些敏感信息。一开始图省事,直接写在了.env文件里,结果在代码评审时被同事…...
MagiskBoot:Android启动镜像解构与重构引擎深度解析
MagiskBoot:Android启动镜像解构与重构引擎深度解析 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk MagiskBoot作为Magisk生态系统的核心组件,专门负责Android启动镜像的多格式解…...
量子纠错AI预解码器:加速表面码实时处理
1. 量子纠错与实时解码的挑战量子计算的核心难题之一是量子比特的脆弱性。与环境相互作用导致的退相干效应,使得量子信息在极短时间内就会发生不可逆的丢失。表面码(Surface Code)作为最具实用前景的量子纠错方案,通过将逻辑量子比…...
构建AI助手持久记忆系统:Rekall项目实践与MCP协议应用
1. 项目概述:为你的AI助手构建一个“第二大脑”如果你和我一样,日常重度依赖 Claude Code、Cursor 这类AI编程助手,那你一定遇到过这个痛点:每次开启一个新的会话,AI助手就像得了“健忘症”,对之前讨论过的…...
如何高效使用炉石传说脚本:终极完整指南解决你的自动化难题
如何高效使用炉石传说脚本:终极完整指南解决你的自动化难题 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 你是否厌倦了炉石传说中重复性的…...
