两阶段鲁棒优化CCG与Benders代码实战:原理、实现与避坑
简介这份代码包围绕两阶段鲁棒优化中的CCG列与约束生成及Benders分解算法面向使用MATLAB与YALMIP的研究者和工程师既适合快速复现原论文基线也便于按实际决策场景扩展改编。压缩包共5个文件、体积1.44MB含3篇PDF文献与2个MATLAB脚本文献涵盖CCG与Benders对比、两阶段鲁棒优化求解方法以及Benders分解算法综述脚本则提供可运行的案例代码实现主问题构建、切割生成与迭代求解的完整链路。资源已有2287人学习下载在鲁棒优化与分解算法主题上具备较好的实践参考热度。通过学习包内代码与配套文献读者可掌握在YALMIP中搭建两阶段主从问题框架、利用CCG/Benders生成最优割并识别最坏场景的关键思路继而将原论文方法迁移至新能源出力、供应链需求等含不确定参数的优化问题中为后续算法对比和工程落地提供可复现基础。1. 两阶段鲁棒优化的CCG与Benders代码包拿到就能跑但先搞懂割长什么样做过两阶段鲁棒优化的人应该都有体会模型写出来不难难的是把CCG或Benders的迭代循环跑通并让结果能复现原论文的数值。这套带MATLABYALMIP源码和对比文献的压缩包解决的就是“从论文公式到可运行代码”这段最磨人的路。它不是一个教学Demo而是把两阶段鲁棒优化里两个主流求解框架——列与约束生成CCG和Benders分解——做成了可以直接改参数、换模型、对结果的可扩展脚本。适合正在写相关论文的研究生也适合要把确定性优化改成鲁棒模型的工程师。一个反直觉的结论先放在这里CCG和Benders看起来是两条完全不同的技术路线但实际上它们共用同一个“主问题-子问题”迭代骨架差别只在“切割”的构造方式理解这一点改造代码能少走一半弯路。2. CCG列与约束生成主问题-子问题迭代与YALMIP代码骨架2.1 CCG为什么快列生成与约束生成的双重含义两阶段鲁棒优化的一般形式是 min cᵀx max_{u∈U} min_{y∈F(x,u)} dᵀy第一阶段变量x要现在拍板第二阶段变量y要等不确定参数u实现后再调整。CCG的思路非常直接不要试图遍历连续的不确定集U而是维护一个“已发现的极端场景”集合每轮找到当前最坏的那个u*把它对应的第二阶段变量和约束整组塞进主问题。这里有个关键点CCG同时在做列生成和约束生成。主问题每加入一个新场景u*就会新增一组第二阶段变量y^k这是“列”同时新增这组变量对应的约束需求满足、容量限制、与θ的连线这是“约束”。因为不确定集的极值一定发生在顶点上线性目标函数在凸多面体上取极值必在顶点所以每轮找出的u*都是一个个顶点主问题不断增强对“最坏情况”的描述。相比传统Benders只往主问题丢一条对偶割CCG牺牲了主问题的规模换来了更紧的下界通常迭代次数明显更少。2.2 CCG主问题与最坏场景搜索可直接修改的YALMIP实现下面用一个小规模的设施选址加不确定需求运输问题演示CCG主循环。问题设定是I个候选设施建设成本cᵢ容量capᵢJ个客户需求uⱼ在基准值上下波动第二阶段决策是从设施i到客户j的运输量yᵢⱼ单位成本dᵢⱼ。第二阶段目标是最小化运费整体目标是在最坏需求下最小化“建设成本运费”。% demo_ccg_2stage.m % 两阶段鲁棒优化CCG 主循环YALMIP MILP 求解器 % 模型设施选址 不确定需求运输 % 第一阶段0/1 决策是否建设施 % 第二阶段满足需求的最小运费 nI 2; % 设施数 nJ 3; % 客户数 c [50; 60]; % 建设成本 cap [10; 10]; % 设施容量 d [1 2 3; 2 1 2]; % 单位运费d(i,j) U0 [4; 5; 6]; % 需求基准值 Delta [2; 2; 2]; % 需求波动范围 % 盒式不确定集顶点枚举2^3 8 个节点 vertices []; for u1 [U0(1)-Delta(1), U0(1)Delta(1)] for u2 [U0(2)-Delta(2), U0(2)Delta(2)] for u3 [U0(3)-Delta(3), U0(3)Delta(3)] vertices [vertices, [u1; u2; u3]]; end end end U_scen U0; % 初始场景用基准值 LB -inf; UB inf; tol 1e-3; Kmax 20; for k 1:Kmax % 主问题 MP x binvar(nI, 1); % 是否建设施 theta sdpvar(1, 1); % 第二阶段成本上界 cons [sum(x) 1]; % 至少建一个设施 obj c*x theta; for s 1:size(U_scen, 2) % 每个已发现场景加一组变量 y sdpvar(nJ, nI, full); cons [cons, sum(y, 2) U_scen(:, s)]; % 需求等式 cons [cons, sum(y, 1) cap .* x]; % 容量上限 cons [cons, y 0]; cons [cons, theta sum(sum(d .* y))]; % θ吃掉运费 end optimize(cons, obj, sdpsettings(solver, gurobi, verbose, 0)); x_val value(x); theta_val value(theta); LB c*x_val theta_val; % 下界主问题最优值 % 子问题 SP固定 x找最坏需求 best_sp -inf; u_star U0; for vidx 1:size(vertices, 2) u vertices(:, vidx); y sdpvar(nJ, nI, full); cons_sp [sum(y, 2) u; sum(y, 1) cap .* x_val; y 0]; optimize(cons_sp, sum(sum(d .* y)), ... sdpsettings(solver, gurobi, verbose, 0)); sp_val value(sum(sum(d .* y))); if sp_val best_sp best_sp sp_val; u_star u; end end UB min(UB, c*x_val best_sp); % 上界不断收紧 fprintf(iter %2d, LB%.4f, UB%.4f, gap%.6f\n, ... k, LB, UB, (UB-LB)/UB); if (UB - LB) / abs(UB) tol break; end if ismember(U_scen, u_star, rows) break; % 场景重复已经收敛 end U_scen [U_scen, u_star]; end这段代码里最需要理解的是主问题里的θ约束。θ被设计成“所有已发现场景下运费的最大值”所以θ≥dᵀy^k对每个场景k都要成立MP的目标cᵀxθ就是在最小化“建设成本最坏运费”。子问题则是固定x_val后在盒式不确定集顶点上枚举找出让最小运费最大的那个需求场景u*这个u*下一轮会被追加进主问题。参数里tol控制收敛精度Kmax是最大迭代次数实际跑的时候建议先看gap变化曲线再决定要不要加大Kmax。一个很容易忽略的细节solver我写的是gurobi如果本机没有装YALMIP会自动找可用求解器但binvar变量必须有MILP求解器才能处理。MATLAB自带的intlinprog也能跑把sdpsettings里的solver改成intlinprog即可代价是求解速度慢一些模型调通后建议换商用求解器。3. Benders分解落地对偶割的推导与迭代实现3.1 从max-min到对偶问题Benders割是怎么来的Benders分解不像CCG那样往主问题里塞整个场景的第二阶段变量而是把第二阶段问题取对偶形成一条只含第一阶段变量x和对偶变量的线性约束。这条约束叫Benders最优性割它的作用是在主问题里给θ一个不断收紧的下界。核心推导是这样的对固定的x和u第二阶段内层min问题是一个线性规划取对偶后目标函数变成λᵀu - μᵀ(cap ⊙ x)其中λ是需求等式的对偶变量μ是容量不等式≤约束的对偶变量。因为对偶变量只依赖对偶约束而不依赖x所以对任何新的x(λ*, μ*)仍然可行于是 λᵀu- μᵀ(cap ⊙ x) 始终是第二阶段最优值的一个下界。把这个下界做成主问题里θ的约束就得到了Benders割。每一轮从子问题里捞出一组(λ, μ*, u*)就能给主问题加一条比上一轮更紧的割。3.2 Benders主问题与割累积一套比CCG更省的MPBenders的主问题里只有x和θ外加一堆累积的割不等式变量规模远小于CCG的主问题这是它处理大规模问题的本钱。下面是同一选址问题的Benders循环SP部分仍然枚举盒式顶点但重点是从约束句柄里取出对偶变量。% demo_benders_2stage.m % Benders 分解主循环同一套设施选址问题 % 延续上一节的 nI/nJ/c/cap/d/U0/Delta/vertices 定义 x binvar(nI, 1); theta sdpvar(1, 1); cons0 [sum(x) 1, theta 0]; % θ 先给一个平凡下界 cuts []; % 累积割的 cell for k 1:Kmax cons cons0; for t 1:length(cuts) lam cuts(t).lam; u cuts(t).u; mu cuts(t).mu; % Benders 最优性割θ ≥ λ*u - μ*(cap ⊙ x) cons [cons, theta lam*u - mu*(cap .* x)]; end optimize(cons, c*x theta, ... sdpsettings(solver, gurobi, verbose, 0)); x_val value(x); theta_val value(theta); LB c*x_val theta_val; % SP固定 x 枚举顶点找最坏场景并取对偶 best_sp -inf; for vidx 1:size(vertices, 2) u vertices(:, vidx); y sdpvar(nJ, nI, full); cons_sp [sum(y, 2) u; sum(y, 1) cap .* x_val; y 0]; optimize(cons_sp, sum(sum(d .* y)), ... sdpsettings(solver, gurobi, verbose, 0)); sp_val value(sum(sum(d .* y))); if sp_val best_sp best_sp sp_val; u_star u; % 取出需求等式和容量约束的对偶变量 lam dual(cons_sp(1)); mu dual(cons_sp(2)); end end UB min(UB, c*x_val best_sp); cuts(end1) struct(lam, lam, u, u_star, mu, mu); fprintf(iter %2d, LB%.4f, UB%.4f, gap%.6f\n, ... k, LB, UB, (UB-LB)/abs(UB)); if (UB - LB) / abs(UB) tol break; end end注意dual的提取顺序非常严格它只认你在cons_sp里写约束时的排列顺序cons_sp(1)是需求等式对应λcons_sp(2)是容量不等式对应μ。建模顺序一变对偶变量就全错了这是Benders实现里最容易翻车的点。另外Benders的主问题在不含任何割的时候θ没有上界约束目标函数会把θ往负无穷推所以我在cons0里加了theta 0作为平凡的初始下界否则第一轮MP就可能异常。实际对比起来Benders的主问题变量少每轮只加一条约束计算很快但它的割相对“松散”经常要迭代几十轮才收敛而CCG往往十几轮就停了。这也是为什么现在主流的两阶段鲁棒文献更偏爱CCG。4. CCG与Benders如何选收敛速度、割类型与模型规模的取舍4.1 两种割的本质差异几何视角与文献结论从几何上看CCG和Benders都在做同一件事用一个逐步精细化的多面体去逼近第二阶段值函数。Benders的割是从对偶空间投影下来的支撑超平面每轮加一个主问题始终是个小规模LP/MILPCCG则是直接把不确定场景对应的原始变量和约束整个投射进主问题相当于把值函数的关键点连同局部结构一起复制进来。文献里的共识是CCG的收敛速度在迭代轮数上几乎总是优于Benders尤其是在第二阶段子问题约束较多的模型中CCG往往用不到Benders一半的迭代次数就达到同样gap。但代价是CCG主问题的规模随场景数线性膨胀当第二阶段变量本身很多时主问题会变得非常庞大。Benders恰好相反每轮割很廉价主问题长期保持精简适合割数量能控制在可接受范围的大规模问题。实践里还发现一个规律当不确定集维数低、第二阶段LP规模适中时Benders的累积求解时间可能反而占优而当不确定集结构复杂、需要少轮次快速收敛时直接选CCG。4.2 适用场景对照表与选型建议对比项CCG列与约束生成Benders 分解割的内容完整场景变量约束一条对偶线性不等式主问题规模增长快每轮加一组y和约束慢每轮只加一条割典型迭代轮数少通常520轮多常需数十轮子问题处理只需解内层min找最坏场景必须取对偶变量生成割第二阶段变量多主问题膨胀求解变慢割仍然是一维影响小实现与调试难度低直观中对偶提取易出错适合场景论文复现、中小规模、快速收敛大规模LP结构、MP必须精简我自己的选型习惯是复现论文阶段先写CCG因为它的子问题只用求最优值不需要对偶变量代码出错率低等模型定型、确需要推到很大规模时再改成Benders。反过来一开始就写Benders容易在dual提取和割正负号上浪费大量时间。5. 复现避坑指南五个让两阶段模型翻车的常见错误5.1 MP有界但gap长期不降现象主问题每轮都在正常求解LB和UB各自变化但gap卡在某个值附近震荡达到设定迭代上限还没收敛。原因通常是两个一是子问题找到的u其实已经出现过但主问题重复添加同一场景变量重复但θ并不变紧二是MP和SP的求解器容差设置不一致MP用默认1e-7SP用1e-6两边数值精度互相拉扯。解决方法是加场景去重判断代码里用ismember(U_scen, u_star, rows)检查u是否已存在同时把tol设为1e-3到1e-4之间并在MP和SP的sdpsettings里显式设置一样的求解器容差。5.2 求解器报“No suitable solver”现象明明装了MATLAB模型也建好了一运行就提示找不到可用的求解器或者提示MILP问题需要MILP求解器。原因YALMIP默认的求解器搜索列表里没有能处理binvar的求解器很多人装了gurobi却没在YALMIP里配置路径或者本机只有linprog这类连续LP求解器。解决临时改用MATLAB自带intlinprogsdpsettings(solver,intlinprog)长期则是正确安装并配置gurobi或cplex的YALMIP接口。注意intlinprog能解MILP但大规模时性能差距明显调通后尽快换。5.3 SP无界或者MP给出荒谬的x现象SP求解器返回“problem is unbounded”或者主问题求出的x明显不合理比如一个设施都不建导致第二阶段无可行解。原因子问题里某些需求顶点在当前x下根本满足不了运输问题不可行对偶问题自然无界更深一层是主问题的容量约束没有和第一阶段x耦合好比如cap ⊙ x在某些维度上为0而对应需求又必须被满足。解决在SP里加人工松弛变量并赋予大惩罚系数优先保证SP永远有界同时在MP里加总容量约束比如sum(cap .* x) max(sum(vertices))从根上杜绝不可行。5.4 dual读出来是空的现象Benders代码运行到dual(cons_sp(1))时报错提示dual extraction不可用或者返回的变量里全是NaN。原因YALMIP不是对所有求解器都支持dual提取有些开源求解器或intlinprog不会回传对偶信息另一个常见原因是约束句柄顺序和建模顺序不一致取到了错误的约束。解决先用check(cons_sp)确认对偶可行性更换支持对偶提取的求解器比如gurobi、cplex、mosek同时严格按建模顺序记录约束句柄最好在注释里标明第几个约束对应哪个对偶变量。5.5 把代码套进自己的模型后维度对不上现象按照压缩包里的模板改数据结果主问题报维度不匹配或者SP里sum(y, 2)和u的长度对不齐。原因资源包的代码是面向原论文的特定模型结构客户数、设施数、约束排列都写死在脚本里直接替换数据不会自动适配新结构。解决把nI、nJ、cap、U0、Delta这些全部抽成参数结构体凡是尺寸相关的循环一律用size()动态获取特别要注意需求等式sum(y,2)是按客户维度汇总容量约束sum(y,1)是按设施维度汇总两个方向的维度含义千万别搞反。6. 参数调优与收敛验证把CCG脚本改造成你自己的模型拿到资源包之后直接改数据是最低效的用法。我一般会把主问题和子问题分别封装成函数输入一个data结构体输出x和u*这样换模型时只需要动数据定义和约束行。data.c、data.cap、data.d、data.U0、data.Delta放进去函数内部用length(data.U0)获取维度所有约束用循环生成而不是手写固定下标。改造的第一个验证点是让子问题目标值和你手算的某个确定场景一致把不确定集固定成基准值U0跑一遍SP如果运费不等于手算结果说明约束方向或者sum维度有问题。收敛验证方面我习惯在迭代循环里保存每一轮的LB、UB和x_val退出循环后画三条曲线LB曲线、UB曲线、gap曲线。三张图能直接看出算法是卡在割质量上还是卡在数值容差上。如果LB曲线一直不动多半是主问题里θ的约束不够紧检查新场景是否真的加了进去如果UB曲线波动很大则是SP每轮找到的最坏场景不稳定通常是顶点枚举时漏了某些顶点或者不确定集定义有误。另外有一个容易被忽视的参数初始场景的选择。资源包代码用U0做初始场景这在很多模型里足够但如果不确定集的波动范围很大从U0出发会浪费好几轮迭代。我通常会同时尝试全上界、全下界、基准值三个初始场景对比总迭代轮数选效果最好的作为默认值。这个操作就几行代码但对收敛速度的影响往往很显著。最后说一个我自己踩过的坑CCG代码调通后直接拿去跑大规模数据J增到15以上时顶点枚举会爆炸2^15个顶点根本枚举不完。遇到这种情况把盒式集改成预算不确定集SP不必枚举顶点而是解一个带排序逻辑的线性规划或者直接对偶后按λ符号定界。从那以后我每次拿到新的两阶段鲁棒问题都先确认不确定集结构再决定SP用枚举还是解析法这个习惯帮我省掉了大量无效迭代。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Git身世揭秘:从版本控制到分布式快照的秒懂指南

Git身世揭秘:从版本控制到分布式快照的秒懂指南

1. 从“秒懂”说起:为什么Git值得被讲清楚很多人第一次接触版本控制,脑子里冒出来的画面大概是这样的:一堆文件夹,名字叫“最终版”“最终版2”“最终版真的不改了”“这个才是最后一版”,然后某天想找回三天前删掉的一…

2026/10/18 18:42:01 阅读更多 →
Optimus3技术解析:从原型到2027量产的具身智能之路

Optimus3技术解析:从原型到2027量产的具身智能之路

特斯拉的Optimus机器人最近又成了热点,不过这次刷屏的不是新原型机亮相,而是围绕Optimus3优化方向与2027年量产节点的集中讨论。作为把大模型、机械本体和制造工艺绑在一起做“具身智能”的典型样本,Optimus3的每一次改动其实都在回答同一个问…

2026/10/18 18:42:01 阅读更多 →
摩根士丹利预警2026:AI巨变与组织准备度缺口

摩根士丹利预警2026:AI巨变与组织准备度缺口

1. 这条预警到底在说什么先把标题拆开看。摩根士丹利发出罕见预警,时间节点锁定在2026上半年,对象是AI,结论是“一场大多数人没准备好的巨变”。这四个要素拼在一起,其实指向的不是某个具体产品的发布,而是一个系统性拐…

2026/10/18 18:42:01 阅读更多 →

最新新闻

Java Web门诊管理系统源码拆解:从Spring Boot到预约挂号全流程

Java Web门诊管理系统源码拆解:从Spring Boot到预约挂号全流程

简介:基于Java实现的智慧医院门诊管理系统,面向Java Web学习者、毕业设计与课程设计人群,聚焦医疗服务数字化与自动化。系统覆盖预约挂号、就诊记录、药品管理、医生排班等模块,串联Spring、Hibernate/MyBatis、MVC、RESTful API等…

2026/10/18 19:21:20 阅读更多 →
亿图图示 EdrawMax 6.8 绿色便携版:免安装流程图工具从解压到出图全攻略

亿图图示 EdrawMax 6.8 绿色便携版:免安装流程图工具从解压到出图全攻略

简介:亿图图示EdrawMax 6.8中文绿色便携版面向需要频繁绘制流程图、组织结构图、思维导图与工程图的职场人士、学生及设计爱好者,免安装、不写注册表,可直接在U盘或移动硬盘运行,解决多设备切换时无法快速使用专业绘图工具的问题。…

2026/10/18 19:21:20 阅读更多 →
红色视差CSS网页模板:从原理到实战的完整指南

红色视差CSS网页模板:从原理到实战的完整指南

简介:红色视差CSS网页模板面向网页设计师与前端初学者,提供一套以红色为主色调、融合视差滚动效果的完整静态站点方案,可用于个人作品集、企业展示页或活动专题页的快速搭建。压缩包共81个文件,约1.17MB,包含49个png、…

2026/10/18 19:21:20 阅读更多 →
模型训练可视化实战:从TensorBoard埋点到看懂loss、梯度与实验管理

模型训练可视化实战:从TensorBoard埋点到看懂loss、梯度与实验管理

你有没有遇到过这种情况:模型在服务器上跑了两天,终端里一个epoch一个epoch地打日志,loss肉眼可见地往下走,可最后测出来的准确率反而不如一个随手跑的baseline。你怀疑是学习率没调好,想回头查第几轮开始出了问题&…

2026/10/18 19:21:20 阅读更多 →
RAG分块调优指南:从参数决策到评测脚本,把召回率从30%提到70%

RAG分块调优指南:从参数决策到评测脚本,把召回率从30%提到70%

RAG项目做久了,你会发现一个很扎心的规律:检索召回效果差,大家第一反应是换 Embedding 模型、调向量检索的 TopK、甚至重写提示词,但真正拖后腿的,往往是没人愿意多看一眼的分块逻辑。我见过好几个项目,召回…

2026/10/18 19:21:20 阅读更多 →
Tomcat 8.5.100 安装配置避坑指南:JDK 11+ 兼容性与等保HTTPS实战

Tomcat 8.5.100 安装配置避坑指南:JDK 11+ 兼容性与等保HTTPS实战

简介:本资源为 Apache Tomcat 8.5.100 官方发行版 Linux/Unix 平台二进制包(tar.gz 格式),面向 Java Web 开发初学者、后端工程师及运维人员,用于快速部署 Servlet/JSP 应用、学习容器配置与生产级调优。压缩包共 623 …

2026/10/18 19:20:20 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →