如何获取Timefold Solver作业的当前阶段?
如果你使用的是OptaPlanner这类主流调度求解器,是可以实现获取SOLVING_ACTIVE状态下细分阶段(CH构造启发式、LS局部搜索)的需求的,具体方案如下:
自定义求解器事件监听器
实现求解器框架提供的事件监听接口(比如OptaPlanner的SolverEventListener),重写对应方法(如bestSolutionChanged)。通过事件对象(SolverEvent)可以直接获取当前的SolverPhase实例,判断其类型是否为ConstructionHeuristicPhase或LocalSearchPhase,再将阶段信息与作业状态整合后推送给调度用户。直接访问求解器内部状态
多数成熟求解器会提供内部状态访问API,比如OptaPlanner中,通过solver.getSolverStatus()确认作业处于SOLVING_ACTIVE后,可调用solver.getBestSolutionManager().getSolverPhase()获取当前细分阶段。你可以通过定时轮询或事件驱动的方式,将该状态实时同步到用户可见的界面或通知系统中。解析求解器日志获取阶段信息
若框架未提供直接的状态访问API,可开启求解器的阶段级日志输出(调整日志级别至DEBUG),然后通过自定义日志拦截组件捕获阶段切换的日志内容(如“进入构造启发式阶段”“切换至局部搜索阶段”),解析后将状态转换为用户易懂的信息对外展示。
如果使用的是自研或小众求解器,建议在求解器内部的阶段切换逻辑中添加状态埋点,触发自定义的生命周期事件并携带阶段标识,以此实现状态的对外暴露。
内容的提问来源于stack exchange,提问作者Pezetter

