Petri网仓储优化实战:从建模到Matlab仿真
简介这份资源面向工业工程、物流管理及智能制造方向的研究生与企业流程改进人员围绕W公司合肥工厂原料仓储物流场景提供基于Petri网的入厂物流与厂内物流流程建模及优化方法。包内为1个PDF文件约977KB完整呈现论文的建模思路、关联矩阵计算过程与仿真验证结果并附有可运行的Matlab复现代码及逐段中文解释便于对照学习Petri网结构定义、关联矩阵分析、S不变量与T不变量求解以及离散事件仿真流程。读者可借此掌握从流程调研、模型构建、有界性与活性验证到关联矩阵重组算法识别瓶颈与冗余环节再到优化前后变迁数量与单箱货物平均处理耗时对比的完整闭环方法。目前已有42人学习适合需要将Petri网理论落地到仓储物流降本增效场景、并希望获得可复现代码参考的技术人员。1. 从一张画满圆圈和箭头的图说起这套 Petri 网仓储优化资料到底能干什么如果你在物流工程或生产运作管理方向做过课题大概率见过这样的场景导师甩过来一句“把 W 公司原料仓储流程优化一下”你打开 Visio 画了张流程图交上去被批“太静态看不出瓶颈在哪”。问题就出在——流程图只能描述“谁接谁”描述不了“资源被占用了多久、哪里会堵、堵了之后系统还能不能跑”。Petri 网恰好补上这一刀它把流程里的每个环节变成“库所place”把每个动作变成“变迁transition”用托肯token的流动模拟物料和资源的流转于是“堵不堵、堵多久、加一个人能不能缓解”就变成了可以算的东西。这份资料围绕 W 公司的入厂物流与厂内原料仓储业务用 Petri 网建模 关联矩阵分析 Matlab 仿真把一条原本靠经验拍脑袋的流程拆成了可量化、可复现的模型。它适合三类人正在做物流/工业工程课程设计的学生、需要给仓储流程做量化论证的从业者、以及想找一个完整 Petri 网实战案例而不是只有定义的建模初学者。下面我按“模型怎么建 → 矩阵怎么算 → 仿真怎么跑 → 坑在哪”的顺序把这份资料拆开讲透。2. Petri 网建模把 W 公司原料仓储流程翻译成库所与变迁2.1 为什么选 Petri 网而不是流程图或排队论先说选型理由这决定了后面所有工作的边界。流程图是静态的画完只能看结构无法回答“同时到两车原料时先处理谁”排队论擅长算等待时间但要求到达和服务服从特定分布而仓储流程里的“叉车调度、质检返工、库位占用”往往是离散、并发、带冲突的硬套排队论模型会失真。Petri 网的优势在于它天生描述并发与冲突两个变迁共享一个输入库所时谁先触发取决于托肯分布这正好对应“一台叉车被两个任务争抢”的现实。常见做法是先用“库所-变迁”把流程骨架搭出来再逐步细化。W 公司的原料仓储主流程大致是原料到厂 → 卸货 → 质检 → 合格入库/不合格退货 → 上架存储 → 按工单出库 → 配送至产线。每一步的“状态”是库所“动作”是变迁。这里有个容易翻车的地方很多人一上来就把所有细节都塞进去结果库所几十个关联矩阵大到没法看。我的经验是先建“粗模型”验证逻辑通不通再针对瓶颈环节做“精化”也就是把某个变迁拆成子网。2.2 从业务流程到 Petri 网元素的映射规则把业务语言翻译成 Petri 网语言需要一套稳定的映射规则否则不同人建出来的模型没法对比。我一般按下面这张表来对应业务对象Petri 网元素说明原料、托盘、工单托肯 token流动的“东西”数量代表资源数流程状态/缓冲区库所 place圆圈如“待质检区”“合格品区”处理动作变迁 transition方框如“卸货”“质检”资源约束库所容量/弧权限制同时处理的数量流程走向有向弧 arc连接库所与变迁按这个规则W 公司入厂物流的核心子网可以这样描述库所 P1 表示“待卸原料”变迁 T1 表示“卸货”P2 表示“待质检”T2 表示“质检”P3 表示“合格品暂存”T3 表示“上架”P4 表示“库位占用”。不合格品则从 T2 分出一条弧到 P5“退货区”。这套映射的好处是任何一个业务改动比如增加一个质检工位都能直接反映为库所或变迁的增减而不是重画整张图。2.3 用 Matlab 搭出可运行的模型骨架理论讲完必须落到能跑的东西上。这份资料用 Matlab 实现 Petri 网核心是关联矩阵和状态演化。下面是一段可直接抄的骨架代码先定义库所数、变迁数再构造输入输出矩阵% Petri网骨架W公司原料仓储入厂流程 % 库所P1待卸 P2待检 P3合格暂存 P4库位 P5退货 % 变迁T1卸货 T2质检 T3上架 T4退货处理 nP 5; nT 4; % 输入矩阵 II(i,j)1 表示库所i是变迁j的输入 I zeros(nP, nT); I(1,1) 1; % P1 - T1 I(2,2) 1; % P2 - T2 I(3,3) 1; % P3 - T3 I(5,4) 1; % P5 - T4 % 输出矩阵 OO(i,j)1 表示库所i是变迁j的输出 O zeros(nP, nT); O(2,1) 1; % T1 - P2 O(3,2) 1; % T2 - P3 (合格) O(5,2) 1; % T2 - P5 (不合格) O(4,3) 1; % T3 - P4 O(1,4) 1; % T4 - P1 (退货后重新到厂简化处理) % 关联矩阵 C O - I C O - I; disp(关联矩阵 C ); disp(C);这段代码的逻辑说明输入矩阵 I 描述“哪个库所的托肯被消耗”输出矩阵 O 描述“哪个库所获得托肯”两者相减得到关联矩阵 C它是后续分析的核心。参数说明nP 和 nT 必须和实际流程一致I 和 O 中每个 1 的位置都对应一条有向弧写错一个位置整个模型就偏了。运行后你会看到一个 5×4 的矩阵正数表示该变迁产生托肯负数表示消耗托肯。这一步跑通说明模型骨架立住了接下来才能谈“它会不会死锁、有没有冲突”。3. 关联矩阵分析从矩阵里读出死锁、冲突与瓶颈3.1 关联矩阵到底能看出什么很多人建完模型就急着跑仿真其实关联矩阵本身就能暴露大量问题。C 矩阵的每一列对应一个变迁列中 -1 表示消耗、1 表示产生。如果某一列全是非负没有 -1说明这个变迁不需要任何输入就能触发现实中就是“凭空产生物料”模型错了。如果某一行在所有列中都没有 1说明这个库所永远得不到托肯是个死库所。这些检查不需要跑仿真看矩阵就能发现。更关键的是C 矩阵的秩和零空间能帮我们找“守恒关系”。比如原料总量在“待卸待检合格库位”之间流转理论上总量守恒这对应 C 的某个线性组合为零。如果算出来不守恒说明建模时漏了某个环节或者多加了弧。W 公司案例里质检环节有合格和不合格两条输出守恒关系就要分两条链分别验证这也是这份资料比一般示例细致的地方。3.2 用矩阵判断冲突与并发冲突和并发是 Petri 网分析的核心。判断方法很直接如果两个变迁共享同一个输入库所且该库所托肯数不足以同时满足两者就存在冲突。在 W 公司场景里“质检合格上架”和“质检不合格退货”共享质检后的托肯但一个托肯只能走一条路这就是典型的冲突结构。并发则是两个变迁各自有独立输入可以同时触发比如“卸货”和“另一批原料的质检”在资源充足时可以并行。下面这段代码用来检测冲突结构思路是遍历所有变迁对看它们是否有共同输入库所% 冲突检测找出共享输入库所的变迁对 conflicts []; for j1 1:nT for j2 j11:nT shared find(I(:,j1) I(:,j2)); % 共同输入库所 if ~isempty(shared) conflicts [conflicts; j1, j2, shared]; fprintf(变迁T%d与T%d存在冲突共享库所%s\n, ... j1, j2, num2str(shared)); end end end if isempty(conflicts) disp(未检测到冲突结构); end逻辑说明I(:,j1) I(:,j2)做逐元素逻辑与非零位置就是共同输入库所。参数说明这段代码假设弧权为 1如果实际有权重需要改成比较权重之和与库所托肯数。跑出来如果发现冲突对很多说明流程里资源争抢严重这正是优化的切入点——要么增加资源加叉车、加质检工位要么调整流程顺序减少争抢。3.3 从矩阵到瓶颈定位的完整链路光检测冲突还不够要定位瓶颈得结合托肯数和变迁触发频率。W 公司案例的做法是先给初始托肯分布比如待卸区 3 个托肯代表 3 车原料然后模拟触发统计每个变迁被触发的次数和每个库所的托肯积压量。积压最多的库所就是瓶颈所在。常见做法是用 Matlab 写一个简单的触发循环每次随机选一个可触发的变迁执行跑几千步后看统计。这里有个血泪经验初始托肯分布不能随便设。如果待卸区只给 1 个托肯整个系统可能一直串行执行看不出并发瓶颈给太多又可能瞬间淹没下游。合理的做法是参考 W 公司实际日均到货量折算成托肯数。资料里给的是按班次到货 3~5 车来设这个量级下冲突和积压都能显现出来又不至于让模型跑飞。4. Matlab 仿真让托肯流动起来看效率提升到底有多少4.1 仿真主循环怎么写仿真部分是把前面建好的模型“跑起来”。核心是一个 while 循环每轮找出所有可触发的变迁输入库所托肯数足够随机或按优先级选一个执行更新托肯分布记录数据。下面是可以直接用的主循环框架% 托肯演化仿真主循环 M [3;0;0;0;0]; % 初始托肯3车待卸其余为0 maxSteps 5000; history zeros(nP, maxSteps); triggerCount zeros(1, nT); for step 1:maxSteps history(:,step) M; enabled []; % 当前可触发的变迁 for j 1:nT if all(M I(:,j)) % 输入库所托肯足够 enabled [enabled, j]; end end if isempty(enabled) break; % 无变迁可触发系统停滞 end j enabled(randi(length(enabled))); % 随机选一个触发 M M C(:,j); % 更新托肯分布 triggerCount(j) triggerCount(j) 1; end fprintf(各变迁触发次数T1%d T2%d T3%d T4%d\n, triggerCount);逻辑说明M I(:,j)判断变迁 j 的所有输入库所是否都有足够托肯这是 Petri 网触发规则的标准实现。M M C(:,j)用关联矩阵一次性完成消耗和产生比手动加减更不容易出错。参数说明maxSteps 控制仿真长度太小统计不稳太浪费机时5000 步对这个小模型足够初始托肯 M 要根据实际到货量调整。跑完后 triggerCount 告诉你哪个变迁最忙history 可以画成托肯变化曲线。4.2 效率提升怎么量化仿真跑完要回答“优化后到底提升了多少”。W 公司案例用的是两个指标一是单位时间吞吐量总触发次数/仿真步数二是平均在制品数量各库所托肯数的时间平均。优化前质检环节是单工位冲突严重在制品积压多优化方案是增加一个质检变迁相当于加一个质检员模型里表现为 T2 拆成 T2a 和 T2b 并行。改完后重跑仿真吞吐量提升、积压在制品下降这就是量化论证。这里要注意仿真结果是随机的单次跑不能下结论。常见做法是跑 20 次取平均或者把随机种子固定下来做对比。资料里用的是固定种子 多次平均这样优化前后的差异才可信。如果你只跑一次就写“效率提升 30%”答辩时很容易被问住。4.3 把仿真结果画成能放进报告的图数据出来还得会表达。Matlab 画托肯变化曲线很直接下面这段代码把 history 画成堆叠面积图一眼能看出哪个库所积压% 绘制托肯分布变化图 figure; area(history); xlabel(仿真步数); ylabel(托肯数); legend(P1待卸,P2待检,P3合格暂存,P4库位,P5退货); title(W公司原料仓储流程托肯演化); grid on;逻辑说明history转置是因为 area 函数按列画堆叠转置后每列是一个库所的时间序列。参数说明legend 的标签要和库所定义一一对应别写错。这张图放进报告里比一堆数字直观得多评审一眼就能看到“待检区”那条带子最宽瓶颈在哪不言自明。5. 避坑与排查建模和仿真里最容易翻车的五件事5.1 现象仿真跑几步就停了提示无变迁可触发原因多半是某个库所初始托肯为 0而它又是下游变迁的唯一输入导致整条链断掉。比如 P2 待检区初始为 0T2 质检永远触发不了。解决检查初始托肯分布确保每条流程链的起点都有托肯或者确认是否有“凭空产生”的遗漏弧。我一般会在仿真前先打印一遍 I 和 O 矩阵肉眼过一遍每个变迁的输入输出是否合理。5.2 现象关联矩阵算出来某列全为正变迁不需要输入原因输出矩阵 O 写多了或者输入矩阵 I 漏写了。常见于复制粘贴时改错下标。解决逐个变迁核对业务逻辑——卸货必须有待卸原料质检必须有待检品没有输入的变迁在现实中就是“无中生有”。把 I 和 O 并排打印出来对照比盯着代码找快得多。5.3 现象优化后吞吐量反而下降原因加了一个并行变迁但共享资源没增加冲突转移到了别处。比如加了质检工位但上架叉车没加积压从待检区挪到了合格暂存区。解决优化要看全链路不能只盯一个环节。用仿真跑优化前后各库所的托肯曲线看积压是不是真的消失了还是只是换了个地方。这也是 Petri 网仿真的价值——它能把“按下葫芦浮起瓢”可视化。5.4 现象仿真结果每次都不一样没法对比原因用了随机触发且没固定种子或者仿真步数太少统计不稳。解决在代码开头加rng(42)固定随机种子对比实验用同一个种子仿真步数至少几千步让统计量收敛。如果要做严谨对比跑 20 次不同种子取均值报告里写“均值±标准差”比单次结果可信得多。5.5 现象模型库所太多关联矩阵大到看不懂原因一开始就追求细节把每个工位、每个缓冲区都建成独立库所。解决分层建模。先建粗模型验证主流程逻辑再对瓶颈环节单独精化。W 公司案例里入厂物流和厂内仓储是分开建子网再拼接的这样每个子网规模可控出了问题也容易定位。记住一句话模型是拿来算的不是拿来炫的能说明问题的最小模型就是最好的模型。6. 进阶技巧用不变量验证模型正确性以及一个我常犯的错前面讲的都是“怎么跑”这一章讲“怎么确认跑得对”。Petri 网有个很强的工具叫不变量分析P-不变量库所不变量能告诉你哪些库所的托肯总数守恒T-不变量变迁不变量能告诉你哪些变迁必须成组触发才能回到初始状态。对于 W 公司这种物料守恒的系统P-不变量是天然的校验器——原料总量在“待卸待检合格库位退货”之间应该守恒退货相当于退出主链如果算出来的不变量不满足这个关系模型一定有错。计算 P-不变量就是求关联矩阵 C 的零空间左零空间即解方程 ( y^T C 0 )。Matlab 里用null(C, r)可以求有理基。下面这段代码演示怎么求并解读% 求P-不变量左零空间 Pinv null(C, r); disp(P-不变量基); disp(Pinv); % 验证不变量与初始托肯的点积应守恒 for k 1:size(Pinv,2) val Pinv(:,k) * M; fprintf(第%d个不变量值%d\n, k, val); end逻辑说明null(C,r)求的是 C 转置的零空间结果每一列是一个 P-不变量。参数说明r表示求有理数基避免浮点误差。解读时如果某个不变量的非零分量正好对应“待卸、待检、合格、库位”四个库所且系数都为 1说明这四个库所的托肯总数守恒符合物料守恒预期。如果算出来的不变量系数出现负数或分数说明模型里有弧的方向或权重写反了。T-不变量则用来检查“有没有循环触发导致系统空转”。求法是解 ( C x 0 )Matlab 里null(C, r)。如果存在全正整数的 T-不变量说明系统可以回到初始状态是个良性循环如果只有全零解说明流程是单向的跑完就停。W 公司案例里退货后重新到厂那条弧T4 → P1会形成一个 T-不变量这代表退货返厂循环现实中要确认这个循环是否合理——如果退货直接退出系统这条弧就不该存在。说个我自己的教训。刚开始做这类建模时我总觉得不变量分析是“理论花架子”跑通仿真就行了。结果有一次答辩评委问“你怎么证明你的模型没有死锁”我答不上来因为仿真没停不代表没有潜在死锁只是初始托肯恰好绕过了。从那以后我每次建完 Petri 网模型都强制走一遍“关联矩阵 → P-不变量 → T-不变量 → 仿真”四步前两步花不了十分钟但能挡掉大部分逻辑错误。这份 W 公司的资料之所以值得细看就是因为它把这四步都走全了而不是只贴一段仿真代码了事。希望这套拆解能帮到你少走我当年走过的弯路。本文还有配套的精品资源点击获取

相关新闻

基于STM32F437ZG与PJ85718DM的暖通空调温度监测系统设计与实现

基于STM32F437ZG与PJ85718DM的暖通空调温度监测系统设计与实现

1. 项目缘起与整体设计思路温度监测这件事,看起来简单,真要做到"本地看得见、远程收得到、长期跑得稳",里面门道不少。我最近刚交付一个暖通空调控制柜的温度采集模块,用的就是 PJ85718DM 这颗 I2C 接口的数字温度传感器…

2026/10/11 1:15:22 阅读更多 →
5G基站硬件培训PPT怎么编?从设备拆解到安装避坑全指南

5G基站硬件培训PPT怎么编?从设备拆解到安装避坑全指南

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

2026/10/11 1:14:21 阅读更多 →
精益制造数字化转型三年规划:从数据采集到智能排产的落地路径

精益制造数字化转型三年规划:从数据采集到智能排产的落地路径

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

2026/10/11 1:14:21 阅读更多 →

最新新闻

幂等性保障:Tool 执行涉及扣减或下单时的全局分布式防重设计

幂等性保障:Tool 执行涉及扣减或下单时的全局分布式防重设计

最近带团队做面向企业级采购的 AI 智能体(Agent),接入了二十多个内部业务 Tool(函数调用)。上线第一周,风控部门就急匆匆找上门来:测试环境里,大模型在帮采购员下一笔办公耗材订单时…

2026/10/11 2:02:47 阅读更多 →
VC异步多线程Socket实战:从WSAEventSelect到IOCP的并发模型拆解

VC异步多线程Socket实战:从WSAEventSelect到IOCP的并发模型拆解

简介:这份资源面向具备一定VC基础的网络编程学习者与开发者,聚焦异步多线程Socket通信这一关键技术点,提供一套可直接运行的服务端与客户端完整示例。内容涵盖Winsock库调用、CAsyncSocket异步事件回调、CWinThread线程管理以及临界区等同步机…

2026/10/11 2:02:47 阅读更多 →
FTP上传进度条实现:基于transfercmd的实时回调与断点续传

FTP上传进度条实现:基于transfercmd的实时回调与断点续传

简介:这是一份面向C#开发者的FTP文件上传实例源码,聚焦于在文件传输过程中加入可视化进度反馈,解决传统上传操作缺乏交互提示、用户体验差的问题。资源包共35个文件,以cs源码、resx与resources资源文件、config配置、exe可执行程序…

2026/10/11 2:02:47 阅读更多 →
GLM-OCR自部署实战:从环境配置到私有化OCR服务搭建

GLM-OCR自部署实战:从环境配置到私有化OCR服务搭建

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

2026/10/11 2:02:47 阅读更多 →
芯片Code Review的苏格拉底式诘问:从RTL到流片的工程证伪

芯片Code Review的苏格拉底式诘问:从RTL到流片的工程证伪

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

2026/10/11 2:02:47 阅读更多 →
水下目标语义分割数据集工程实践:掩码格式、预处理与避坑指南

水下目标语义分割数据集工程实践:掩码格式、预处理与避坑指南

简介:一份面向水下目标识别与语义分割任务的数据集,适合计算机视觉研究者与算法学习者用于模型训练与评估。数据源自水下场景,图像统一为 640480 分辨率,分割前景包含人类、海草、珊瑚、岩石、鱼类等 8 类目标,背景以 …

2026/10/11 2:01:46 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23: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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →