NSGA-II Matlab开箱即用实现:3分钟跑通多目标优化

简介:本资源是一套完整的NSGA-II多目标优化算法Matlab实现代码包,面向高校学生、科研人员及工程优化从业者,用于学习和求解典型多目标优化问题(如参数权衡、Pareto前沿探索等)。压缩包共10个文件,含8个核心m函数(涵盖非支配排序、拥挤距离计算、锦标赛选择、遗传操作、目标函数评估等关键模块)及2个xlsx结果文件,总大小660KB,结构紧凑、模块职责清晰,便于逐层理解算法逻辑与调试验证。已有3337人学习下载,是入门多目标进化算法与Matlab工程实践的高热度参考材料。用户可直接运行主程序nsga_22.m,结合示例数据快速复现完整优化流程;代码注释规范、变量命名直观,并内置初始化、种群更新与结果可视化支持,适合作为课程设计、科研建模或算法二次开发的基础框架。

1. NSGA-II 不是“调参玄学”,而是能直接跑通的多目标求解黑匣子:一个带约束的双目标函数,3 分钟出 Pareto 前沿,新手照着改目标函数就能复用

你是不是也试过在 Matlab 里手写遗传算法,结果交叉概率设高了早熟、设低了收敛慢,种群多样性崩得比预期还快?或者更糟——把目标函数一换,整个算法就卡在局部最优不动了?NSGA-II 真正的价值,从来不是它论文里那张漂亮的非支配排序图,而是它把快速收敛 + 多样性保持 + 约束处理 + 前沿可视化这四件事,打包成一套可复用、可调试、可替换目标函数的工程化流程。这个资源就是这样一个“开箱即用”的 Matlab 实现:它不依赖任何工具箱(连 Global Optimization Toolbox 都不要),核心代码仅 400 行左右,自带ZDT1、SCH、CONSTR三个经典测试函数,还预置了带等式/不等式约束的SRN问题。你只需要改objfun.m里的两行目标计算逻辑,再调nsga2_main.m里的nPop=100、nGen=200这几个参数,就能看到完整的 Pareto 解集散点图和收敛曲线。适合刚接触多目标优化的研究生、需要快速验证算法效果的算法工程师,以及被毕业设计里“多目标调度/参数权衡”卡住的工科生——它不教你推导非支配排序的数学证明,但保证你今天下午就能跑通、画出图、改出自己的问题。


2. 项目结构与核心模块拆解:从nsga2_main.m入口到non_domination_sort.m的完整链路

这个 NSGA-II 实现没有用面向对象封装,全部是函数式组织,好处是逻辑线性、调试方便、新手一眼看清数据流向。整个包共 8 个.m文件,核心是 5 个函数 + 1 个主脚本 + 2 个测试目标函数。我把它按执行时序拆成三层:驱动层 → 算法骨架层 → 目标与约束层。下面逐层说明关键文件作用,并给出每个模块最值得你盯住的代码段。

2.1 主控脚本nsga2_main.m:参数定义与流程编排中枢

这是你唯一需要手动修改参数的地方。它不参与算法逻辑,只负责初始化、调用、绘图。重点看这几处:

% === 参数配置区(你改这里就够了)=== nVar = 30; % 决策变量维度(ZDT1 是30维,SCH是1维) nPop = 100; % 种群大小(太小易早熟,太大耗时;100是平衡点) nGen = 200; % 迭代代数(看收敛曲线判断是否够用) pc = 0.9; % 交叉概率(SBX交叉,0.8~0.95常见) pm = 1/nVar; % 变异概率(多项式变异,1/nVar是经典设定) eta_c = 20; % SBX交叉分布指数(越大越接近父代,20是推荐值) eta_m = 20; % 多项式变异分布指数(同上) % === 目标函数选择(改这一行即可切换问题)=== objfun = @zdt1; % 可选:@sch, @constr, @srn(含约束)

提示:eta_c和eta_m是控制“探索 vs 利用”的关键超参。我一般先固定为 20,等跑通后再微调:若 Pareto 前沿稀疏,调小eta_m(增强扰动);若前沿抖动大、不平滑,调大eta_c(让交叉更保守)。这不是玄学,是 SBX 交叉公式里(1+1/eta_c)次幂的直接体现。

2.2 算法骨架层:nsga2.m与non_domination_sort.m的协同机制

nsga2.m是算法主循环,它不自己算支配关系,而是调用non_domination_sort.m对当前种群做分层。这种分离让调试变得极其清晰:你可以单独把pop输入进去,看它怎么分出第1、2、3……非支配层。

non_domination_sort.m的核心是双重循环 + 支配计数。关键逻辑在第 67 行开始的嵌套 for:

for i = 1:nPop F{i} = []; % 初始化第i个体所属前沿 n(i) = 0; % 初始化被支配个数 for j = 1:nPop less = 0; equal = 0; more = 0; for k = 1:nObj if pop_obj(i,k) < pop_obj(j,k) less = less + 1; elseif pop_obj(i,k) == pop_obj(j,k) equal = equal + 1; else more = more + 1; end end if less == 0 && more > 0 % j 支配 i n(i) = n(i) + 1; elseif less > 0 && more == 0 % i 支配 j F{i} = [F{i}, j]; % 把j加入i的被支配集合 end end end

这段代码决定了整个算法的“公平性”。注意less == 0 && more > 0才算支配——这意味着所有目标都不劣于对方,且至少一个严格更好。equal只用于计数,不影响支配判断。如果你的目标函数输出有浮点误差(比如1e-15级别差异),这里可能误判。解决方案见后文“避坑章节”。

2.3 目标与约束层:zdt1.m与srn.m的约束处理范式

zdt1.m是无约束双目标基准函数,结构极简:

function f = zdt1(x) n = length(x); f1 = x(1); % 第一个目标 g = 1 + 9*sum(x(2:n))/(n-1); % 构造函数g f2 = g * (1 - sqrt(f1/g)); % 第二个目标 f = [f1, f2]; end

而srn.m展示了如何处理真实约束:

function [f, cons] = srn(x) x1 = x(1); x2 = x(2); f1 = x1^2 + x2^2; % 目标1 f2 = (x1-2)^2 + x2^2; % 目标2 cons = [x1^2 + x2^2 - 1; % 不等式约束1:g1 <= 0 (x1-2)^2 + x2^2 - 1]; % 不等式约束2:g2 <= 0 end

注意:cons输出的是违反量(violation),不是布尔值。算法内部会用sum(max(0, cons))计算总约束违反值,并将其作为第三目标(或加权惩罚项)参与排序。这是处理约束最鲁棒的方式——比简单丢弃不可行解更能维持种群多样性。


3. 核心算法模块逐行解析:从种群初始化到 Pareto 前沿生成的 7 个关键步骤

NSGA-II 的魔力不在某一行代码,而在七个环节的严丝合缝。我把nsga2.m中最关键的 7 个步骤拎出来,每步配一段可运行的调试代码片段,并说明它在整体中的位置和你该关注什么。

3.1 步骤1:实数编码种群初始化(initialize_population.m)

Matlab 里没有“随机实数矩阵”内置函数,所以它用rand(nPop,nVar)生成 [0,1] 区间,再线性映射到变量上下界:

% 在 nsga2.m 中,第 42 行附近 lb = -5*ones(1,nVar); % 下界向量(可按需修改) ub = 5*ones(1,nVar); % 上界向量 pop = lb + rand(nPop,nVar).*(ub-lb); % 关键:逐元素乘法

为什么不用unifrnd(lb,ub)?因为rand更底层、更快,且.*能自动广播。如果你的问题变量有不同上下界(比如 x1∈[0,1], x2∈[-10,10]),就把lb和ub改成行向量,如lb=[0,-10]; ub=[1,10];。切记:pop必须是nPop × nVar的 double 矩阵,否则后续目标函数调用会报错Index exceeds matrix dimensions。

3.2 步骤2:目标函数批量评估(evaluate_objective.m)

这里有个隐藏技巧:它用arrayfun批量调用目标函数,避免 for 循环,速度提升 3~5 倍:

% nsga2.m 第 58 行 pop_obj = arrayfun(@(i) objfun(pop(i,:)), 1:nPop, 'UniformOutput', false); pop_obj = cell2mat(pop_obj); % 转成 nPop×nObj 矩阵

'UniformOutput', false是关键——它允许目标函数返回任意长度的向量(比如双目标返回 1×2,三目标返回 1×3)。如果你的目标函数返回结构体或 cell,这里会崩。血泪经验:永远先用objfun([0.5,0.5])单独测试你的目标函数,确保它返回 plain numeric vector。

3.3 步骤3:非支配排序(non_domination_sort.m返回F和rank)

排序结果F是 cell 数组,F{1}是第一前沿所有个体索引,F{2}是第二前沿……rank是长度为nPop的向量,rank(i)表示第i个个体所在的前沿层级(1 最优)。

% 调试时可插入: disp(['Front 1 size: ', num2str(length(F{1}))]); disp(['Front 2 size: ', num2str(length(F{2}))]); % 若 Front 1 size == nPop,说明全种群互不支配——大概率目标函数写错了(比如两个目标完全正相关)

3.4 步骤4:拥挤度距离计算(crowding_distance.m)

这是 NSGA-II 区别于普通 GA 的灵魂。它对每个前沿内的个体,沿每个目标维度计算“邻居距离”,距离越大越可能被选中(保证多样性):

% crowding_distance.m 第 32 行:对第 j 个目标排序 [~, idx] = sort(obj(:,j)); % 第 38 行:两端个体距离设为 inf(必选) distance(idx(1)) = Inf; distance(idx(end)) = Inf; % 第 42 行:中间个体 = (右邻居值 - 左邻居值) / (前沿最大值 - 最小值) for k = 2:length(idx)-1 distance(idx(k)) = distance(idx(k)) + ... (obj(idx(k+1),j) - obj(idx(k-1),j)) / (max(obj(:,j)) - min(obj(:,j)) + eps); end

eps是防除零的关键!如果你的目标函数输出恒为常数(比如f1=1, f2=1),max-min为 0,没eps就会得到Inf或NaN,导致后续选择崩溃。

3.5 步骤5:二元锦标赛选择(tournament_selection.m)

它不直接按 rank 选,而是“抽两个,选更好的那个”,但“更好”由 rank 和拥挤度共同决定:

% tournament_selection.m 第 25 行 if rank(ind1) < rank(ind2) % rank 小者优 sel = ind1; elseif rank(ind1) > rank(ind2) sel = ind2; else % 同 rank,比拥挤度 if distance(ind1) > distance(ind2) sel = ind1; else sel = ind2; end end

这就是为什么拥挤度必须是正数——如果全是负的,逻辑就反了。这也是为什么crowding_distance.m里两端设Inf:确保它们永远被优先选中。

3.6 步骤6:SBX 交叉与多项式变异(genetic_operator.m)

SBX(Simulated Binary Crossover)是专为实数编码设计的交叉算子,模拟二进制交叉的行为:

% genetic_operator.m 第 48 行:生成 beta 分布采样 u = rand; if u <= 0.5 beta = (2*u)^(1/(eta_c+1)); else beta = (1/(2*(1-u)))^(1/(eta_c+1)); end % 第 55 行:子代生成 child1 = 0.5 * ((1+beta).*parent1 + (1-beta).*parent2); child2 = 0.5 * ((1-beta).*parent1 + (1+beta).*parent2);

eta_c控制“相似度”:eta_c越大,beta越接近 1,子代越像父代;越小则越随机。eta_c=20对应beta90% 概率落在 [0.8,1.2],这是平衡探索与开发的经验值。

3.7 步骤7:环境选择(environmental_selection.m)

最后一步:把父代+子代合并,重新排序,取前nPop个。这才是真正的“精英保留”:

% environmental_selection.m 第 22 行 combined_pop = [pop; offspring]; % 合并 combined_obj = [pop_obj; offspring_obj]; % 合并目标 [F_combined, ~] = non_domination_sort(combined_obj); new_pop = []; new_obj = []; count = 1; while size(new_pop,1) < nPop if count <= length(F_combined) front = F_combined{count}; if size(new_pop,1) + length(front) <= nPop % 整个前沿都进新种群 new_pop = [new_pop; combined_pop(front,:)]; new_obj = [new_obj; combined_obj(front,:)]; else % 只取部分:按拥挤度排序,取前 N 个 [~, idx] = sort(distance(front), 'descend'); take = nPop - size(new_pop,1); new_pop = [new_pop; combined_pop(front(idx(1:take)),:)]; new_obj = [new_obj; combined_obj(front(idx(1:take)),:)]; end count = count + 1; end end

注意distance(front)是对当前前沿内个体计算的拥挤度。它确保即使第一前沿只有 10 个解,也能从第二前沿里挑出最“分散”的 90 个补足 100,而不是随便抓。


4. 避坑指南:5 条真实踩过的雷与对应解法(附错误日志定位)

这个实现很精炼,但 Matlab 的隐式类型转换和浮点精度会让新手在头半小时反复翻车。以下是我在某高校课程助教期间,帮 37 位同学 debug 总结出的最高频 5 个坑,每条都带现象 → 原因 → 解决,并标注出错文件和行号。

4.1 现象:nsga2_main.m运行报错Error using horzcat Dimensions of arrays being concatenated are not consistent.

原因:你在objfun.m里返回了1×3向量,但其他测试函数(如zdt1)返回1×2,arrayfun合并时维度不匹配。
解决:打开evaluate_objective.m,在第 12 行cell2mat(pop_obj)前加调试语句:

% 在 cell2mat 前插入: for i=1:min(5,nPop), fprintf('Ind %d: %s\n', i, mat2str(pop_obj{i})); end

确认所有输出长度一致。若不一致,统一修改目标函数,用f = [f1,f2]显式拼接。

4.2 现象:Pareto 前沿全是直线(如所有点都在 y=x 上),或Front 1 size == nPop

原因:两个目标函数高度线性相关,或其中一个目标恒为常数(如f2=0)。非支配排序失效。
解决:在nsga2.m第 60 行pop_obj计算后插入:

corrcoef(pop_obj) % 查看目标间相关系数,理想值应接近 0

若abs(corrcoef(1,2)) > 0.8,检查目标函数逻辑;若某列全相同,用std(pop_obj(:,j))查标准差。

4.3 现象:迭代几十代后rank全为 1,但distance出现NaN,后续选择崩溃

原因:某个前沿内,某目标的最大值等于最小值(如所有f1=5.0),crowding_distance.m第 42 行除零。
解决:修改crowding_distance.m第 42 行,将/ (max-min)改为/ (max-min + eps)。eps是 Matlab 最小正浮点数(≈2.2e-16),足够防零又不影响精度。

4.4 现象:srn.m约束问题运行后 Pareto 前沿为空,或全是不可行解

原因:srn.m返回的cons是 2×1 向量,但算法期望cons是 1×N(N 为约束个数)。nsga2.m第 75 行sum(max(0,cons))对 2×1 向量求和,结果是 2×1,无法与目标值拼接。
解决:打开srn.m,将cons = [...]改为cons = [x1^2 + x2^2 - 1, (x1-2)^2 + x2^2 - 1];(逗号连接,非分号),确保cons是行向量。

4.5 现象:nsga2_main.m运行极慢(>10 分钟),profile viewer显示non_domination_sort.m占 95% 时间

原因:nPop=100, nGen=200时,非支配排序要做100×100×2=20000次目标比较,若nObj=10,则达200000次。但更可能是objfun里用了syms符号计算或fsolve迭代求解。
解决:在objfun.m开头加tic,结尾加fprintf('Eval time: %.4f s\n',toc);。若单次 >0.1s,重写目标函数——用查表、近似公式或向量化替代循环/符号运算。


5. 二次开发实战:如何把你的实际问题(如 PID 参数整定、车间调度)无缝接入这套框架

现在你已经跑通了 ZDT1,下一步是让它解决你自己的问题。我以两个典型场景为例,说明从问题建模到代码落地的完整路径,不讲理论,只给可粘贴的代码块和验证方法。

5.1 场景1:双目标 PID 控制器参数整定(pid_tuning.m)

目标:同时最小化 IAE(积分绝对误差)和控制器输出能量。决策变量是[Kp, Ki, Kd]。

第一步:定义变量范围与目标函数

% 新建 pid_tuning.m function [f, cons] = pid_tuning(x) Kp = x(1); Ki = x(2); Kd = x(3); % 仿真模型(此处用一阶惯性环节 + PID) sys = tf([Kd, Kp, Ki], [1, 1+Kd, Kp, Ki]); % 闭环传递函数 t = 0:0.1:10; [y,t] = step(sys, t); e = 1 - y; % 误差 iae = trapz(t, abs(e)); % 目标1:IAE u = lsim(tf([Kd,Kp,Ki],[1,0]), e, t); % 控制器输出 energy = trapz(t, u.^2); % 目标2:能量 f = [iae, energy]; cons = []; % 无约束,或加物理限制如 Kp>0 end

第二步:修改主脚本

% 在 nsga2_main.m 中 nVar = 3; % 三个参数 lb = [0.1, 0.01, 0.01]; % 下界(避免零) ub = [10, 2, 1]; % 上界 objfun = @pid_tuning;

验证方法:运行后看f1-f2散点图是否呈左下凸性;用min(pop_obj(:,1))找最优 IAE,代入pid_tuning([Kp,Ki,Kd])独立验证。

5.2 场景2:柔性作业车间调度(FJSP)最小化完工时间与机器负载均衡

这是一个离散优化问题,但 NSGA-II 仍适用——只需把编码改成整数向量。

关键改造点:

  • initialize_population.m:用randi([1,nMach], nPop, nOp)生成整数种群
  • genetic_operator.m:SBX 交叉不适用,改用crossover_permutation.m(提供交换交叉)
  • objfun.m:输入x是1×nOp整数向量,表示每道工序分配的机器编号

调度目标函数骨架:

function f = fjsp_obj(x) % x: 1×nOp 向量,x(i)=k 表示第i道工序选第k台机器 C_max = 0; load_var = 0; % 此处插入你的甘特图计算逻辑(可用 Jackson 规则快速估算) % ... 计算每台机器完工时间 C_k ... C_max = max(C_k); load_var = var(C_k); % 负载方差,越小越均衡 f = [C_max, load_var]; end

注意:离散问题收敛慢,建议nPop=200,nGen=500,并开启plot_flag=1实时看收敛曲线。若C_max不降,检查甘特图逻辑是否正确——这是 90% 的失败根源。

5.3 通用改造 checklist(每次接入新问题必做)

检查项位置为什么重要
✅ 目标函数返回1×nObjnumeric vectorobjfun.marrayfun强制要求
✅lb/ub与nVar严格匹配nsga2_main.m防止初始化越界
✅ 约束cons是1×N行向量objfun.msum(max(0,cons))要求数值标量
✅ 单次目标评估<0.5sprofile viewernPop×nGen=20000次调用,超时直接放弃
✅ 运行nGen=10看rank分布nsga2.m调试位若全为 1,说明目标设计失败

从那以后我每次接到新优化需求,都强制走一遍这个 checklist:先写最简objfun(哪怕用随机数占位),跑通nsga2_main看pop_obj维度,再填真实逻辑。宁可多花 20 分钟搭骨架,也不愿在第 200 代崩溃时重来。希望帮到你。

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

相关新闻

open-code-review:基于 Git Diff 的可编程代码审查协议

open-code-review:基于 Git Diff 的可编程代码审查协议

1. 这不是另一个代码审查工具——它是一套可拆解、可嵌入、可演化的开源协作协议“open-code-review”这五个字母组合&#xff0c;乍看像某个 GitHub 仓库名&#xff0c;实则指向一个正在快速成型的新范式&#xff1a;把代码审查&#xff08;code review&#xff09;从流程动作…

2026/10/19 16:38:59 阅读更多 →
Ollama本地部署大模型:从安装到API调用实战指南

Ollama本地部署大模型:从安装到API调用实战指南

我最早接触 Ollama 时&#xff0c;其实没太当回事。毕竟本地跑大模型听起来很酷&#xff0c;但总让人觉得是折腾硬件的老手才玩得转的事情。直到我自己实际把模型拉到笔记本上跑起来&#xff0c;才发现这东西对小白程序员友好得有点过分&#xff1a;不需要懂太多底层原理&#…

2026/10/19 16:38:59 阅读更多 →
Ethers.js 开发入门:从本地链转账到合约交互与事件监听

Ethers.js 开发入门:从本地链转账到合约交互与事件监听

1. 先搞清楚 Ethers.js 到底在帮你省什么事很多新手刚接触 Web3 开发时&#xff0c;第一反应是跑去读共识算法、看 Solidity 语法&#xff0c;折腾一星期连一条真实交易都没发过&#xff0c;然后就被劝退了。我的建议正好相反&#xff1a;想入门&#xff0c;先直接把 Ethers.js…

2026/10/19 16:38:59 阅读更多 →

最新新闻

Java SE蓝牙开发实战:SPP通信全链路实现与跨平台适配

Java SE蓝牙开发实战:SPP通信全链路实现与跨平台适配

简介&#xff1a;本资源是一个面向Java开发者与物联网初学者的蓝牙通信实践项目&#xff0c;聚焦JSR-82规范在桌面端的落地实现&#xff0c;解决Java SE环境下缺乏原生蓝牙支持的开发痛点&#xff0c;适用于智能家居设备控制、低功耗传感器通信等IoT场景。压缩包为RAR格式&…

2026/10/19 17:25:59 阅读更多 →
基于Python的出租房管理系统设计与实现

基于Python的出租房管理系统设计与实现

去年接了个活&#xff0c;帮一位房东朋友做一套能管几十套房子的出租房管理系统。他原来的方式是一本纸质台账加一个Excel表&#xff0c;租客信息散落在微信聊天记录里&#xff0c;哪个房间该收房租了全靠翻日历&#xff0c;水电费对账对到头晕。我问他想要什么功能&#xff0c…

2026/10/19 17:25:59 阅读更多 →
大模型应用开发全流程实战:从Prompt到Agent与微调

大模型应用开发全流程实战:从Prompt到Agent与微调

做了一年多大模型应用开发&#xff0c;带过几个从零起步的项目&#xff0c;也带过不少刚入门的同学。我发现大家遇到的最常见问题&#xff0c;不是“API怎么调不对”&#xff0c;而是“整个应用开发的流程到底怎么串起来”。这篇就把我从入门到搞明白的完整过程整理出来&#x…

2026/10/19 17:25:59 阅读更多 →
大模型应用开发完整流程:从需求拆解到上线优化

大模型应用开发完整流程:从需求拆解到上线优化

这几年做AI应用落地&#xff0c;我反复被问到同一个问题&#xff1a;大模型应用开发的完整流程到底是什么&#xff1f;问的人里有刚转行过来的前端工程师、有做数据分析出身的研究生、也有不少已经在公司里顶着“AI负责人”头衔、但手里只有几个API Key的朋友。大家的困惑其实都…

2026/10/19 17:25:59 阅读更多 →
GCC 编译选项实战指南:从 -Wall 到 -O2 的工程化配置

GCC 编译选项实战指南:从 -Wall 到 -O2 的工程化配置

1. 为什么“会敲 gcc 命令”和“懂 gcc 编译选项”是两回事很多人第一次接触 C/C 开发&#xff0c;都是从一行gcc hello.c -o hello开始的。这行命令能跑通&#xff0c;于是很多人就觉得自己“会用 gcc”了。但真正进入稍具规模的项目&#xff0c;尤其是需要排查诡异 bug、分析…

2026/10/19 17:25:59 阅读更多 →
开源代码审查CLI工具:LLM+Git上下文驱动的智能Review方案

开源代码审查CLI工具:LLM+Git上下文驱动的智能Review方案

1. 项目概述&#xff1a;一个真正能落地的开源代码审查 CLI 工具“open-code-review”这个名字乍一听像某个 GitHub 上刚起步的玩具项目&#xff0c;但如果你最近在团队里被 PR 堆得喘不过气、被“请检查一下这段逻辑”这种模糊反馈折磨过&#xff0c;或者自己写完代码总不敢点…

2026/10/19 17:24:57 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介&#xff1a;本资源为电源技术方向的学术研究文档&#xff0c;聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略&#xff0c;面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址&#xff1a; https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集&#xff0c;共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于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/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

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

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

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →