优化算法: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帮助解决验证码问…...
大学生算法高等数学学习平台设计方案 (第一版)
目录 目标用户群体的精准定位 初阶探索者 进阶学习者 资深研究者 功能需求的深度拓展 个性化学习路径定制 概念图谱构建 公式推导展示 交互式问题解决系统 新功能和创新点的引入 虚拟教室环境 数学建模工具集成 算法可视化平台 学术论文资源库 技术实现的前瞻性…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...