【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用
蚁群算法(Ant Colony Optimization)详解与应用
文章目录
- 蚁群算法(Ant Colony Optimization)详解与应用
- 前言
- 1. 蚁群算法的生物学基础
- 2. 蚁群算法的基本原理
- 2.1 算法框架
- 2.2 状态转移规则
- 2.3 信息素更新规则
- 3. 蚁群算法的实现
- 4. 蚁群算法的改进
- 4.1 MAX-MIN蚁群系统(MMAS)
- 4.2 精英蚁群系统(Elitist Ant System)
- 4.3 基于排序的蚁群系统(Rank-based Ant System)
- 5. 蚁群算法的应用
- 5.1 组合优化问题
- 5.2 网络优化
- 5.3 机器学习与数据挖掘
- 5.4 图像处理
- 6. 蚁群算法的优缺点
- 优点
- 缺点
- 7. 总结与展望
- 参考文献
前言
在自然界中,看似微小的蚂蚁却展现出了惊人的集体智慧。它们能够在没有任何中央控制的情况下,通过简单的个体行为和信息交流机制找到从巢穴到食物源的最短路径。这种现象启发了计算机科学家提出了蚁群算法(Ant Colony Optimization, ACO),这是一种模拟蚂蚁觅食行为的群智能优化算法,广泛应用于组合优化问题的求解。本文将深入介绍蚁群算法的原理、实现方法及其应用场景。
1. 蚁群算法的生物学基础
蚂蚁在寻找食物时会分泌一种称为“信息素”(Pheromone)的化学物质,用来标记它们走过的路径。当其他蚂蚁在行进过程中遇到这些信息素时,会倾向于选择信息素浓度较高的路径。这种正反馈机制使得最短路径上的信息素浓度逐渐增加,最终整个蚁群会收敛到最优或近似最优的路径上。
蚁群算法的核心思想就是模拟这种基于信息素的路径选择和信息素更新机制,通过大量简单个体的协作来解决复杂的优化问题。
2. 蚁群算法的基本原理
2.1 算法框架
蚁群算法的基本框架包括以下几个步骤:
- 初始化参数:设置信息素初始值、蚂蚁数量、信息素挥发系数等参数
- 构建解:每只蚂蚁根据状态转移规则构建一个完整的解
- 更新信息素:根据蚂蚁找到的解的质量更新信息素
- 判断终止条件:如果满足终止条件则输出最优解,否则返回步骤2继续迭代
2.2 状态转移规则
蚂蚁在选择下一个节点时,通常采用如下的概率公式:
p i j k ( t ) = [ τ i j ( t ) ] α ⋅ [ η i j ] β ∑ l ∈ a l l o w e d k [ τ i l ( t ) ] α ⋅ [ η i l ] β p_{ij}^k(t) = \frac{[\tau_{ij}(t)]^\alpha \cdot [\eta_{ij}]^\beta}{\sum_{l \in allowed_k} [\tau_{il}(t)]^\alpha \cdot [\eta_{il}]^\beta} pijk(t)=∑l∈allowedk[τil(t)]α⋅[ηil]β[τij(t)]α⋅[ηij]β
其中:
- p i j k ( t ) p_{ij}^k(t) pijk(t):表示第k只蚂蚁在t时刻从节点i移动到节点j的概率
- τ i j ( t ) \tau_{ij}(t) τij(t):表示路径(i,j)上的信息素浓度
- η i j \eta_{ij} ηij:表示启发式信息,通常为路径(i,j)的某种局部评价指标,如距离的倒数
- α \alpha α和 β \beta β:分别表示信息素和启发式信息的相对重要程度
- a l l o w e d k allowed_k allowedk:表示蚂蚁k允许访问的节点集合
也就是说,如果目标是得到距离最短的路径的话,对于每一只“蚂蚁”来说,它会基于信息素浓度和距离大小二者同时进行决策。二者的权重可以调整。
2.3 信息素更新规则
信息素更新通常包括两部分:挥发和增量。信息素更新公式如下:
τ i j ( t + 1 ) = ( 1 − ρ ) ⋅ τ i j ( t ) + Δ τ i j \tau_{ij}(t+1) = (1-\rho) \cdot \tau_{ij}(t) + \Delta\tau_{ij} τij(t+1)=(1−ρ)⋅τij(t)+Δτij
其中:
- ρ \rho ρ:信息素挥发系数,取值范围(0,1)
- Δ τ i j \Delta\tau_{ij} Δτij:信息素增量,通常与蚂蚁找到的解的质量成正比
3. 蚁群算法的实现
下面给出一个基于Python的蚁群算法解决TSP(旅行商问题)的简单实现:
import numpy as np
import matplotlib.pyplot as plt
import randomclass AntColony:def __init__(self, distances, n_ants, n_best, n_iterations, decay, alpha=1, beta=2):"""初始化蚁群算法:param distances: 距离矩阵:param n_ants: 蚂蚁数量:param n_best: 每次迭代中用于更新信息素的最优蚂蚁数量:param n_iterations: 迭代次数:param decay: 信息素衰减系数:param alpha: 信息素重要程度:param beta: 启发式信息重要程度"""self.distances = distancesself.pheromone = np.ones(distances.shape) / len(distances)self.all_inds = range(len(distances))self.n_ants = n_antsself.n_best = n_bestself.n_iterations = n_iterationsself.decay = decayself.alpha = alphaself.beta = betadef run(self):shortest_path = Nonebest_cost = float('inf')all_time_best_cost = float('inf')all_time_shortest_path = Nonefor i in range(self.n_iterations):all_paths = self.gen_all_paths()self.spread_pheromone(all_paths, self.n_best)shortest_path = min(all_paths, key=lambda x: self.path_cost(x))best_cost = self.path_cost(shortest_path)if best_cost < all_time_best_cost:all_time_best_cost = best_costall_time_shortest_path = shortest_path# 信息素衰减self.pheromone = self.pheromone * self.decayprint(f'迭代 {i+1}/{self.n_iterations}, 最佳路径长度: {best_cost:.2f}')return all_time_shortest_path, all_time_best_costdef spread_pheromone(self, all_paths, n_best):sorted_paths = sorted(all_paths, key=lambda x: self.path_cost(x))for path in sorted_paths[:n_best]:for move in range(len(path) - 1):i, j = path[move], path[move + 1]self.pheromone[i, j] += 1.0 / self.distances[i, j]self.pheromone[j, i] = self.pheromone[i, j] # 对称更新def gen_path(self, start):path = [start]visited = {start}prev = startwhile len(visited) < len(self.distances):move = self.pick_move(self.pheromone[prev], self.distances[prev], visited)path.append(move)visited.add(move)prev = movereturn pathdef gen_all_paths(self):all_paths = []for i in range(self.n_ants):start = random.randint(0, len(self.distances) - 1)path = self.gen_path(start)all_paths.append(path)return all_pathsdef pick_move(self, pheromone, dist, visited):pheromone = np.copy(pheromone)pheromone[list(visited)] = 0# 计算概率row = pheromone ** self.alpha * ((1.0 / dist) ** self.beta)# 处理概率为0的情况if row.sum() == 0:# 随机选择一个未访问的城市unvisited = list(set(self.all_inds) - set(visited))return random.choice(unvisited)else:# 按概率选择norm_row = row / row.sum()return np.random.choice(self.all_inds, 1, p=norm_row)[0]def path_cost(self, path):cost = 0for i in range(len(path) - 1):cost += self.distances[path[i]][path[i + 1]]# 回到起点cost += self.distances[path[-1]][path[0]]return cost# 示例:生成一个简单的TSP问题
def generate_random_tsp(n_cities):# 生成随机城市坐标cities = np.random.rand(n_cities, 2) * 100# 计算距离矩阵distances = np.zeros((n_cities, n_cities))for i in range(n_cities):for j in range(n_cities):if i != j:distances[i][j] = np.sqrt(((cities[i] - cities[j]) ** 2).sum())return cities, distances# 测试算法
if __name__ == '__main__':n_cities = 20cities, distances = generate_random_tsp(n_cities)# 创建蚁群算法实例aco = AntColony(distances, n_ants=20, n_best=5, n_iterations=100, decay=0.95, alpha=1, beta=2)# 运行算法best_path, best_cost = aco.run()print(f'最优路径: {best_path}')print(f'最优路径长度: {best_cost:.2f}')# 可视化结果plt.figure(figsize=(10, 6))plt.scatter(cities[:, 0], cities[:, 1], c='red', s=50)# 绘制路径for i in range(len(best_path) - 1):plt.plot([cities[best_path[i], 0], cities[best_path[i+1], 0]],[cities[best_path[i], 1], cities[best_path[i+1], 1]], 'b-')# 连接最后一个城市和第一个城市plt.plot([cities[best_path[-1], 0], cities[best_path[0], 0]],[cities[best_path[-1], 1], cities[best_path[0], 1]], 'b-')plt.title('蚁群算法解决TSP问题')plt.show()
4. 蚁群算法的改进
随着研究的深入,蚁群算法也出现了许多改进版本:
4.1 MAX-MIN蚁群系统(MMAS)
MMAS对基本蚁群算法进行了以下改进:
- 限制信息素的取值范围在 [ τ m i n , τ m a x ] [τ_{min}, τ_{max}] [τmin,τmax]之间
- 只有全局最优解或迭代最优解的蚂蚁才能更新信息素
- 初始时将信息素设为 τ m a x τ_{max} τmax,增加算法的探索能力
4.2 精英蚁群系统(Elitist Ant System)
在每次迭代中,不仅根据当前迭代的蚂蚁路径更新信息素,还会根据历史上找到的最优路径额外增加信息素,增强对最优路径的强化。
4.3 基于排序的蚁群系统(Rank-based Ant System)
根据蚂蚁找到的路径质量对蚂蚁进行排序,排名越靠前的蚂蚁在信息素更新中的权重越大。
5. 蚁群算法的应用
蚁群算法因其并行性、正反馈机制和启发式搜索能力,在许多领域都有广泛应用:
5.1 组合优化问题
- 旅行商问题(TSP):寻找访问所有城市且路径最短的一条回路
- 车辆路径问题(VRP):安排车辆以最小成本服务所有客户
- 作业调度问题:安排作业的执行顺序,使总完成时间最短
- 背包问题:在有限容量下选择价值最大的物品组合
在数学建模问题中,存在一类NP难问题(NP-hard),已经被证明只能通过枚举所有策略来选择最佳策略(如旅行商问题、哈密顿回路问题等)。而使用模拟退火算法、遗传算法、蚁群算法等可以在较小的时间开销下尽可能接近最优解。
关于这方面内容的更多介绍,可以参考我的这篇文章:“【数学建模】(启发式算法)模拟退火算法:原理、实现与应用 ”当中的第4.1节:旅行商问题(TSP)的相关介绍。
5.2 网络优化
- 网络路由:寻找网络中数据传输的最优路径
- 负载均衡:优化服务器集群中的任务分配
- 通信网络设计:优化通信网络的拓扑结构和链路容量
5.3 机器学习与数据挖掘
- 特征选择:选择最优的特征子集用于分类或聚类
- 聚类分析:将数据分成不同的簇
- 规则提取:从数据中提取分类规则
5.4 图像处理
- 边缘检测:识别图像中的边缘
- 图像分割:将图像分割成不同的区域
- 目标跟踪:在视频序列中跟踪移动目标
6. 蚁群算法的优缺点
优点
- 分布式计算:算法本质上是分布式的,易于并行实现
- 正反馈机制:通过信息素的积累强化好的解
- 启发式搜索:结合问题特定的启发式信息提高搜索效率
- 适应性强:可以适应问题环境的动态变化
- 全局优化能力:能够跳出局部最优,寻找全局最优解
缺点
- 收敛速度慢:在大规模问题上可能需要较多的迭代才能收敛
- 参数敏感:算法性能对参数设置比较敏感
- 理论基础薄弱:缺乏严格的数学收敛性证明
- 早期收敛:在某些情况下可能过早收敛到局部最优解
7. 总结与展望
蚁群算法作为一种生物启发式算法,通过模拟蚂蚁集体行为解决复杂的优化问题,展现了群体智能的强大力量。它不仅在学术研究中备受关注,在工程实践中也有广泛应用。
随着人工智能和计算技术的发展,蚁群算法还在不断进化。未来的研究方向包括:
- 与其他智能算法的混合,如遗传算法、粒子群算法等
- 参数自适应调整机制的研究
- 面向大规模、多目标优化问题的蚁群算法改进
- 蚁群算法的理论基础研究,包括收敛性分析
- 在新兴领域如区块链、量子计算等的应用探索
蚁群算法告诉我们,简单个体通过局部交互可以产生复杂的全局行为,这一思想不仅对算法设计有启发,对我们理解自然界中的集体智能现象也有重要意义。
参考文献
- Dorigo M, Stützle T. Ant colony optimization[M]. MIT press, 2004.
- Dorigo M, Maniezzo V, Colorni A. Ant system: optimization by a colony of cooperating agents[J]. IEEE Transactions on Systems, Man, and Cybernetics, Part B (Cybernetics), 1996, 26(1): 29-41.
- Stützle T, Hoos H H. MAX–MIN ant system[J]. Future generation computer systems, 2000, 16(8): 889-914.
- Blum C. Ant colony optimization: Introduction and recent trends[J]. Physics of Life reviews, 2005, 2(4): 353-373.
以上就是关于蚁群算法的详细介绍,希望这篇文章能帮助您更好地理解蚁群算法的原理和应用。如有问题,欢迎在评论区讨论交流!
相关文章:
【数学建模】(启发式算法)蚁群算法(Ant Colony Optimization)的详解与应用
蚁群算法(Ant Colony Optimization)详解与应用 文章目录 蚁群算法(Ant Colony Optimization)详解与应用前言1. 蚁群算法的生物学基础2. 蚁群算法的基本原理2.1 算法框架2.2 状态转移规则2.3 信息素更新规则 3. 蚁群算法的实现4. 蚁群算法的改进4.1 MAX-MIN蚁群系统(MMAS)4.2 精…...
03-SpringBoot3入门-配置文件(自定义配置及读取)
1、自定义配置 # 自定义配置 zbj:user:username: rootpassword: 123456# 自定义集合gfs:- a- b- c2、读取 1)User类 package com.sgu.pojo;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.spring…...
Sentinel[超详细讲解]-2
异常处理 默认情况下,Sentinel 会抛出 BlockException 异常,如果希望自定义异常,则可以使用 SentinelResource 注解的 blockHandler 属性。 1、自定义异常处理 BlockExceptionHandler 自定义异常处理类实现 BlockExceptionHandler 接口&#…...
API 请求需要证书认证? 如何在 Postman 中正确配置和使用?
本文来介绍 Postman 提供的管理证书功能如何配置,要了解更多相关的知识,可访问 Postman 证书 模块。 管理客户端证书,点击对应的按钮,首先选择 SETTINGS ,然后选择 Certificate 选项卡,如图所示࿱…...
NG-ZORRO中tree组件的getCheckedNodeList怎么使用
在 NG-ZORRO(Ant Design for Angular) 的 Tree 组件 中,getCheckedNodeList 方法用于获取当前选中的节点列表(包括半选状态节点)。以下是具体用法和示例: 基本用法 首先,确保你已通过 ViewChil…...
对于有前后逻辑依赖关系的长文本,切分时确实需要特别注意上下文的连续性,以便在召回后知识时能够尽量保留前后文的关联。
对于有前后逻辑依赖关系的长文本,切分时确实需要特别注意上下文的连续性,以便在召回后知识时能够尽量保留前后文的关联。以下是你提到的三种切分方案的分析,以及如何在实践中选择和优化: 1. 滑动窗口切分 原理:通过一…...
关于ArcGIS中加载影像数据,符号系统中渲染参数的解析
今天遇到一个很有意思的问题,故记录下来,以作参考和后续的研究。欢迎随时沟通交流。如果表达错误或误导,请各位指正。 正文 当我们拿到一幅成果影像数据的时候,在不同的GIS软件中会有不同效果呈现,但这其实是影像是…...
图解AUTOSAR_SWS_FlashTest
AUTOSAR Flash Test 模块解析文档 AUTOSAR 经典平台内存硬件抽象层模块详解 目录 1. 概述 1.1 Flash Test 模块简介1.2 模块作用和定位2. 架构设计 2.1 整体架构2.2 状态机设计3. 执行流程 3.1 后台测试序列3.2 前台测试序列4. 配置结构 4.1 模块配置详解5. 总结1. 概述 1.1 F…...
Ubuntu 使用终端手动连接无线网络(wlan0)完整流程 + 故障排查记录
在某些场景下(如 Ubuntu GUI 网络管理器不可用、使用轻量级桌面环境、或远程配置 Jetson Nano 等嵌入式设备),我们可能需要通过终端命令手动连接无线网络。本文记录一次真实的操作流程和排查过程,供自己和有需要的小伙伴参考。 &a…...
BNB Chain 何以打造 AI 驱动链上应用新世界?
人工智能正在加速改变 Web3 行业的现状面貌。最初 AI 代理起源于机器人技术和机器学习,它们通过自主系统调适,根据数据和环境做出相应技术决策支持、解决项目运行难题并执行相关任务。到了 Web3 世界,AI 代理开始融入 DAO、预测分析和自动交易…...
C 语言常用关键字详解:static、const、volatile
C 语言常用关键字详解:static、const、volatile 文章目录 C 语言常用关键字详解:static、const、volatile1. static 关键字1.1 用于局部变量示例: 1.2 用于全局变量示例: 1.3 用于函数示例: 2. const 关键字2.1 用于局…...
剑指Offer35- - 链表
1. 题目描述 这题题意感觉说的不是很清楚,容易让人产生歧义!其实题意很简单,给你一个链表 head,你深拷贝它,然后返回即可,注意不能修改原链表 /* // Definition for a Node. class Node { public:int val;N…...
open-cv的安装
python -m pip install numpy matplotlib opencv-python 【记得科学上网,不然太慢了】...
【ESP32】VSCode配置ESP-IDF问题及解决方法
报错:“D:\Espressif\tools\idf-python\3.11.2\python.exe -m pip” is not valid. (ERROR_INVALID_PIP) 当遇到错误 “d:\espressif\tools\idf-python\3.11.2\python.exe -m pip” is not valid. (error_invalid_pip) 时,通常是由于 pip 版本不兼容或未…...
分布式渲染与云渲染:技术与应用的黄金搭档
一、核心概念:先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术(如将一帧拆分为 64 个小块,64 台电脑同时渲染); 云渲染是基于云计算的渲染服务,本质是分布式渲染的商业化落地—— 用户无…...
创作者会被AI取代吗?AIGC为电影行业带来新变革
在人工智能(AI)技术日新月异的今天,创作领域正经历着一场前所未有的变革。AIGC(AI生成内容)技术的崛起,让机器能够像人类一样进行创作,这不仅引发了“创作者是否会被AI取代”的热烈讨论…...
界面控件Telerik和Kendo UI 2025 Q1亮点——AI集成与数据可视化
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Kendo…...
西门子s7协议
目录 西门子s7协议 西门子PLC数据类型 PLC中类型与C#对应类型 特殊说明: S7协议帧结构 示例代码(C#访问PLC数据): 上位机和西门子PLC的通讯 西门子PLC的存储区 S7协议通讯网络模型 S7协议栈基于ISO/OSI模型,…...
面向对象——开闭原则(Open-Closed Principle, OCP)
开闭原则(Open-Closed Principle, OCP) 是面向对象设计中的重要原则之一,它的核心思想是: 对扩展开放(Open for extension):软件实体(类、模块、函数等)应该可以扩展&am…...
线程同步——读写锁
Linux——线程同步 读写锁 目录 一、基本概念 1.1 读写锁的基本概念 1.2 读写锁的优点 1.3 读写锁的实现 1.4 代码实现 一、基本概念 线程同步中的读写锁(Read-Write Lock),也常被称为共享-独占锁(Shared-Exclusive Lock&a…...
0.雷达信号
雷达信号 目录 1 常规脉冲信号 1 2 相位编码信号 2 3 线性调频信号 4 4 非线性调频信号 6 4.1 S型非线性调频信号 6 4.2 正弦调频信号 9 4.3 正切调频信号 10 5 噪声调幅干扰信号 11 6 噪声调频干扰信号 13 7 噪声调相干扰信号 15 1 常规脉冲信号 2 相位编码信号 …...
游戏引擎学习第189天
今天的回顾与计划 在昨天,我们花了一些时间来优化调试数据的收集方法,并且在调试界面中增加了一些界面代码,使得我们可以悬停在不同的元素上,查看相关信息。今天的任务是对这些数据进行更多的操作,进行一些有趣的实验…...
web3包含哪些关键技术栈,一些成功使用场景的分享
Web3的技术栈及其应用场景可归纳为以下六个核心模块,各模块均通过不同技术组合实现去中心化生态的构建: 一、关键技术栈及对应场景 区块链与共识机制 技术实现:以太坊、波场TRON等公链底层,结合PoW(工作量证明&am…...
uvm factory
UVM Factory 是验证环境中实现动态对象和组件创建的核心机制,它通过类型注册和覆盖(Override)机制,允许在不修改原有代码的情况下替换组件或事务类型,从而提升验证环境的灵活性和可重用性。以下是Factory机制的详细解析…...
MAC安装docker 后提示com.docker.vmnetd”将对您的电脑造成伤害
出现“com.docker.vmnetd”将对您的电脑造成伤害的提示,通常是由于文件签名问题导致 macOS 的安全系统误判 Docker 为恶意软件。以下是解决方法: 停止相关服务并删除文件 运行以下命令停止相关服务并删除有问题的文件 停止 Docker 服务 sudo pkill ‘…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列拖拽排序示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例7,TableView16_07 列…...
爬虫的第三天——爬动态网页
一、基本概念 动态网页是指网页内容可以根据用户的操作或者预设条件而实时发生变化的网页。 特点: 用户交互:动态网页能够根据用户的请求而生成不同的内容。内容动态生成:数据来自数据库、API或用户输入。客户端动态渲染:浏览器…...
AI Agent 开发与传统后端开发区别?
AI Agent 开发与传统后端开发在目标、技术栈、设计模式和协作流程上存在显著差异。以下是详细对比: 一、核心目标不同 维度AI Agent 开发传统后端开发主要目标模拟人类决策、执行复杂任务处理业务逻辑、管理数据流用户交互主动感知环境、自主决策(如对话…...
python 将mkv格式视频转换成mp4格式
在Python中,可以使用moviepy库来将MKV格式的视频转换成MP4格式。moviepy是一个用于视频编辑的强大库,支持多种视频格式的处理。 from moviepy.editor import VideoFileClipdef convert_mkv_to_mp4(mkv_file_path, mp4_file_path):try:video VideoFileC…...
【入门初级篇】报表基础操作与功能介绍
【入门初级篇】报表的基本操作与功能介绍 视频要点 (1)报表组件的创建 (2)指标组件的使用:一级、二级指标操作演示 (3)表格属性设置介绍 (4)图表属性设置介绍 ࿰…...
单例模式在Python中的实现和应用
单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。它的应用场景非常广泛,比如配置管理、日志记录、线程池等领域。让我们一起深入了解一下Python中如何实现单例模式吧! 单例模式的基本概念 单例…...
HarmonyOS-ArkUI Navigation (导航组件)-第一部分
导航组件主要实现页面间以及组件内部的界面跳转,支持在不同的组件间进行参数的传递,提供灵活的跳转栈操作,从而便捷的实现对不同页面的访问和复用。 我们之前学习过Tabs组件,这个组件里面也有支持跳转的方式,Navigati…...
技术速递|为 .NET 的 AI 评估解锁新的可能性
作者:Wendy Breiding 排版:Alan Wang Microsoft.Extensions.AI.Evaluations 库旨在简化将 AI 评估流程集成到应用程序中的过程。它提供了一个强大的框架,用于评估您的 AI 应用程序并自动化评估其性能。 去年11月,我们发布了该库的…...
android studio调试aosp手机userdebug版本无法查看局部变量和参数问题如何解决?
背景: 平常系统开发过程中,经常需要对一些代码进行相关追踪,这个时候很多同学会使用马哥课程讲解的android studio直接进行调试的方法,但是近期有学员朋友在群里反馈它在调试过程中无法看到方法参数的值,局部变量值&a…...
【OCR】技术
OCR图像识别 一、OCR是什么二、Python中如何实现OCR1.简单应用 三、OCR的核心步骤1.图像预处理(提高识别准确率)2.文字识别3.输出结果 四、OCR到的应用场景五、注意事项六、扩展学习 此贴用来更新在工作中遇到的一些图片解析内容 一、OCR是什么 …...
数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步
某些用户在使用数据库同步中间件PanguSync时说,我不想进行初次的全量同步,我已经源备份还原到目标库了,两边初始数据一样,想跳过初始数据,直接进行增量同步,该怎么设置。 直接上干货,按如下步骤…...
ICLR 2025|华科OVTR:首次实现端到端开放词汇多目标跟踪,刷新性能SOTA!
OVTR 是一种新型的多目标跟踪(MOT)方法,它由华中科技大学的团队提出,并发表于 ICLR 2025。该方法不仅速度快、适应性强,还能在开放词汇场景下实现零样本跟踪。本文将从背景、创新点到实验细节,全面介绍 OVT…...
个人学习编程(3-29) leetcode刷题
最后一个单词的长度: 思路:跳过末尾的空格,可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…...
JSP 与 JavaScript 动态网页开发的比较
本质区别 特性JSP (JavaServer Pages)JavaScript执行位置服务器端客户端(浏览器)主要功能生成HTML内容操作DOM、处理用户交互数据获取直接访问服务器资源(数据库等)需要通过AJAX/Fetch API获取SEO友好是(内容在服务器生成)否(内容可能由JS动态生成)首次加载完整HTML可能需要多…...
Vue下 Sortable 实现 table 列表字段可拖拽排序,显示隐藏组件开发
vue 开发table 列表时,需要动态调整列字段的顺序和显示隐藏 实现效果如图所示: vue 组件代码 <template><div style"width: 90%; margin: 0 auto;"><el-table :data"tableData" border"" ref"table…...
Apache Shiro 全面指南:从入门到高级应用
一、Shiro 概述与核心架构 1.1 什么是 Shiro? Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了认证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管…...
高速电路中的存储器应用与设计三
4 DDR2 SDRAM 介绍及其应用要点 1. DDR2 SDRAM 概述 DDR2(Double Data Rate 2,两倍数据速率,版本 2)SDRAM,是由 JEDEC 国际标准组织开发的、基于 DDR SDRAM 的、升级的存储技术。与 DDR SDRAM 相比,虽然其…...
AndroidStudio无法识别连接夜神模拟器
下载夜神模拟器: https://www.yeshen.com/ 启动之后发现AS关联不了夜神模拟器,需要做如下的操作。 1:复制配置文件进入夜神模拟器 adb 相关的更改: 开启的命令是: 端口启动 固定: 夜神模拟器ÿ…...
Go 语言标准库中database模块详细功能介绍与示例
Go语言的标准库 database/sql 提供了与 SQL 数据库交互的通用接口,但需要搭配具体的数据库驱动(如 MySQL、PostgreSQL 等)使用。以下是 database/sql 的核心方法及示例说明: 1. 连接数据库 sql.Open(driverName, dataSourceName)…...
ai-api-union项目,适配各AI厂商api
项目地址:alpbeta/ai-api-union 需求:实现兼容各大模型厂商api的流式对话和同步对话接口,本项目现兼容智谱、豆包、通义、通义版deepseek 设计 一个ChatController类对外暴露这两个接口,入参都为ChatRequest请求类,…...
进程间通信——信号量
进程间通信——信号量 目录 一、基本概念 1.1 概念 1.2 基本操作 1.3 相关函数 1.3.1 semget创建/获取 1.3.2 semop操作信号量 1.3.3 semctl初始化/删除 二、代码操作 2.1 不用PV的 2.2 用PV 的 2.2.1 a.c 2.2.2 b.c 2.2.3 sem.h 2.2.4 sem.c 一、基本概念 1.1…...
CSS 如何设置父元素的透明度而不影响子元素的透明度
CSS 如何设置父元素的透明度而不影响子元素的透明度 在 CSS 中,设置父元素的透明度(如通过 opacity 属性)会影响所有子元素的透明度,因为 opacity 是作用于整个元素及其内容的。如果想让父元素透明但不影响子元素的透明度&#x…...
SpringBean模块(一)定义如何创建生命周期
一、介绍 1、简介 在 Spring 框架中,Bean 是指由 Spring 容器 管理的 Java 对象。Spring 负责创建、配置和管理这些对象,并在应用程序运行时对它们进行依赖注入(Dependency Injection,DI)。 通俗地讲,Sp…...
2007-2019年各省地方财政一般公共服务支出数据
2007-2019年各省地方财政一般公共服务支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政一般公共服务支出 4、范围:31省 5、指标说明:地方财政一般公共服务…...
S32K144外设实验(六):FTM输出单路PWM
文章目录 1. 概述1.1 时钟系统1.2 实验目的2. 代码的配置2.1 时钟配置2.2 FTM模块配置2.3 输出引脚配置2.4 API函数调用1. 概述 1.1 时钟系统 FTM的CPU接口时钟为SYS_CLK,在RUN模式下最高80MHz。模块的时钟结构如下图所示。 从上图中可以看出,FTM模块的功能时钟为SYS_CLK,…...