银行排队系统实验报告:离散事件仿真与M/M/c窗口配置实战
简介这份银行排队系统实验报告面向计算机专业学生及数据结构初学者围绕“用队列模拟真实银行排队场景”这一经典实验展开帮助读者把抽象的数据结构知识落到可运行的C语言程序上。压缩包内共1个doc文件约191KB内容涵盖设计要求、实验目的、仪器与编译环境说明、设计思路、程序分析及运行界面记录并附有主函数、VIP认证、客户到达与离开等核心模块的源码片段。实验以Microsoft Visual C 6.0为编译环境通过时间函数模拟客户到达与离开的随机事件要求计算一天中客户在银行的平均逗留时间涉及队列、线性表、随机数生成与时间管理等知识点。读者可借此理解如何将现实问题转化为算法掌握菜单驱动、SWITCH分支、队列入队出队等实现思路并参考其中的排错与调试过程。目前已有901人学习适合作为课程实验报告模板或数据结构综合练习的参考。1. 银行排队系统实验报告从离散事件仿真到窗口配置的完整推演很多人第一次拿到「银行排队系统实验报告」这个题目第一反应是写个界面、画几个按钮、模拟叫号就交差。但真正做过的人知道这份报告的核心不是 UI而是离散事件仿真——把客户到达、排队等待、窗口服务、离开这一整套流程用数学模型跑出来再用数据回答一个实际问题开几个窗口最合理。它适合两类人一类是课程设计需要交实验报告的学生另一类是刚接触排队论、想用代码验证 M/M/c 模型的工程师。我见过太多报告只贴了代码和截图却没有把到达率 λ、服务率 μ、窗口数 c 这三个参数怎么定、怎么调、怎么验证讲清楚最后结论全靠拍脑袋。这篇笔记就按我实际做这类仿真的顺序把建模、实现、参数标定、结果验证和踩坑一次讲透让你拿到题目就能动手复现而不是对着空白文档发呆。2. 先立模型再写代码M/M/c 与离散事件仿真的分工2.1 为什么不能一上来就写 while 循环排队系统的本质是随机过程。客户到达时间间隔服从指数分布服务时长也服从指数分布这两个「随机」叠加在一起导致系统状态随时间跳变。如果直接写一个while循环按固定步长推进时间步长取大了会漏掉事件取小了计算量爆炸而且结果对步长极其敏感——这就是典型的「玄学调参」。正确做法是把时间推进方式换成事件驱动系统只在「有客户到达」或「有客户离开」这两个时刻改变状态其余时间什么都不做。这就是离散事件仿真DES的核心思想。M/M/c 是理论模型给出稳态下的平均排队长度、平均等待时间等解析解离散事件仿真则是数值实验用来验证理论、处理理论公式覆盖不了的复杂规则比如 VIP 优先、窗口异构、客户不耐烦离开。两者分工明确M/M/c 负责给出基准值和直觉仿真负责处理现实约束。实验报告里如果只写仿真没有理论对照结论缺乏说服力只写公式没有仿真又显得没有动手能力。所以我的习惯是先用 M/M/c 算一遍再用仿真跑一遍两者对得上报告才站得住。2.2 M/M/c 的关键公式与适用边界M/M/c 模型有三个前提到达过程是泊松过程到达间隔指数分布、服务时间指数分布、c 个服务台并行且共享一个队列。设到达率 λ人/小时单个窗口服务率 μ人/小时则系统利用率 ρ λ / (c·μ)。只有当 ρ 1 时系统才能稳定否则队列会无限增长——这是实验报告里必须检查的第一件事。几个常用指标指标含义计算依赖P0系统空闲概率λ, μ, cLq平均排队人数P0 及 ρWq平均排队等待时间Lq / λW平均逗留时间Wq 1/μL平均系统内人数λ · W这些公式在标准排队论教材里都能查到实验报告里不必重新推导但必须写清楚每个符号的物理意义和单位。我一般会在报告里放一张参数表把 λ、μ、c、ρ 以及算出来的 Wq 列在一起方便后面和仿真结果对照。注意M/M/c 假设队列容量无限、客户不会中途离开。如果仿真里加了「最多排 10 人满了就走」或「等超过 5 分钟就离开」理论公式就不再适用此时仿真结果才是唯一依据报告里要明确说明这一差异。2.3 离散事件仿真的三个核心组件不管用什么语言一个最小可用的排队仿真需要三样东西事件日历一个按时间排序的优先队列存放未来要发生的到达事件和离开事件。系统状态当前排队人数、各窗口忙闲、累计统计量总等待时间、总服务人数等。随机数生成器产生指数分布的到达间隔和服务时长。事件循环的逻辑是从日历取出最早事件 → 推进仿真时钟 → 根据事件类型更新状态 → 产生新的未来事件 → 循环直到仿真结束。下面这段 Python 代码就是一个最小实现我刻意去掉了花哨的封装方便你直接看懂每一步在干什么。import heapq import random def exp_time(rate): 生成服从指数分布的随机时间rate 为单位时间平均发生次数 return random.expovariate(rate) def simulate_bank(arrival_rate, service_rate, num_windows, sim_duration, seed42): random.seed(seed) # 固定随机种子保证实验可复现 events [] # 事件日历(时间, 事件类型, 客户编号) heapq.heappush(events, (exp_time(arrival_rate), arrival, 0)) free_windows num_windows # 空闲窗口数 queue [] # 排队客户列表存 (到达时间, 客户编号) total_wait 0.0 # 累计等待时间 served 0 # 已完成服务的客户数 customer_id 1 clock 0.0 while events: time, etype, cid heapq.heappop(events) if time sim_duration: break clock time if etype arrival: # 安排下一位客户到达 heapq.heappush(events, (clock exp_time(arrival_rate), arrival, customer_id)) if free_windows 0: free_windows - 1 # 直接开始服务安排离开事件 heapq.heappush(events, (clock exp_time(service_rate), departure, cid)) else: queue.append((clock, cid)) customer_id 1 elif etype departure: served 1 if queue: arrive_time, qid queue.pop(0) total_wait clock - arrive_time heapq.heappush(events, (clock exp_time(service_rate), departure, qid)) else: free_windows 1 avg_wait total_wait / served if served 0 else 0 return served, avg_wait, clock这段代码的逻辑说明heapq维护事件日历保证每次取出的都是最早发生的事件。到达事件里先安排下一位客户再判断有没有空闲窗口有则直接占用并安排离开事件没有则入队。离开事件里先看队列是否有人有人就让队首客户开始服务并累计其等待时间没人则释放窗口。参数方面arrival_rate和service_rate的单位必须一致都用「人/小时」或都用「人/分钟」sim_duration要足够长以消除初始瞬态影响seed固定后结果可复现方便报告里贴数据。2.4 参数标定λ 和 μ 到底怎么来实验报告最容易被质疑的地方就是参数来源。λ 和 μ 不能随便填常见做法有两种一是用真实观测数据做拟合比如统计某网点每小时到达人数取均值作为 λ 的估计二是题目给定那就直接引用并说明假设。μ 通常由平均服务时长换算比如平均每笔业务 4 分钟则 μ 15 人/小时。我一般会在报告里加一段敏感性说明λ 取 ±20% 波动时Wq 怎么变。这样即使参数估计有误差结论的稳健性也能体现出来。下面是一个快速标定和对照的脚本片段# 参数标定示例假设观测到平均每小时到达 40 人平均服务时长 5 分钟 lam 40 / 60 # 转换为每分钟到达率 mu 1 / 5 # 每分钟服务率 c 3 # 窗口数 rho lam / (c * mu) print(f利用率 rho {rho:.3f}) # 若 rho 1说明窗口不足系统不稳定需要增加 c 或降低 lam逻辑很直白先把单位统一到分钟再算 ρ。ρ 接近 1 时排队会急剧恶化这是排队系统的非线性特征报告里可以用不同 c 值跑一组对比来展示这个「拐点」。3. 把仿真跑成实验从单次运行到批量统计3.1 单次运行为什么不够离散事件仿真的输出是一个随机变量。同一组参数换一个随机种子平均等待时间可能差出 10% 以上。如果报告里只贴一次运行结果审阅的人完全可以质疑「你这是运气好」。正确做法是多次独立重复每次用不同种子然后报告均值和置信区间。我通常的做法是预热期丢弃前 10% 的仿真时长消除系统从空载开始的瞬态然后重复 30 次计算样本均值和 95% 置信区间。这样结论才有统计意义。3.2 批量实验的代码骨架下面这段代码在上一节仿真函数基础上做批量运行并输出统计量。注意它没有引入任何第三方统计库只用标准库就能算均值和标准差方便你在任何环境里跑。import math def batch_experiment(arrival_rate, service_rate, num_windows, sim_duration, replications30): waits [] for i in range(replications): served, avg_wait, _ simulate_bank( arrival_rate, service_rate, num_windows, sim_duration, seed1000 i ) waits.append(avg_wait) n len(waits) mean sum(waits) / n var sum((w - mean) ** 2 for w in waits) / (n - 1) std math.sqrt(var) ci_half 1.96 * std / math.sqrt(n) # 95% 置信区间半宽 return mean, std, (mean - ci_half, mean ci_half) # 对比不同窗口数下的平均等待时间 for c in [2, 3, 4, 5]: mean, std, ci batch_experiment(40/60, 1/5, c, sim_duration480) print(f窗口数{c}, 平均等待{mean:.2f} 分钟, 95%CI{ci[0]:.2f}~{ci[1]:.2f})逻辑说明replications控制重复次数30 次是课程实验的常用下限sim_duration480表示仿真 8 小时一个工作日置信区间用正态近似样本量 30 时足够。参数调整上如果发现置信区间过宽说明重复次数不够或仿真时长太短可以加到 50 次或 960 分钟。3.3 结果对照仿真 vs 理论拿到批量结果后和 M/M/c 公式算出的 Wq 做对照。如果偏差在置信区间内说明仿真实现正确如果偏差很大优先检查三件事单位是否统一、预热期是否丢弃、排队规则是否和理论假设一致。我一般会在报告里放一张对照表窗口数 c理论 Wq分钟仿真均值分钟95% 置信区间是否吻合2偏高或不稳定——ρ≥1不适用3计算值仿真值区间是/否4计算值仿真值区间是/否这张表是实验报告的核心证据比任何文字描述都有力。3.4 窗口配置的决策逻辑实验的最终目的是回答「开几个窗口」。决策不能只看平均等待时间还要看成本和客户流失。常见做法是设定一个服务水平目标比如「90% 的客户等待时间不超过 5 分钟」然后找满足条件的最小 c。这个指标叫 P(Wq ≤ 5min)仿真里可以直接统计def wait_probability(arrival_rate, service_rate, num_windows, sim_duration, threshold, replications30): 统计等待时间不超过 threshold 的客户比例 total, within 0, 0 for i in range(replications): # 这里需要仿真函数返回每个客户的等待时间列表 # 为简洁起见假设 simulate_bank 已改为返回 waits_list pass return within / total if total 0 else 0实际实现时把simulate_bank里的total_wait改成记录每个客户的等待时间列表即可。参数threshold就是服务水平阈值单位与仿真时间一致。这个指标比平均值更贴近管理决策报告里加上它结论会更有说服力。4. 避坑与排查实验报告里最容易翻车的五个地方4.1 利用率 ρ ≥ 1 却还在解读等待时间现象仿真跑出来平均等待时间特别大或者随时间持续增长不收敛。原因λ / (c·μ) ≥ 1系统不稳定队列理论上会无限增长任何「平均等待时间」都没有意义。解决先算 ρ确认小于 1 再跑仿真如果题目给定的参数导致 ρ ≥ 1必须在报告里指出系统不可稳定并建议增加窗口或分流。4.2 忘记预热期初始空载拉低均值现象仿真刚开始时等待时间很低整体均值被拉低和理论值对不上。原因系统从「零客户」开始前一段时间属于瞬态不代表稳态行为。解决丢弃前 10%~20% 仿真时长的数据或者从「系统已处于稳态」的初始状态开始。报告里要写明预热期长度和依据。4.3 单位不统一导致参数数量级错误现象ρ 算出来是 0.006 或者 600 这种离谱值。原因λ 用「人/小时」μ 用「人/分钟」没换算。解决所有时间参数统一到同一单位代码里加注释标明单位。我习惯在变量名里带单位比如lam_per_min、mu_per_min虽然啰嗦但能救命。4.4 随机种子固定后只跑一次就下结论现象换一台机器或换一个种子结果差异很大结论不可复现。原因单次运行只是随机过程的一个样本。解决批量重复 30 次以上报告均值和置信区间。固定种子只是为了调试方便最终结果必须基于多次独立运行。4.5 排队规则和理论假设不一致却硬套公式现象仿真里加了 VIP 优先或客户不耐烦离开却拿 M/M/c 公式对照发现对不上。原因M/M/c 假设 FIFO 且无放弃规则一变理论就不适用。解决要么简化仿真规则使其匹配理论要么明确说明理论仅作参考、仿真才是主要依据。报告里把假设列清楚比强行解释更可信。5. 进阶技巧用方差缩减和可视化把报告质量拉高一档5.1 公共随机数法让不同窗口配置的对比更公平批量实验里不同 c 值如果各跑各的随机种子差异里混入了随机噪声对比不够干净。公共随机数法Common Random Numbers的做法是让不同 c 值在每次重复中使用相同的到达间隔和服务时长序列。这样窗口数带来的差异就是纯粹的配置差异置信区间更窄结论更锐利。实现上把随机数生成器按重复次数索引而不是按仿真内部调用顺序消耗。简单做法是每次重复前用random.seed(base_seed i)重置然后所有 c 值共用这个种子。注意这要求仿真函数内部不额外消耗随机数否则序列会错位。我一般会在报告里注明使用了公共随机数法这是区分「随便跑跑」和「认真做实验」的一个细节。5.2 用 matplotlib 画等待时间分布而不是只报均值均值会掩盖分布形态。同样平均等待 3 分钟一种是大多数人等 1 分钟、少数人等 20 分钟另一种是均匀分布在 0~6 分钟客户体验完全不同。报告里加一张等待时间直方图或累积分布函数CDF图能直观展示尾部风险。import matplotlib.pyplot as plt # 假设 waits_list 是某次仿真中所有客户的等待时间列表 waits_list [0.5, 1.2, 0.8, 3.5, 2.1, 0.3, 5.6, 1.8, 0.9, 2.4] plt.hist(waits_list, bins20, edgecolorblack, alpha0.7) plt.xlabel(等待时间分钟) plt.ylabel(客户数) plt.title(等待时间分布) plt.savefig(wait_distribution.png, dpi150)参数说明bins控制柱子数量数据量少时取 10~20数据量大时取 30~50dpi影响输出清晰度报告里用 150 足够。如果要做 CDF 图把hist换成ecdf或手动排序后累加即可。这张图配合 90 分位等待时间一起写进报告比单说「平均等待 3 分钟」有信息量得多。5.3 敏感性分析找出最影响结论的那个参数实验报告的价值不只在于「c4 最好」还在于「这个结论对哪些假设敏感」。做法是让 λ、μ、c 分别在 ±10%、±20% 范围内变动观察 Wq 和 P(Wq ≤ 5min) 的变化幅度。变化最大的那个参数就是关键参数报告里要重点讨论其估计精度。我一般会跑一个简单的网格参数变动Wq 变化结论稳健性λ 20%显著上升对到达率敏感μ -10%上升对服务效率敏感c 1明显下降窗口数是强杠杆这张表能让读者一眼看出「哪个参数不能估错」。如果 λ 的敏感性最高而 λ 又是观测估计的那报告里就要说明观测时长是否足够、是否有高峰时段未单独建模。5.4 一个我踩过的坑别把仿真时长当成客户数早期我做实验时把sim_duration设成 480 分钟以为能服务 480 个客户结果发现服务人数远小于这个数。原因是客户到达是随机的而且服务时间也占时间系统容量受 ρ 限制。后来我改成先估算「预期到达人数 λ × sim_duration」再根据 ρ 估算实际完成服务人数报告里的样本量说明才准确。这个细节虽小但审阅的人如果较真会直接影响对实验严谨性的判断。5.5 报告里值得保留的最小数据集最后说一个习惯不管报告写多长我都会在附录里保留一份最小数据集——参数表、每次重复的汇总结果、以及生成这些结果的完整脚本。这样别人想复现不需要读完全文直接跑脚本就能得到同样的表。实验报告的本质是可复现的实验记录不是作文。把随机种子、预热期、重复次数、单位约定这四样写清楚比任何华丽的可视化都重要。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

微积分基础复习:从极限到积分的核心知识梳理

微积分基础复习:从极限到积分的核心知识梳理

项目标题: 微积分基础复习 项目正文: (用户未提供) 关键词: (用户未提供) 摘要描述: (用户未提供)你好,我已经收到了你的项目标题“微积分基础复习”。不过,要写出一篇真正对你有用、…

2026/10/13 11:43:20 阅读更多 →
遥感影像匀色镶嵌分幅处理:打造可复用生产流水线

遥感影像匀色镶嵌分幅处理:打造可复用生产流水线

简介:这份资源是一份关于遥感影像匀色、镶嵌与分幅处理操作方法的完整技术手册,主要面向从事遥感影像处理、GIS应用及测绘相关工作的技术人员。内容以MCM智拼图V8软件为主线,系统讲解了从新建工程、图层管理、匀色预处理、色彩校正到自动镶嵌…

2026/10/13 11:43:20 阅读更多 →
边缘AI+精准灌溉:破解作物根系缺氧难题的实战指南

边缘AI+精准灌溉:破解作物根系缺氧难题的实战指南

根系缺氧这事,做设施农业的人多少都遇见过,但多数人根本没往智能化那想。我最初接触TerraBreathe这个项目时,目标其实很朴素:别让棚里的作物因为浇水过勤、基质板结或者管道堵塞,根先憋死了。但干着干着就发现&#xf…

2026/10/13 11:43:20 阅读更多 →

最新新闻

AI写作成本怎么降?率零降流程拆解与批量生产实操指南

AI写作成本怎么降?率零降流程拆解与批量生产实操指南

第一次看到“率零降AI教程”这个说法的时候,我第一反应是标题党。市面上号称白菜价的AI写作课太多了,点进去基本都是把公开提示词换个包装,真正能落地的东西少得可怜。后来被一个做内容代运营的朋友拉着一起跑了整套流程,才明白标…

2026/10/13 12:20:16 阅读更多 →
Tye 多仓库(Multirepo)编排:跨仓库引用 tye.yaml 与 Git 依赖的完整指南

Tye 多仓库(Multirepo)编排:跨仓库引用 tye.yaml 与 Git 依赖的完整指南

开发工具微服务云原生CLI 【免费下载链接】tye Tye is a tool that makes developing, testing, and deploying microservices and distributed applications easier. Project Tye includes a local orchestrator to make developing microservices easier and the ability to …

2026/10/13 12:20:16 阅读更多 →
抖音无水印批量下载完整指南:从单个视频到直播的四类实战场景

抖音无水印批量下载完整指南:从单个视频到直播的四类实战场景

抖音无水印批量下载完整指南:从单个视频到直播的四类实战场景 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallbac…

2026/10/13 12:20:16 阅读更多 →
机械硬盘异响排查与修复:西数Data Lifeguard检测全攻略

机械硬盘异响排查与修复:西数Data Lifeguard检测全攻略

半夜三更,机箱里突然传来一声清脆的“咔哒”,紧接着又是几声,你瞬间从椅子上坐直,脑子里闪过四个字:硬盘完了。说真的,凡是用过机械硬盘的人,多少都被这种声音吓过。尤其是西部数据的盘&#xf…

2026/10/13 12:20:16 阅读更多 →
Flutter鸿蒙适配实践:Skia渲染引擎原理与踩坑指南

Flutter鸿蒙适配实践:Skia渲染引擎原理与踩坑指南

去年我在一家中厂做跨端基建,内部有个工具必须跑在同一套自研终端上,顺手把 Flutter 也编译了过去。当时没想太多,以为换个 SDK、改个入口就完了,结果被渲染链路里一个引擎逼着啃了整整两周,那个引擎就是 Skia 渲染引擎…

2026/10/13 12:20:16 阅读更多 →
Linux终端复用工具 screen 详解:SSH断线任务不丢失

Linux终端复用工具 screen 详解:SSH断线任务不丢失

1. 没有screen之前,远程任务是怎么丢的 1.1 一次断网事故的复盘 先交代一个我自己的翻车现场。前几年有一次在服务器上跑一个数据迁移任务,大概要跑两三个小时,文件数量几十万个,我直接用SSH连着服务器,前台执行脚本&…

2026/10/13 12:19:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →