MATLAB进化计算实战:PSO、DE与GA求解NP难题

简介:面向石化生产计划与作业车间调度(JSSP)等 NP 难题的 MATLAB 进化计算资源包,以系统开源方式提供,适合从事优化算法研究或工程应用的工程师、研究生。内容覆盖粒子群、人工蜂群(ABC)与教学学习优化(TLBO)等算法,并配有问题说明、阅读材料和可运行的 MATLAB 文件,方便对照论文复现石化行业生产计划、JSSP 等典型案例,也便于在此基础上扩展新的进化算法。

资源共 26 个文件,含 14 个 PDF(涉及算法理论、问题定义与方法综述)、10 个 .m 源码(数据加载、目标函数与主程序)、1 个 .p 文件及 1 个 README 说明,压缩包整体约 18.56 MB。目录按 TLBO、ABC、JSSP、生产计划等模块划分,既有经典文献,也有单相多组 TLBO、约束机械设计优化等较新方法,并附 README 与辅助数据,覆盖从理论阅读到代码调试的完整链路。

截至目前已有 295 人学习该资源包,适合希望快速上手进化计算并将其应用到实际调度或生产问题的进阶读者。

1. 进化计算实战包:为什么我建议你拿它去啃NP难题

如果你手头有一个组合优化问题,比如车间调度、路径规划或者特征选择,第一反应多半是遗传算法。但真正跑过的人都知道,遗传算法在连续型参数搜索上收敛慢,早熟起来也是家常便饭。这个以MATLAB为主线实现的进化计算资源,核心是用粒子群算法(PSO)打底,再配上差分进化、遗传算子等一整套进化计算工具箱,目标很直接:把NP难题从「能跑」拉到「跑得稳、有结果可比」。适合两类人:一是毕设或课题里需要快速验证优化算法的学生,二是工程中想对比不同元启发式算法效果的开发者。它不是一个封装好的黑匣子,而是把每个算子、每步迭代都摊开给你看的源码集合,改起来比从零写省太多时间。

2. 架构设计:模块化进化计算框架的骨架是怎么搭的

2.1 目录结构与模块划分

这套资源拿到手,第一件事不是双击main函数,而是先看清目录。它把几个算法按独立文件夹拆开,彼此之间没有交叉调用,只通过统一的接口约定来协作。整体结构大致如下:

Evolutionary_Computation/ ├── pso/ # 粒子群算法主模块 │ ├── pso_main.m # 算法入口 │ ├── pso_update.m # 速度与位置更新 │ └── pso_options.m # 参数配置结构体 ├── de/ # 差分进化模块 │ ├── de_main.m │ └── de_mutation.m ├── ga/ # 遗传算法模块 │ ├── ga_main.m │ ├── selection.m │ └── crossover.m ├── test_functions/ # 基准测试函数集 │ ├── sphere.m │ ├── rastrigin.m │ ├── ackley.m │ └── schaffer.m ├── utils/ # 公共工具函数 │ ├── plot_convergence.m │ └── normalize_population.m └── examples/ # 可直接运行的示例脚本 ├── run_pso_sphere.m └── run_de_rastrigin.m

这种组织方式的好处很直白:你想研究哪种算法就进哪个目录,不需要被无关代码干扰。每个算法的入口函数命名统一,参数配置都收敛在一个options结构体里,切换算法时改动量很小。我一般在拿到这类资源后,会先跑一遍examples目录里的脚本确认环境没问题,再逐步改参数、换测试函数。

2.2 统一接口约定与数据流设计

这个项目的关键设计思路在于「算法内核」与「问题定义」的解耦。所有算法入口函数都接受三个参数:目标函数句柄、变量维度、参数结构体。返回的是最优解向量、最优适应度值以及每次迭代的收敛记录。

% 以pso_main为例的统一调用方式 [best_x, best_fitness, convergence_curve] = pso_main(fitness_func, dim, options); % 参数结构体示例 options = pso_options(); options.pop_size = 30; % 种群规模 options.max_iter = 200; % 最大迭代次数 options.w_start = 0.9; % 惯性权重初始值 options.w_end = 0.4; % 惯性权重结束值 options.c1 = 1.5; % 个体学习因子 options.c2 = 1.5; % 社会学习因子 options.boundary = 'absorb'; % 边界处理策略

数据流是这样的:入口函数先根据options初始化种群,然后进入迭代循环。每次迭代里,先评估每个粒子的适应度,更新个体最优和全局最优,再根据PSO的速度更新公式调整粒子位置,最后记录本次迭代的全局最优值到convergence_curve数组里。迭代结束后,把结果画成收敛曲线。

这个接口设计对二次开发非常友好。你不需要理解每个算法内部怎么实现的,只要会写一个「输入一组解、输出一个适应度值」的函数,就能把一个新问题接进来。这也是我读完源码后的直观感受:它在设计上刻意保持了matlab风格的结构体传参习惯,没有炫技,但扩展时非常顺手。

2.3 测试函数集的作用

test_functions目录里的那几个函数不是摆设。它们的作用是给算法一个「可量化的考核标准」。比如sphere函数是全连续单峰,适合验证算法基础收敛能力;rastrigin函数带大量局部极小值,适合检验跳出局部最优的能力;ackley函数则是典型的非线性多峰,对参数敏感度高。

function y = rastrigin(x) % Rastrigin基准函数,用于测试全局搜索能力 % 输入x是一个行向量,取值范围通常为[-5.12, 5.12] n = length(x); y = 10 * n + sum(x.^2 - 10 * cos(2 * pi * x)); end

这个函数的意义在于,它的全局最小值在x全为0处取得,但周围密布局部极小点。拿它来验证PSO,如果惯性权重衰减太快或者学习因子设置不当,很容易就困在某个局部极值里出不来。这给我们调试算法提供了很清晰的参照系:跑出的结果离0越远,说明早熟越严重。

3. 核心算法拆解:PSO主循环与关键实现逐行读

3.1 PSO速度与位置更新

粒子群的核心只有两个公式:速度更新和位置更新。这套资源里的pso_update.m把这两个公式写得很干净。我把它核心代码抽出来逐行看:

function [positions, velocities] = pso_update(positions, velocities, pbest, gbest, options) % 粒子群速度和位置更新函数 % positions: 当前种群位置矩阵,每行是一个粒子 % velocities: 当前速度矩阵,维度与positions一致 % pbest: 每个粒子个体最优位置 % gbest: 全局最优位置 % options: 参数结构体,需要w, c1, c2等字段 pop_size = size(positions, 1); dim = size(positions, 2); % 线性递减惯性权重:从w_start降到w_end % 这种做法的好处是前期全局搜索强,后期局部精细搜索 w = options.w_start - (options.w_start - options.w_end) * (options.current_iter / options.max_iter); % 生成两个随机矩阵,保证每次迭代的随机性 r1 = rand(pop_size, dim); r2 = rand(pop_size, dim); % 速度更新公式:惯性项 + 认知项 + 社会项 velocities = w * velocities + ... options.c1 * r1 .* (pbest - positions) + ... options.c2 * r2 .* (gbest - positions); % 位置更新:直接叠加速度 positions = positions + velocities; end

这段代码的逻辑非常清晰,但有几个细节值得注意。第一,惯性权重w是线性递减的,这意味着算法前期的搜索范围大,后期逐步收敛到局部精细搜索。第二,r1和r2是逐个维度独立随机的,而不是每个粒子共享一个随机数,这是PSO里很重要的细节——如果每个粒子所有维度用同一个随机数,会削弱搜索的多样性。第三,这里对速度没有做上限限制,实际运行中容易出问题,后面避坑章节会专门讲。

3.2 个体最优与全局最优的更新机制

有了位置更新,还得有「记忆」机制:每个粒子要记住自己见过的最好位置,整个群体要记住全局最好位置。这一步通常在评估适应度之后做。

function [pbest, gbest, gbest_fitness] = update_best(positions, fitness, pbest, pbest_fitness, gbest, gbest_fitness) % 更新个体最优和全局最优 % fitness: 当前种群每个粒子的适应度值,列向量 % 逐粒子比较当前适应度与历史最优适应度 improved = fitness < pbest_fitness; pbest(improved, :) = positions(improved, :); pbest_fitness(improved) = fitness(improved); % 更新全局最优:用当前种群中最优的粒子去挑战历史全局最优 [current_best_fitness, best_idx] = min(fitness); if current_best_fitness < gbest_fitness gbest = positions(best_idx, :); gbest_fitness = current_best_fitness; end end

这里的逻辑是「先更新个体,再更新全局」。注意一个容易被忽略的细节:个体最优更新的判定条件是小于号<,不是小于等于<=。这意味着当粒子的适应度和历史最优相等时,位置不会被更新。这样做的好处是避免在平坦适应度区域内粒子来回震荡,保持搜索稳定。实际运行时,如果碰到收敛曲线出现平台期后再次下降的情况,往往就是这个机制在起作用——某些粒子正从非优区域向更优区域移动。

3.3 边界处理策略

粒子飞出搜索空间是PSO的常见问题。这套资源里实现了三种边界策略:absorb(吸附)、reflect(反射)和invisible(无视)。默认的是absorb,实现方式如下:

function positions = boundary_handle(positions, lb, ub, strategy) % 边界处理函数 % lb: 下界向量,ub: 上界向量 % strategy: 'absorb' / 'reflect' / 'invisible' switch strategy case 'absorb' % 越界的粒子直接拉回边界,速度清零 positions = max(min(positions, ub), lb); case 'reflect' % 越界后按反射规则弹回 over_high = positions > ub; over_low = positions < lb; positions(over_high) = 2 * ub(over_high) - positions(over_high); positions(over_low) = 2 * lb(over_low) - positions(over_low); case 'invisible' % 不做边界约束,但适应度会给极大惩罚 % 因为invisible策略不需要修改位置,这里直接返回原值 end end

absorb策略在优化连续凸函数时效果稳定,拉回边界并清零速度能防止粒子反复越界。但它有个隐患:如果全局最优就在边界上,absorb策略会让大量粒子堆在边界处,种群多样性迅速下降。这种情况下我一般会换成reflect,让越界粒子带着反弹速度回到搜索空间内,多样性保持得更好。用哪种策略,完全取决于你的问题最优解是否可能出现在边界附近。

4. 从零跑通:加载资源、配置参数、可视化收敛曲线

4.1 环境准备与目录导入

这套资源是在MATLAB环境下运行的,打开后第一件事是把整个目录添加进MATLAB路径。我看到有同学直接cd到examples目录就运行脚本,结果报"函数未定义"的错,就是因为pso目录下的函数没被识别到。

% 把整个Evolutionary_Computation目录加入路径 % 注意:以下命令在MATLAB命令窗口执行 addpath(genpath('D:/your_path/Evolutionary_Computation')); % 验证路径是否生效 which pso_main

genpath会自动递归添加所有子目录,这样不管你在哪个目录运行脚本,都能找到算法函数。which命令用来确认函数是否被正确搜索到,如果返回完整路径说明环境没问题。

4.2 配置参数与运行基准测试

以运行PSO求解sphere函数为例。sphere函数是最简单的连续单峰函数,适合验证算法代码逻辑是否正确。examples目录里有现成的run_pso_sphere.m,它的核心配置过程是这样的:

% run_pso_sphere.m 示例脚本的核心部分 % 配置问题 dim = 30; % 决策变量维度 lb = -100 * ones(1, dim); % 下界 ub = 100 * ones(1, dim); % 上界 fitness_func = @(x) sphere(x); % 目标函数句柄 % 配置算法参数 options = pso_options(); options.pop_size = 50; options.max_iter = 500; options.w_start = 0.9; options.w_end = 0.4; options.c1 = 1.5; options.c2 = 1.5; % 调用算法求解 [best_x, best_fitness, convergence_curve] = pso_main(fitness_func, dim, options); % 输出结果 fprintf('最优适应度值: %.6e\n', best_fitness); % 绘制收敛曲线 figure; semilogy(convergence_curve); xlabel('迭代次数'); ylabel('全局最优适应度值'); title('PSO收敛曲线 - Sphere函数'); grid on;

这里有几个参数需要解释。pop_size是种群规模,对sphere这种简单函数50个粒子足够了,但如果是rastrigin这类多峰函数,至少要50到80个。max_iter是最大迭代次数,决定了算法跑多久。w_start和w_end是惯性权重的起止值,0.9到0.4是最经典的经验区间。c1和c2是学习因子,一般取1.5左右,两者相等通常表现均衡。

跑完之后看收敛曲线,正常情况是前期快速下降,中后期缓慢逼近0。如果曲线是一条横线,基本可以断定粒子一开始就飞出了有效搜索范围,或者目标函数句柄传错了。

4.3 多测试函数对比与结果解读

单一函数跑通不算完,要验证算法的通用性,就得把几个基准函数一起跑。资源里虽然没有提供一键对比脚本,但我们可以自己写一个简单的循环来实现:

% 批量对比测试脚本 test_functions = {'sphere', 'rastrigin', 'ackley'}; labels = {'Sphere', 'Rastrigin', 'Ackley'}; figure; hold on; for i = 1:length(test_functions) % 动态构造函数句柄 test_func = str2func(test_functions{i}); if strcmp(test_functions{i}, 'sphere') lb = -100 * ones(1, dim); ub = 100 * ones(1, dim); else lb = -5.12 * ones(1, dim); ub = 5.12 * ones(1, dim); end [~, ~, curve] = pso_main(test_func, dim, options); semilogy(curve, 'DisplayName', labels{i}); end legend show; grid on; xlabel('迭代次数'); ylabel('最优适应度值');

这段代码的意义在于,你能直观地看到同一个算法在不同难度函数上的表现差异。通常sphere函数收敛到1e-10以下,rastrigin只能到个位数甚至几十,这说明算法在多峰函数上的全局搜索能力还有提升空间。正是基于这样的对比结论,后面才催生了混合算法的改造思路。

5. 避坑记录:参数敏感、早熟收敛与收敛判定的五个血泪教训

5.1 惯性权重固定不衰减,结果永远差一口气

某同学A拿这套代码做特征选择实验,把w_start和w_end都设置成0.8,跑了30次,收敛曲线看起来很平滑,但最终准确率比对照组差一截。原因就在于固定惯性权重导致粒子群前期全局搜索能力不足,后期又缺乏精细搜索的动能提升。w不衰减的情况下,粒子速度很难降下来,最终结果就是一直在最优解附近震荡。解决方法是把w_start设0.9、w_end设0.4,让算法在迭代前半段充分探索搜索空间,后半段慢慢收敛。从那以后我每次调PSO都会先检查权重范围是否拉开。

5.2 初始种群范围与搜索空间不一致

我一开始图省事,把所有基准函数的初始种群范围都设成[-1, 1],但rastrigin函数的搜索范围是[-5.12, 5.12]。跑出来的结果惨不忍睹,全局最优值稳定停留在某个局部最优解上。原因是初始种群被限制在一个过小的区间里,粒子群根本没机会覆盖到更大的搜索空间。解决方式很简单:初始化粒子位置时,严格使用lb和ub向量做均匀分布随机初始化,即positions = lb + rand(pop_size, dim) .* (ub - lb)。这个问题验证起来很直观,把初始种群范围改成与搜索空间一致后,30次实验的收敛精度明显提升。

5.3 边界策略选错,多峰函数直接陷入局部最优

用absorb策略跑ackley函数时,出现了一个奇怪现象:收敛曲线前期下降很快,但中期卡住不动,后期突然跳到另一个更优值。后来加了粒子分布可视化才发现,大量粒子被边界吸附到搜索空间边缘,在边缘处堆叠成簇,导致种群多样性基本丧失。原因是ackley函数的最优解在原点,而边界距离原点较远,被吸附在边界的粒子根本够不到全局最优附近。换成reflect策略后,粒子越界还能弹回内部空间,多样性保持更好,最终结果明显提升。经验是:多峰函数优先用reflect,单峰函数用absorb可以接受。

5.4 收敛判定只看最优值变化率,容易提前终止

有几次实验在迭代到第50代时,最优值在连续5代内变化极小,我以为算法收敛了,提前中断运行,但实际上算法在后期还有一次明显的下降。原因是PSO在某些多峰函数上的收敛过程是「阶梯式」的:平台期很长,然后突然跳变到更优值。只是盯着最优值的变化率做早停判断,十有八九会提前终止。我后来改用的方法是:把早停容忍度设得非常小(比如最优值变化小于1e-8才停),或者干脆用最大迭代次数作为终止条件。

5.5 种群规模翻倍,结果反而变差

理论上讲,种群规模越大,搜索能力越强,但我在一次作业里把pop_size从50调到200,发现目标函数值不降反升。查了资料才明白,种群过大时,粒子间的信息交互过于频繁,群体很快聚集到某个局部最优附近,早熟概率增加。而且大种群在每轮迭代里的计算量也大,相同迭代次数下,搜索代数反而少了。调参经验是:连续函数优化30到50个粒子完全够用,多峰函数最多80个,再大就需要配合拓扑结构改进(如小生境PSO),而不是单纯加人数。

6. 改造实战:把标准PSO替换成混合算法并验证增益

如果你想在标准PSO基础上做点改进,这条路是最容易出成果的:用差分进化(DE)的变异算子替换PSO的部分粒子更新。具体思路是,在每次迭代中,从种群中按一定比例选出若干粒子,不对它们执行速度-位置更新,而是执行DE的差分变异和交叉操作。这样做的理论依据是,PSO的位置更新是「基于全局最优的吸引」,容易失去多样性;而DE变异是「基于种群中随机个体的差分扰动」,天然维持多样性。两种机制混合后,PSO负责快速开发,DE负责探索新区域。

改造方法其实非常简单,在pso_main.m的迭代循环内部加入一个分支判断。每当迭代次数能被某个间隔整除时,就调用多写一个de_cross.m函数,对当前种群中的随机子集做变异。

% 在pso_main.m的迭代循环中插入的混合策略 if mod(iter, 5) == 0 % 每5代进行一次差分变异,将种群中30%的粒子替换为DE算子产生的版本 de_idx = randperm(pop_size, round(pop_size * 0.3)); positions(de_idx, :) = de_mutation(positions, pop_size, dim); % 简化的DE变异 end

改造完后,用同样的参数和三个基准函数分别跑30次实验,对比收敛精度和标准差。通常你能直观看到多峰函数上的最优值有所改善,而单峰函数的收敛速度不受影响。我一般会在验证后把两种算法的参数都做一次扫描实验,确认改进不是靠运气。这个思路也可以扩展成「PSO + 模拟退火」「PSO + 局部搜索」等不同组合,关键是每次改完都要做显著性对比,不能只看一次运行结果。

把这套流程走完一遍,你对进化计算的参数敏感性和算法特性的理解会完全不一样。从那以后,我每次拿到新的优化问题,都会强制先做一轮基准函数测试、参数扫描和边界策略对比,再决定用哪种算法。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

从零到一构建Web应用:前端工程化与REST API联调实战

从零到一构建Web应用:前端工程化与REST API联调实战

&#xff08;二&#xff09;这个编号&#xff0c;其实是整个系列里最难写的一篇。&#xff08;一&#xff09;通常熬过了需求梳理和技术选型&#xff0c;读者们热情还在&#xff0c;但你到了第二篇&#xff0c;面对的是一大堆还没落地的代码骨架、各种边角约定&#xff0c;以及…

2026/10/20 3:25:04 阅读更多 →
MCP + Streamable HTTP:让AI稳定调用你的工具

MCP + Streamable HTTP:让AI稳定调用你的工具

作为一个常年写小工具、偶尔折腾智能体的独立开发者&#xff0c;我一度很烦“把工具交给 AI 调用”这件事。明明接口文档写清楚了&#xff0c;模型还是会拼错参数&#xff1b;明明工具就挂在同一个局域网里&#xff0c;它却找不到服务&#xff1b;好不容易调通了&#xff0c;换…

2026/10/20 3:25:04 阅读更多 →
AI率99.8%到14.9%:论文降重实战指南

AI率99.8%到14.9%:论文降重实战指南

最近我的小群里又被同一个问题刷屏了&#xff1a;论文写了初稿&#xff0c;研究、数据、分析都是自己做的&#xff0c;只是用AI顺手润色了一遍&#xff0c;结果检测报告出来&#xff0c;疑似AI生成内容比例99.8%。发消息的是一位叫A同学的研究生&#xff0c;他第一反应是“完了…

2026/10/20 3:25:04 阅读更多 →

最新新闻

Qt新建工程全攻略:从环境配置到构建调试一步到位

Qt新建工程全攻略:从环境配置到构建调试一步到位

最近有朋友问我&#xff1a;Qt 到底怎么新建工程&#xff1f;他说自己把 Qt Creator 装好了&#xff0c;结果打开软件&#xff0c;面对一堆模板和选项完全不知道该点哪里。这个问题看起来基础&#xff0c;但我在带新人时发现&#xff0c;能在这一步顺畅走完、并且真正理解每个选…

2026/10/20 4:26:40 阅读更多 →
Flutter集成HarmonyOS实战:从跨平台架构到鸿蒙适配全记录

Flutter集成HarmonyOS实战:从跨平台架构到鸿蒙适配全记录

开篇先说明一个事&#xff1a;这个项目不是我接的“外包订单”&#xff0c;也不是教学 Demo&#xff0c;而是我作为主要开发者&#xff0c;从 0 到 1 做的一个自研社区共享类 App。整个过程涉及三块硬骨头&#xff1a;第一&#xff0c;把“共享社区”这种偏软性的业务逻辑落到产…

2026/10/20 4:26:40 阅读更多 →
PyTorch从零手写Transformer:位置编码、多头注意力与mask详解

PyTorch从零手写Transformer:位置编码、多头注意力与mask详解

先说个个人感受&#xff1a;Transformer 这种架构&#xff0c;看论文、看别人写的博客总觉得挺简单&#xff0c;真正自己用 PyTorch 一行行从零实现一遍&#xff0c;才意识到里面有大量容易出问题的细节。维度、mask、残差和归一化的顺序&#xff0c;任何一个地方没想明白&…

2026/10/20 4:26:40 阅读更多 →
AI检测一片飘红?从降AI率底层逻辑到作业实战全流程

AI检测一片飘红?从降AI率底层逻辑到作业实战全流程

又到了交作业的季节&#xff0c;后台和私信里最密集的问题永远是同一个&#xff1a;老师发的AI检测报告一片飘红&#xff0c;初稿直接被标“疑似AI生成”&#xff0c;怎么办&#xff1f;这几年我陆陆续续试过市面上能见到的各种降AI率工具&#xff0c;说实话&#xff0c;真正能…

2026/10/20 4:26:40 阅读更多 →
Fort Firewall 防火墙配置教程:5分钟配出第一条拦截规则,附排错清单

Fort Firewall 防火墙配置教程:5分钟配出第一条拦截规则,附排错清单

Fort Firewall 防火墙配置教程&#xff1a;5分钟配出第一条拦截规则&#xff0c;附排错清单 【免费下载链接】fort Fort Firewall for Windows 项目地址: https://gitcode.com/GitHub_Trending/fo/fort 一次凌晨的境外异常外联&#xff0c;在 Windows 防火墙日志里几乎没…

2026/10/20 4:26:40 阅读更多 →
技术人技能管理指南:从技能盘点、刻意练习到作品集构建

技术人技能管理指南:从技能盘点、刻意练习到作品集构建

1. 从“skills”这个词说起&#xff1a;为什么它突然成了硬通货“skills”这个词&#xff0c;放在五年前&#xff0c;可能只是简历底部一个不起眼的栏目。但现在你打开任何一个技术社区、招聘页面或者同行群聊&#xff0c;它出现的频率高得离谱。我自己的感受是&#xff0c;过去…

2026/10/20 4:25:39 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →