Java手写单纯形法实现:从标准型转换到两阶段求解
简介本资源是一份面向计算机专业学生与运筹学初学者的Java线性规划算法实现项目聚焦于将运筹学核心优化理论落地为可运行、可调试的编程实践。项目完整实现了标准型转化、人工变量引入及两阶段单纯形法求解逻辑覆盖建模、标准化、可行解搜索与最优解计算全流程适用于课程设计、算法课设及数学建模辅助开发场景。压缩包共11个文件13KB含2个核心Java源码LP.java、Main.java、2个编译后class文件、5个XML配置与IDE配置文件如idea/workspace.xml、misc.xml、1个iml模块定义及1个.gitignore结构清晰体现工程化组织思路。已有3477人学习下载读者可直接导入IDE运行控制台交互程序输入目标函数与约束参数获取最优解并通过源码深入理解两阶段法的分步实现机制与矩阵运算逻辑是理论联系编程实践的优质教学级参考实现。1. 线性规划算法实现——Java版不是调个库就完事是亲手把单纯形表推演过程“焊”进代码里你有没有试过用 Apache Commons Math 或 ojAlgo 跑一个中等规模比如 20 个变量、15 个约束的线性规划问题结果目标值突然变成NaN约束残差飘到1e-3级别debug 半天发现是默认数值容差设得太松这不是玄学是黑匣子在报错。这份「线性规划算法实现——Java版」资源不封装、不抽象、不依赖第三方求解器它是一套从零手写、逐行可断点、每张单纯形表都打印出来的 Java 实现——含标准型转换、两阶段法初始化、主元选择策略Bland 规则防循环、退化处理、灵敏度分析接口。它不追求性能碾压商业求解器但能让你在某高校运筹学课程设计答辩时被导师指着屏幕问“第 7 次迭代的基变量为什么换成了 x₃ 而不是 x₅”你直接翻出SimplexTableau.java第 214 行指着selectEnteringVariable()的 pivot column 逻辑说“因为当前检验数向量中x₃ 对应项为 -2.37比 x₅ 的 -1.91 更负且按 Bland 规则索引更小”。适合需要交源码作业、想吃透单纯形法底层、或需嵌入轻量级 LP 求解能力到 Java 后端服务的开发者。它不是玩具是能跑通《运筹学导论》第 3 章全部课后习题的生产级参考实现。2. 从数学模型到 Java 类结构为什么必须自己实现而不是new LPSolver().solve()线性规划问题的数学表达看似简单min cᵀxs.t. Ax b, x ≥ 0。但真实世界的数据永远不“标准”——等式约束混着不等式、变量无非负限制、目标函数要最大化、系数矩阵稀疏但维度不高……这些细节一旦交给黑盒库出问题时你连 pivot step 都看不到。而本实现强制你直面每一个转换环节。它把整个求解流程拆成四个核心 Java 类每个类对应一个不可跳过的数学步骤不是为了炫技而是为了可控。2.1LPModel.java建模即契约拒绝“动态添加约束”的幻觉很多初学者误以为建模就是往 List 里 add Constraint但线性规划的可行性、有界性、基解存在性全由初始模型结构决定。本实现要求你在构造LPModel时必须一次性声明所有要素// 必须显式指定目标类型、变量数、约束数、是否含松弛/人工变量 LPModel model new LPModel( OptimizationType.MINIMIZE, // 目标方向MINIMIZE / MAXIMIZE 4, // 决策变量总数含原始变量 3, // 约束总数含等式/≤/≥ true // 是否启用两阶段法即是否允许≥约束 );提示true启用两阶段法意味着系统会自动为每个≥约束添加人工变量并构建第一阶段目标函数min w Σ artificialVars。这个布尔开关就是你对“模型是否含不可行初始基”的明确承诺——没有模糊地带。2.2StandardFormConverter.java把“生活语言”翻译成“单纯形语言”的编译器现实中的模型几乎从不长成标准型。StandardFormConverter不是简单地乘个 -1它执行一套确定性规则所有≥约束减去一个松弛变量sᵢ再加一个人工变量aᵢ用于两阶段法所有≤约束加上一个松弛变量sᵢ无符号限制变量xⱼ拆成xⱼ⁺ - xⱼ⁻并加入xⱼ⁺ ≥ 0, xⱼ⁻ ≥ 0最大化目标转为最小化-cᵀx。关键参数在convert()方法的返回值里StandardFormResult result converter.convert(model); // result.getA() 是 m×n 标准系数矩阵已扩展松弛/人工变量 // result.getB() 是 m×1 RHS 向量已处理符号 // result.getC() 是 n×1 标准目标系数含人工变量系数第一阶段为1第二阶段为0 // result.getBasicIndices() 是初始基变量索引数组如 [4,5,6] 表示 s1,a1,a2 初始为基变量这段代码的输出就是后续单纯形表的“原材料”。它不隐藏任何转换细节——比如某个≥约束被拆成aᵢ - sᵢ那么aᵢ在result.getBasicIndices()中必然出现且其在result.getC()中的系数必为 1第一阶段。这是你验证模型是否被正确理解的唯一依据。2.3SimplexTableau.java一张表就是一次数学推演的完整快照这是整个实现的中枢。SimplexTableau不是一个状态容器而是一个可执行对象。它的构造函数接收StandardFormResult并立即生成初始单纯形表含基变量列、检验数行、RHS 列SimplexTableau tableau new SimplexTableau(result); // 此时 tableau.getTable() 返回 double[][]结构为 // [ [a11, a12, ..., a1n, b1], // [a21, a22, ..., a2n, b2], // ... // [c1, c2, ..., cn, z] ] ← 最后一行是检验数-c_B^T B^{-1}A c^T和当前目标值 z注意z值在第一阶段是w Σ aᵢ第二阶段才是原目标函数值。tableau.isOptimal()和tableau.hasUnboundedSolution()的判断逻辑全部基于这张表的数值关系而非外部 flag。这意味着你可以随时System.out.println(tableau)看到的就是教科书上画的那种表格——每一行对应一个基变量每一列对应一个变量含松弛/人工最后一列是解值。这种“所见即所得”是调试退化、循环、数值误差的后悔药。2.4SimplexSolver.java控制流即数学逻辑迭代步数就是 debug 断点数求解器本身极简只有solve()一个公开方法但它内部严格遵循两阶段法流程public Solution solve() { // 阶段一最小化人工变量和 Solution phaseOne runPhaseOne(); if (phaseOne.getObjectiveValue() TOLERANCE) { // w* 0 return Solution.infeasible(); // 原问题无可行解 } // 阶段二用阶段一终表替换目标行继续迭代 Solution phaseTwo runPhaseTwo(); return phaseTwo; }runPhaseOne()和runPhaseTwo()内部都是while (!tableau.isOptimal()) { tableau.pivot(entering, leaving); }。pivot()方法会根据当前检验数选入基变量Bland 规则根据最小比值规则选离基变量处理退化时用TOLERANCE过滤分母为零执行高斯消元更新整张表记录本次 pivot 的(entering, leaving)对供后续灵敏度分析使用。这个 while 循环的每一次执行都对应教科书上的一次“换基操作”。你可以设置断点在第 3 次迭代时检查tableau.getBasicVariables()是否与预期一致这是理论到代码的最短路径。3. 两阶段法落地细节为什么人工变量不能“悄悄消失”而必须被显式驱逐两阶段法常被简化为“先解一个辅助问题再解原问题”但实际编码时人工变量的生命周期管理是最大雷区。本实现将人工变量视为“临时公民”其存在与否直接影响基矩阵B的构成和目标函数的计算。这里不讲理论只说代码里怎么确保它们不赖着不走。3.1 阶段一结束时的“人工变量清查”不是值为零就安全阶段一最优解w* 0仅说明人工变量之和为零但不保证每个aᵢ 0。更危险的是某个aᵢ可能是基变量且值为零退化基解。此时若直接进入阶段二该aᵢ仍占据基变量位置其列在B⁻¹A中参与计算会导致第二阶段目标行错误。本实现在runPhaseOne()结束后强制执行eliminateArtificialVariables()private void eliminateArtificialVariables() { ListInteger artificialCols getArtificialVariableColumns(); // 获取所有人工变量列索引 for (int col : artificialCols) { if (isColumnInBasis(col)) { // 若该人工变量仍在基中 // 找到该列中非零元所在行必有且仅有一个因是基变量 int row findNonZeroRowInColumn(col); // 执行行变换用该行消去其他所有行在 col 列的元素包括检验数行 eliminateColumnInAllRows(col, row); // 将该人工变量从基中移除换入一个非人工变量如对应列的松弛变量 swapBasicVariable(row, findNonArtificialCandidate(col)); } } }这段逻辑确保阶段一结束后基变量集合basicIndices中绝对不含任何人工作变量索引。findNonArtificialCandidate(col)会扫描该列找一个非人工变量如松弛变量sᵢ作为替代保证基的合法性。这是很多开源实现缺失的关键步骤——它们假设w*0就万事大吉结果阶段二算出荒谬解。3.2 阶段二目标行的“无缝切换”系数重载不是覆盖是重建阶段二的目标函数是原问题的cᵀx但单纯形表的检验数行公式是c_Nᵀ - c_BᵀB⁻¹N。c_B向量必须从阶段一的[1,1,...,1]人工变量系数切换为原问题中对应基变量的系数。本实现不修改原c_B数组而是在runPhaseTwo()开始时重新构建c_B// 从阶段一终表获取当前基变量索引 int[] currentBasis tableau.getBasicIndices(); // 构建新 c_B遍历 currentBasis对每个索引 i // 若 i 是原始变量或松弛变量取 originalC[i]若是人工变量取 0已不在基中此步防御 double[] newCB new double[currentBasis.length]; for (int i 0; i currentBasis.length; i) { int varIndex currentBasis[i]; newCB[i] (varIndex originalNumVars) ? originalC[varIndex] : // 原始变量 (varIndex originalNumVars numSlackVars) ? 0.0 : // 松弛变量在原目标中系数为0 0.0; // 人工变量系数为0理论上已剔除 } tableau.updateObjectiveRow(newCB, originalC); // 传入新 c_B 和完整 c 向量updateObjectiveRow()会重新计算整行检验数确保第二阶段的优化方向完全忠实于原目标。这个“重建”动作比简单的c_B ...赋值更鲁棒因为它显式处理了变量类型的边界。3.3 退化处理的双重保险Bland 规则 比值容差退化即某个基变量取值为零是导致单纯形法循环的根源。本实现采用工业级防护入基变量选择selectEnteringVariable()使用 Bland 规则——在所有负检验数中选索引最小的变量而非最负者。这牺牲了收敛速度但数学上证明可防循环。离基变量选择selectLeavingVariable(int enteringCol)计算比值b_i / a_i_entering时对分母a_i_entering加容差判断if (a[i][enteringCol] TOLERANCE) continue; // 跳过非正数列元 double ratio b[i] / a[i][enteringCol]; if (ratio minRatio - TOLERANCE) { // 严格小于防浮点误差 minRatio ratio; leavingRow i; }TOLERANCE默认为1e-10但可在SimplexTableau构造时传入。这个双重保险让本实现在处理教科书里著名的 “Klee-Minty 立方体” 退化实例时也能稳定收敛不翻车。4. 避坑指南五个血泪经验总结全是线上 debug 时拍桌子骂出来的注意以下问题均来自某高校运筹学课程设计实战学生用本资源提交代码后在助教复现时高频触发。每一条都附带可复现的最小案例和修复命令。4.1 现象solve()返回INFEASIBLE但手动代入约束发现明显可行解原因模型中存在≥约束但创建LPModel时enableTwoPhase设为false。系统强行用大M法但M值未设默认0导致人工变量惩罚失效。解决务必确认LPModel构造时只要含≥或约束enableTwoPhase必须为true。若坚持用大M法请调用setBigM(double mValue)并设mValue 1e6。4.2 现象迭代卡在第5步tableau.isOptimal()恒为false检验数行有微小负值如 -1e-15原因浮点精度累积误差。单纯形表经过多次高斯消元检验数计算出现1e-15级别噪声被isOptimal()误判为未最优。解决在SimplexTableau构造时传入自定义容差new SimplexTableau(result, 1e-12)。isOptimal()内部会用Math.abs(reducedCost) tolerance判断而非 0。4.3 现象getSolution()返回的变量值中某个松弛变量为负如s1 -0.0001原因RHS 向量b在阶段一中被修改如为处理≥约束而减去松弛变量但getSolution()未对松弛变量做非负校验。解决调用Solution.getVariableValue(int varIndex)前先用Solution.isValid()检查解的有效性。若无效说明存在数值误差导致约束违反应降低TOLERANCE或检查输入数据量纲如避免b [1e-8, 1e6]这种跨度。4.4 现象runPhaseTwo()报NullPointerException堆栈指向tableau.updateObjectiveRow()原因阶段一结束时eliminateArtificialVariables()成功但originalC数组长度与当前变量总数不匹配。常见于手动修改了LPModel的变量数后未同步更新originalC。解决originalC必须在StandardFormConverter.convert()之前就初始化为new double[totalVariables]其中totalVariables originalNumVars numSlackVars numArtificialVars。切勿用model.getNumVariables()它只返回原始变量数。4.5 现象多线程并发调用SimplexSolver.solve()时结果偶尔错乱原因SimplexTableau是有状态对象pivot()操作修改内部table数组。多个 solver 共享同一tableau实例。解决SimplexSolver不是线程安全的。每次求解必须新建实例new SimplexSolver(model).solve()。若需高性能应自行实现Tableau的 deep copy或改用无状态函数式接口本资源未提供需自行扩展。5. 灵敏度分析实战三步拿到“如果成本涨10%最优解变不变”的答案单纯形法的价值不仅在于求一个解更在于理解解对参数变化的鲁棒性。本实现预留了SensitivityAnalyzer接口但核心能力藏在SimplexTableau的终表结构里。我们以一个具体案例演示某生产计划问题产品 A 的单位利润c₁从 3 变为 3.5问最优解是否改变5.1 提取终表关键矩阵B⁻¹和N是灵敏度的基石假设阶段二终表已得tableau.getTable()返回的double[][] table中前m行是约束行前n列是变量列含原始、松弛、人工最后 1 列是 RHS最后一行是检验数行前n列是检验数最后一列是z*。B⁻¹就藏在终表的“基变量列”中。例如若终基变量是x₂, s₁, a₃索引为[1,4,6]则B⁻¹就是table的前m行、列索引[1,4,6]组成的m×m子矩阵。本实现提供便捷方法// 获取终表的 B^{-1} 矩阵m x m double[][] BInverse tableau.getBInverse(); // 获取终表的非基变量系数矩阵 Nm x (n-m) double[][] NMatrix tableau.getNMatrix(); // 获取终表的基变量 RHS b_bar B^{-1}b double[] bBar tableau.getBBar();这些矩阵是后续所有灵敏度计算的原材料。BInverse的每一列就是原约束矩阵A中对应基变量列在B⁻¹下的像它决定了参数扰动如何传导到解空间。5.2 目标系数c_j变化的允许范围检验数不破防的边界当c₁产品 A 利润变化Δc₁其检验数z₁ - c₁的变化量为Δc₁ * (B⁻¹A)_1j其中(B⁻¹A)_1j是B⁻¹乘以A的第j列。但更直接的方法是c₁变化只影响检验数行中x₁对应的元素。终表检验数行r满足r c_Nᵀ - c_BᵀB⁻¹N所以c₁属于c_N若x₁是非基变量或c_B若x₁是基变量。本实现提供getCoefficientSensitivity(int varIndex)方法返回一个SensitivityRange对象SensitivityRange range tableau.getCoefficientSensitivity(0); // varIndex0 即 x1 System.out.println(c1 允许范围: [ range.getMin() , range.getMax() ]); // 输出: c1 允许范围: [2.8, 4.2]其内部逻辑是若x₁是基变量解不变的条件是r_j 0对所有非基j成立r_j依赖于c_B故解出c₁的上下界若x₁是非基变量解不变的条件是r₁ 0即c₁ c_BᵀB⁻¹A₁直接计算右端。这个范围告诉你c₁从 3 涨到 3.5仍在[2.8, 4.2]内因此最优基不变最优解也不变只是目标值z*会变。5.3 RHSb_i变化的允许范围产能增减多少不影响当前生产组合RHS 变化Δb_i会影响b_bar B⁻¹b进而影响所有基变量值x_B b_bar和目标值z* c_Bᵀb_bar。解保持可行的条件是x_B 0即B⁻¹(b Δb) 0。getRhsSensitivity(int constraintIndex)方法给出b_i的允许变化区间SensitivityRange bRange tableau.getRhsSensitivity(0); // 第0个约束如原料A供应 System.out.println(b0 允许范围: [ bRange.getMin() , bRange.getMax() ]); // 输出: b0 允许范围: [95.0, 108.5]计算原理是b_bar_new b_bar B⁻¹ * Δb其中Δb只有第i个分量非零。令B⁻¹的第i列为d则b_bar_new b_bar d * Δb_i。要求b_bar_new[j] 0即b_bar[j] d[j] * Δb_i 0。对每个j解不等式取交集即得Δb_i范围。若当前b₀ 100则b₀可增至108.5或减至95.0当前最优生产计划即哪些产品生产多少完全不用调整。超过此范围就必须重新运行单纯形法。从那以后我每次做课程设计只要涉及参数变化分析都强制走一遍getCoefficientSensitivity()和getRhsSensitivity()哪怕题目没要求——因为这能反向验证我的终表是否真的算对了。一个正确的终表其灵敏度范围一定合理一个算错的终表范围常常是[-Infinity, Infinity]或空集这就是最硬的 debug 证据。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

零基础三天跑通Android计算器:Activity+XML+Java三件套实战

零基础三天跑通Android计算器:Activity+XML+Java三件套实战

简介:本资源是一份面向K12阶段初学者的Android应用开发实践项目,聚焦使用Android Studio实现简易计算器功能,覆盖UI布局、事件监听、运算逻辑封装、优先级处理及APK构建全流程,是典型的安卓期末大作业参考方案。压缩包共48个文件&…

2026/10/17 14:58:38 阅读更多 →
Unity体绘制大气散射:Raymarching实现与性能优化实战

Unity体绘制大气散射:Raymarching实现与性能优化实战

1. 项目缘起与整体设计思路1.1 为什么选择体绘制来做大气散射做Unity场景渲染的朋友大概率都遇到过这样一个尴尬:用传统的天空盒或者后处理方式做出来的大气效果,在地面平视时看着还行,一旦镜头拉高、俯视地平线,或者飞行穿过云层…

2026/10/17 14:58:38 阅读更多 →
HTML核心机制深度解析:从浏览器解析到工程实践

HTML核心机制深度解析:从浏览器解析到工程实践

很多人觉得HTML简单,不就是一堆标签吗?写多了自然就熟了。但实际上,我见过太多“会写标签”但完全不懂HTML的人——写出来的页面能用,却处处埋着坑:SEO不友好、可访问性差、性能被拖累、表单校验形同虚设。这篇文章不打…

2026/10/17 14:57:37 阅读更多 →

最新新闻

基于深度学习的疲劳驾驶检测:目标检测、图像分类与实时推理实战

基于深度学习的疲劳驾驶检测:目标检测、图像分类与实时推理实战

我还记得去年做毕设选题那会儿,导师给了我几个方向,我一眼就看中了"基于深度学习的疲劳驾驶检测"这个题目。原因很直接:疲劳驾驶导致的事故率一直居高不下,而市面上很多所谓"智能驾驶预警"要么靠红外打哈欠检…

2026/10/17 16:00:20 阅读更多 →
DB2异机恢复实战:NetBackup Agent配置与归档日志模式避坑指南

DB2异机恢复实战:NetBackup Agent配置与归档日志模式避坑指南

简介:这份文档面向使用 NetBackup 实现 DB2 数据库异机恢复的运维与 DBA 人员,聚焦备份配置与恢复流程中的关键环节,适合具备一定 DB2 与 NBU 基础、需要搭建或排查异机恢复环境的技术人员参考。资源包内共 1 个 doc 文件,压缩包约…

2026/10/17 16:00:20 阅读更多 →
Python 100道经典练习题:从会看到会写的完整刷题路线

Python 100道经典练习题:从会看到会写的完整刷题路线

简介:《Python100道经典练习题(建议收藏)》是一份面向Python初学者与进阶者的习题集PDF文档,覆盖循环与条件判断、函数与模块、递归、字符串操作、面向对象、矩阵运算、算法、文件操作、日期时间等核心知识点。文档包含100个由易到…

2026/10/17 16:00:20 阅读更多 →
分布式数据库兼容性测试实战:OceanBase迁移验证与问题排查

分布式数据库兼容性测试实战:OceanBase迁移验证与问题排查

前阵子接手了一个数据库兼容性验证的测试任务,对象是某分布式数据库(以下简称 ob),业务侧是公司一个核心交易模块的模拟项目。整个测试周期接近三周,从环境部署、功能验证、长时间稳定性压测到性能比对,整个…

2026/10/17 16:00:20 阅读更多 →
2026年33款主流AI编程工具实测与选型指南

2026年33款主流AI编程工具实测与选型指南

2026年聊AI编程工具,感觉跟前几年完全是两个世界。我自己电脑里装过的、主力用过的,加上最近两年圈子里讨论度一直很高的,随便一数就是三十多个。这个数量对老手来说都容易挑花眼,更别提前几天我帮一个刚入行的朋友捋工具&#xf…

2026/10/17 16:00:20 阅读更多 →
深入理解 DOM NodeList:从基础到实战

深入理解 DOM NodeList:从基础到实战

1. 什么是 NodeListNodeList 是 DOM 中一个非常重要的集合类型,它表示一组节点的集合。当我们使用 document.querySelectorAll() 或 element.childNodes 等 API 时,返回的结果就是 NodeList。NodeList 与数组(Array)有相似之处&am…

2026/10/17 15:59:20 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →