langgraph4j执行图原理:超级步调度、状态快照与条件路由实践
langgraph4j的执行图ExecutionGraph是整个Agent框架真正让图动起来的核心发动机。前两篇我们聊了StateGraph怎么把节点和边组织成一幅静态蓝图也拆了状态通道和快照机制这次我把编译后生成的那张执行图彻底翻一遍它到底用什么数据结构收编节点、节点之间的先后顺序是怎么定出来的、条件路由在超级步模型里怎么一步步走通最后再分享几个我实际读源码、排线上问题时的抓手。这篇不适合只想调API的人更适合想弄懂langgraph4j调度原理、甚至打算二次开发或给框架做扩展的读者。1. 进执行图之前先把那张蓝图看明白1.1 StateGraph 和 ExecutionGraph 到底什么关系用过LangChain4j生态的同学都知道langgraph4j的基本玩法是先new一个StateGraph往里面addNode、addEdge再调用compile()拿到CompiledGraph最后invoke或者stream执行。问题是编译这一步到底干了些什么我的理解是StateGraph只是承载用户配置的设计稿——它保存了原始节点列表、静态边、条件边以及这些定义对应的Java函数对象。它不关心怎么跑只关心图上有什么。Compile之后生成ExecutionGraph这才是真正可以被执行的施工图节点被编了号、边被分拣成了不同的路由集合、入度出度表被预先算好甚至连哪些节点是死胡同这种优化都可能在编译期做掉一部分。这种分离和编译器前端/后端的思路很像前面做语法检查、语义绑定后面做指令选择和调度。对一个Agent框架来说把用户怎么描述流程和框架怎么高效执行流程分开能带来两个直接好处。第一StateGraph可以保持非常薄的心智负担用户只需要理解节点、边、条件这三个概念第二执行引擎可以独立演进比如想在调度上加并行、加检查点、加流式完全不用动用户侧API。我自己做过一段时间的状态机框架最深的教训就是不要把解析和执行搅在同一个类里否则任何一个并发优化都会把API搞得一团糟。1.2 编译期到底预处理了什么从源码来看compile阶段有一件非常重要的事把StateGraph里的节点记录和边记录转换成ExecutionGraph内部更紧凑的邻接表结构。langgraph4j里面常见的做法是维护一张MapString, Node节点ID作为KeyNode对象作为Value。边则分两类存放一类是普通边记录从哪个节点出发可以无条件走到哪个节点另一类是条件边记录从哪个节点出发后需要调用哪个条件函数来决定下一步去哪。这两个集合会被组织成从起点到终点集合的映射关系方便执行时一次查表。还有一个容易被忽略的点编译后的ExecutionGraph会对特殊节点做标记。比如A_START、A_END这种内部虚拟节点A_START通常没有上游A_END通常没有下游。执行引擎在求第一波可运行节点的时候依赖的正是这张入度表。如果在编译期不把入度出度算好执行期每次都要遍历全图才能确定谁可以开始那性能就没法看了。我建议你打开源码的时候先看StateGraph里编译方法做了什么再看ExecutionGraph里暴露了哪些查询接口。你会发现真正跑起来的主循环并不直接操作StateGraph而是通过ExecutionGraph的接口去拿这个节点的下游是谁这个条件路由的结果往哪走。这条界限清楚了后面读调度代码才不会被各种数据结构绕晕。2. 拆开 ExecutionGraph 的内部结构2.1 那几个关键字段的作用ExecutionGraph这个类本身并不复杂核心就是图论里最常见的那几样东西。我按阅读顺序列一下nodes按节点ID组织的映射表value就是Node对象节点ID的命名通常就是你addNode时传入的标识。edges普通边的集合每条边至少包含起点节点和终点节点代表无条件转移。conditionalEdges条件边集合每条条件边除了起点节点外还带一个Condition接口这个接口的输入是当前状态快照输出是目标节点ID列表。入度、出度辅助表ExecutionGraph会在内部维护类似每个节点有多少条入边、多少条出边的统计信息用来在超级步开始时快速判断哪些节点处于可调度状态。很多第一次读源码的人会有一个疑问为什么有edges和conditionalEdges两套集合而不是统一成一种带条件的边答案很简单普通边不需要求值直接进入下游节点集合条件边需要调用条件函数只有函数返回的节点才会进入下一波调度。如果混合在一起主循环里每个superstep都要做一次类型判断代码会显得很碎而且普通边的执行路径会被条件求值的分支拖累。分开存储之后普通边可以用一套非常紧凑的循环处理条件边单独走求值逻辑整个执行期代码会清爽很多。2.2 邻接表为什么选起点到终点集合这种结构图论里有两种常见的表示法邻接矩阵和邻接表。langgraph4j选的是邻接表思想——每个起点维护一个出边集合。在Agent图这种低密度场景里一个节点通常只有一两条出边极少出现全连接邻接表既省内存又方便遍历。更重要的是执行引擎在每一个超级步都大量执行从节点集合找所有下游节点的操作邻接表可以实现真正的O(出边数)复杂度矩阵的话就得扫描一整行。你可以把ExecutionGraph内部想象成一个路由器输入一个节点ID立刻就能吐出所有可以到达的下游节点ID列表。条件边多一步——先调用条件函数再拿返回值去查这些返回节点是否合法存在。如果条件函数返回了一个根本不在图里的节点名这个错误通常会在执行期才暴露出来这也是后面要讲的常见坑之一。实际追踪源码的时候我一般会在两个地方打条件断点一个是普通边扇出fan-out的循环看一个节点是怎么变成多个下游节点的另一个是条件边求值后的结果集合处理看返回值是怎么和已知节点集合取交集的。这两处看完ExecutionGraph的数据结构基本就吃透了。3. 执行主循环超级步与活动节点集3.1 一次invoke到底经历了多少个超级步ExecutionGraph的静态结构讲完后真正烧脑的是执行期。langgraph4j延续了LangGraph从Pregel借来的超级步superstep概念。你别被这个名字吓到把它理解成一轮同步执行就好——在每一轮里所有准备好了的节点会同时开工全部跑完后框架统一处理结果再决定下一轮有哪些节点可以开工。比如图里有A、B、C三个节点初始状态下只有一个入口节点准备好了。超级步0执行完入口节点后可能同时激活了A和B超级步1里A和B并行跑完分别产生自己的输出状态这时条件边可能判定下一步去C超级步2执行CC执行完到了END节点全图结束。整个过程可能只需要三四个超级步而不是像DFS那样一个节点一个节点地线性走到底。这个模型最大的价值在于为并行执行留下了天然的切口——同一个超级步内两个互不依赖的节点完全可以由线程池并发执行。langgraph4j在执行的时候也确实这么做了某个节点集合如果包含多个节点executor会尝试并行调用这些节点的处理函数。这一点后面拆并行分工的时候再展开。3.2 活跃节点集合是怎么计算出来的主循环里最核心的一个步骤是每一轮开始前确定这一轮到底哪些节点该跑。源码里大致是这样的思路——开始时先把入口节点或没有入边的节点放入待执行集合每轮结束后收集这一轮所有节点的下游节点去重去掉已经跑过的节点去掉已经在待执行集合里的节点剩下的就是下一轮的活跃集合。听起来很简单但有一个细节特别容易踩坑循环图。如果图里有A→B→A这种环那去掉已经跑过的节点这个逻辑就不能简单用一个Set记录历史节点否则环会立即被切断导致逻辑错误。LangGraph对循环的容忍和DSL设计允许图存在环比如规划-执行循环就是一个环所以真正判断结束条件靠的并不是所有历史节点都跑过而是当前超级步的活跃节点集合为空。也就是说执行主循环大约长这样当前活跃集合 初始入口集合while (当前活跃集合非空) { 对集合内每个节点执行处理函数收集输出状态 处理条件边得到更下一批候选节点 计算下一波活跃集合 }返回最终状态只要每轮都能推进一点点即使图里有环也总能朝着终止状态收敛。真正会导致死循环的情况是条件边反复把流程导回同一个节点且该节点的输出状态永远在增加或永远无法满足结束条件。这种问题属于业务逻辑层面的锅不是框架的锅但定位起来特别费劲后面我会单独讲排查方法。3.3 超级步里状态的流转方式是怎样的每个超级步结束后框架会把本轮所有节点的输出合并到当前状态上。这个状态在langgraph4j里通常以不可变快照的形式存在每一轮都会产生一个新的StateSnapshot。别小看不可变这三个字——它保证了并行分支之间彼此隔离不会出现两个节点同时写同一个HashMap导致数据互相覆盖的情况。具体做法是输入给本轮节点的状态是上一轮合并完的完整快照节点执行完返回一个新的状态片段或者直接返回更新后的状态框架再调用状态合并逻辑把这些片段合入主状态。如果你用过AgentState里那些update方法应该对这种模式不陌生。合并时还支持reducer比如AppenderChannel会把多个分支写入的列表按追加顺序拼接而不是简单覆盖。这个设计对并行分支共享上下文变量极其重要我在第6节会展开讲。4. 节点到底是怎么被真正调起来的4.1 Node.run() 的内部包装逻辑ExecutionGraph里存的Node并不是简单塞一个Function进去就完事。源码里的Node一般会保存节点类型和执行函数执行函数统一包装成一个符合框架接口的方法。这个方法接收StateSnapshot返回StateSnapshot。用户注册lambda的时候lambda签名经过编译期适配最终都会收敛到这个统一形态上。举个例子。你写的是(state) - Map.of(answer, hello)框架会自动把返回的Map转换成一个状态片段。你写的是带AgentState参数的复杂函数框架也会处理好类型适配。这样一个统一入口的好处是执行引擎不需要关心节点内部到底怎么实现只需要按统一约定调用Node.run()获取返回值再交给状态合并逻辑处理即可。从调度角度看一个节点在一个超级步里只会被调用一次。这个语义对理解langgraph4j行为非常重要——即使一个节点在这个超级步里既是普通下游、又被条件边指向了框架也会通过去重机制保证它不会被执行两遍。我早期写Agent编排时天真地以为图框架会像消息队列一样每个事件都触发一次节点结果发现它是每轮每个活跃节点至多一次这个认知转变帮我省下了很多debug时间。4.2 节点抛了异常会怎样框架对节点异常的处理可以总结成一句话异常不会立刻击穿整个调用而是被包装后塞回状态流。langgraph4j的StateSnapshot里通常会携带错误信息字段节点抛出运行时异常时框架会捕获它、写入当前轮次的输出状态然后让这一轮结束。这种设计的意图很清晰让上层调用者拿到带错误标记的状态快照从而可以根据错误内容决定重试、告警或者走兜底分支。这样做有一个可感知的副作用——你在节点lambda里遇到空指针或网络超时invoke方法不一定会在第一时间抛出异常而可能是在你读取运行结果时发现返回状态里躺着一条错误信息。刚开始用这个框架的人多半会被这一点整懵以为是框架吞了异常。实际上框架没有吞异常只是改变了异常的传递路径。个人建议是在节点边界做好防御。每个节点入口就检查必要字段出口统一包装成功或失败的结果对象不要裸奔抛出乱七八糟的异常。这样既不给框架的错误处理机制添乱排查问题的时候也一目了然。4.3 流式模式下执行图怎么配合流式执行看起来好像是另一套东西其实底层还是靠执行图的超级步推进只不过每个节点输出的内容不再只等一轮结束后合并而是通过流式接口逐步吐出来。源码里其实也就是在多轮超级步之间把节点的部分输出以事件形式推给订阅者。StreamMode的几种模式本质上是在超级步的哪个位置切一刀暴露出来的差别。我自己的实践经验是需要给用户打字机效果的时候尽量用流式模式调整好每个节点的输出频率避免一个节点一次性吐一大堆那样交互体验会很差。但这个优化属于业务调优和框架本身关系不大执行图的调度主体并不会因为开流式而改变节点执行顺序。5. 条件路由的求值细节下一步到底听谁的5.1 条件边如何参与超级步调度条件边是Agent图里最灵活也最容易出bug的地方。一条条件边通常定义在某个源节点上它不会像普通边那样无条件把下游节点加入下一波集合而是先调用条件函数拿到一个目标节点ID列表再把这个列表里合法的节点加入下一波活跃集合。这个求值过程发生的时机很讲究不是在节点执行前而是在节点执行完、输出状态合并完毕之后。原因很直接——条件函数要看当前状态才能决定走哪条路而当前状态必须包含本节点本轮产生的最新输出。如果你在节点A里改了状态里的某个字段而条件函数在A执行前就求值那读到的一定是旧值路由判断就废了。所以框架严格保证先执行节点再合并新状态最后求条件边这个先后顺序千万不能记反。5.2 条件函数返回空列表或END时会发生什么条件函数返回空列表意味着本轮没有下一步可走的节点。如果这一轮之后整个活跃集合都空了主循环就结束了。这一点既是Feature也是坑——很多新手把条件路由写成一个返回空列表的默认分支期望框架报错提示无路可走实际上框架只会安静地结束整个执行然后给你一个看起来没跑完的状态。处理方式很简单如果你想让流程强制结束可以让条件函数返回专门的END节点标识如果你想让流程继续但走兜底逻辑就确保空分支返回真正的兜底节点名。我最开始在规划-执行型Agent里就吃过这种亏明明模型给了一个乱七八糟的下游名条件函数做了模糊匹配失败后返回空列表导致整个图悄悄结束不报错最后排查了半天才发现是空列表导致的静默终止。5.3 一个循环拆解示例拿最经典的规划-执行循环来说Plan节点负责生成计划Task节点负责执行当前步骤Check节点负责判断计划是否完成。这个图里Plan到Task是一个普通边Task到Check是普通边Check上挂一个条件边如果计划未完成返回Task如果已完成返回END。执行时会发生什么超级步0跑Plan产出初始计划超级步1跑Task执行第一步超级步2跑Check发现还有下一步条件返回Task超级步3又跑Task……这样循环往复直到某个Check发现全部步骤完成条件返回END活跃集合清空主循环退出。整个执行过程根本不需要用户手写循环控制而是被条件边的反复求值驱动出来的。读源码的时候你盯一下条件边的求值结果是怎么并入活跃集合的就能明白为什么返回列表可以包含多个节点——因为Agent图允许一次条件判断扇出到多个分支并行处理。返回[Task, SomeOtherNode]这种场景是合法的框架会把这几个节点同时放入下一轮活跃集合。这种语义可以设计出一个检查节点同时触发多个后续动作的编排非常灵活。6. 并行分支与状态合并6.1 同一超级步内怎么做到并行超级步模型天然支持并行一个超级步的活跃集合里有A和B两个节点且A和B之间没有数据依赖它们的下游归属是下一轮才处理的那A和B就可以在本轮内并发执行。langgraph4j的task executor会为每个节点分配一个独立任务去跑主线程等待这个超级步所有任务完成后再统一处理结果集。这里我对初次接触框架的读者额外提醒一句并行并不代表无限并行。线程池大小受配置约束如果图上同时有几十个节点被扇出实际执行仍然是按线程池设计并发度来限流的。你写Agent编排时不要假设所有节点一定同时起跑更不要尝试在节点之间共享可变对象否则跑着跑着会出现各种诡异的线程安全问题。6.2 两个分支都写同一个key谁说话算数这是并行Agent框架里最经典的问题。假设超级步里有两个节点并行执行节点A往状态里写了answerA的结果节点B同时往状态里写了answerB的结果合并后answer到底应该等于什么langgraph4j的方案是靠通道Channel的合并语义来决定。普通Channel默认的行为是最后写的人获胜或者已有值不被覆盖而AppenderChannel这类带reducer的通道会把多次写入当作追加最终得到一个包含A和B结果的列表。源码里实现合并的地方就是通道的update逻辑它会根据通道类型决定合并策略。所以如果你想用并行分支凑一个所有中间结果的汇总不要在普通键上拼字符串应该用追加类型的通道。这个行为的理解要结合执行图的状态快照来看一个超级步结束时框架会把所有节点的返回状态片段按照通道合并逻辑依序应用生成新的StateSnapshot。这个快照既是下一轮的输入也是你最后拿到手的运行结果。如果不理解合并语义你会在一些看起来谁先执行谁就赢的灵异现象里浪费大量时间。6.3 快照为什么会越积越大还有一个运行期会遇到的现实问题状态快照不可变意味着每个超级步都会生成一份新的快照。如果Agent跑了几十轮循环且每轮都在状态里追加内容快照会非常迅速地膨胀。源码里快照保存的引用和历史记录如果被用于checkpoint或回放内存压力会成倍增长。我的建议是能不放状态里的信息就不要放状态里尽量只放Agent决策所需的最小上下文。真要保留长对话历史优先用外部的持久化存储或专门的检查点机制而不是让每轮执行都背负一整个历史列表在内存里拖拽。这个问题不是我凭空想出来的而是真实跑长任务时踩过的坑——几十轮循环后状态里有几千条历史消息每个超级步都全量拷贝一遍GC都开始频繁报警了。7. 读执行图源码时的几个抓手和常见坑速查7.1 源码阅读的技巧与断点位置读langgraph4j执行源码我建议按三条线来追构线ExecutionGraph的构建、调度线超级步循环、状态线快照合并。三条线有各自的代表类先分别看一遍再看它们如何交织。调试时可以重点在三个位置打条件断点活跃节点集合生成的地方观察每一轮的待执行节点列表能直观看到图的分支调度过程。条件函数调用处看条件函数入参状态是不是包含了节点最新输出排除读到旧状态问题。通道合并逻辑处看两个并行分支写入同一key时合并结果是否符合预期。在debugger里开启表达式观察主动把当前超级步编号和节点列表打到日志里比盲猜快得多。我自己的习惯是给每个节点加一个起始日志打印节点名和超级步序号执行完整个流程后看日志就能拼出完整的调度时序。7.2 高频问题排查速查表现象可能原因排查思路调用invoke后状态里只有部分节点结果某些分支走到了END或条件返回了空列表查看每轮活跃集合日志确认流程是否被静默终止节点抛异常但invoke没有立刻抛框架把异常包装进了状态错误字段检查运行结果状态里的错误标记别只看返回值图一直在跑像死循环条件边状态依赖可能永远无法满足在条件函数入口输出状态关键字段观察循环调度值变化多个分支结果互相覆盖使用了普通通道没有配reducer改用AppenderChannel等合并通道条件函数返回了不存在的节点名下游节点ID拼写错误或名称不一致在条件函数返回值处理处打断点查看返回列表与节点集合交集状态快照越来越大内存吃紧不可变快照叠加历史记录过多精简状态内容历史外置存储7.3 我踩过的三个坑希望你避开第一个坑是在节点里直接修改外部可变对象。为了图方便我曾在节点lambda里往一个静态Map缓存中间结果结果并发分支一开到处是覆盖和错乱。后来老老实实把该进状态的数据都放到状态通道里配合AppenderChannel做追加问题瞬间消失。第二个坑是过度设计条件边。条件函数里塞了一大堆业务判断和外部调用看起来功能很全但每次超级步都要执行一遍性能差不说还特别难测。后来我把条件函数拆成只做轻量状态判断重计算全部挪到节点里完成路由结果作为状态字段输出条件函数直接读这个字段整体清爽很多。第三个坑是忽略默认的并发度配置。有过一次线上排队现象以为是节点逻辑太慢后来把线程池配置拉出来一看核心并发放得极保守。不是代码问题是没看框架默认参数。所有框架的默认值都只是保守假设真实跑并发前一定要先确认执行器配置。8. 写在最后我的亲测体会langgraph4j的执行图设计本质上是把分布式图计算里的Pregel模型搬到了Agent编排这个场景里。用超级步统一调度、用不可变快照承载状态、用条件边实现循环这几个设计拼在一起让复杂Agent流程的描述和运行变得非常规整。我个人在这套源码里学到的不只是某个框架的API更是一套如何在并发条件下安全编排有状态逻辑的思维方式。如果你正准备深入读这套源码我的体会有三条最值得记住第一先抓构线再抓调度线不要让节点和边的细节淹没主循环逻辑第二每一个superstep都要追问当前活跃节点是谁、上一轮合并后的状态长什么样第三遇到看似玄学的问题先怀疑自己的状态合并语义而不是先怀疑框架调度错了。希望这篇执行图原理分析能帮你把这套框架的底盘看透下一篇我们再往深处走把并行调度和检查点机制单独拿出来犄角旮旯都扫一遍。

相关新闻

skin界面库资源包解析与换肤引擎接入实战指南

skin界面库资源包解析与换肤引擎接入实战指南

简介:这份资源面向使用 MFC 开发 Windows 桌面程序的 C 开发者,尤其是希望摆脱默认控件朴素外观、为应用快速添加换肤能力的中级开发者。包内围绕皮肤界面库的集成与使用展开,涵盖库文件引入、皮肤资源导入、原生控件替换以及运行时初始化应用…

2026/10/14 12:30:36 阅读更多 →
PIPE 4.3实用指南:Petri网建模、分析与避坑

PIPE 4.3实用指南:Petri网建模、分析与避坑

简介:PIPE4.3是一款基于Petri网的图形化建模与仿真分析软件,面向并发系统、分布式系统及流程建模的研究人员和工程开发者,能够帮助用户绘制Petri网模型、配置标记与变迁规则,并进行动态模拟和模型一致性检查。包内共2384个文件&am…

2026/10/14 12:30:36 阅读更多 →
军队文职计算机数据结构与算法:从考纲到上机复现的完整路径

军队文职计算机数据结构与算法:从考纲到上机复现的完整路径

简介:这份《军队文职计算机类数据结构与算法知识点总结》面向备考军队文职计算机岗位的考生,以及需要系统梳理数据结构与算法基础的在校学生和求职者,帮助解决知识点零散、复习无纲的问题。资源包内含1个docx文档,压缩包约661KB&a…

2026/10/14 12:30:36 阅读更多 →

最新新闻

初识C++中的模板

初识C++中的模板

当我们写交换两个变量内容的函数时,虽然有函数重载,但函数内容基本上都一样,这样显得有些麻烦了。C 中就提供了解决该问题的方法——模板。泛型编程 泛型编程指的是编写与类型无关的通用代码,不指定具体数据类型,等到使…

2026/10/14 19:37:49 阅读更多 →
心理测评和看病是什么关系

心理测评和看病是什么关系

心理测评和看病是什么关系 很多人在测评中心做完量表,会冒出一个问题:分数出来了,然后呢?是不是就等于看过病了?这里把边界说清楚——以明白健康(https://healviews.com/)测评中心(h…

2026/10/14 19:37:48 阅读更多 →
C 语言第 3 课:变量就是“贴了名字的小格子“,int/float/char 一次讲透

C 语言第 3 课:变量就是“贴了名字的小格子“,int/float/char 一次讲透

C 语言第 3 课:变量就是“贴了名字的小格子”,int/float/char 一次讲透 系列笔记第 3 篇。上一课的程序只会打印固定的一句话,笨得很——真正的程序要会“记住”东西。 一、为什么需要变量? 收银机要记住“这单多少钱”&#xff0…

2026/10/14 19:37:48 阅读更多 →
买电车前怎么查充电接口和快充速度

买电车前怎么查充电接口和快充速度

买电车前怎么查充电接口和快充速度 看车的时候销售说「支持快充」,但峰值功率多少、从 10% 充到 80% 要多久、家门口的桩能不能插——这些才是影响日常体验的数字。想按车型逐款查这些参数,可以用每日电车(https://cardailys.com/&#xff09…

2026/10/14 19:37:48 阅读更多 →
LangGraph 实战(一):别再手写 Agent 循环了,用 StateGraph 十分钟搭一个

LangGraph 实战(一):别再手写 Agent 循环了,用 StateGraph 十分钟搭一个

一、先说结论:为什么需要 LangGraph 用大模型做 Agent,很多人第一步都是手写 while 循环: while True:response model.invoke(messages)if not response.tool_calls:breakfor call in response.tool_calls:messages.append(run_tool(call))m…

2026/10/14 19:37:48 阅读更多 →
索引创建的原则

索引创建的原则

针对数据量较大、且查询比较频繁的表建立索引。一般单表数据量达到百万级以上时,索引收益明显。针对常作为查询条件(where)、排序(order by)、分组(group by)的字段建立索引。尽量使用联合索引&…

2026/10/14 19:36:48 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →