如何在Timefold的Java代码中配置构造启发式与局部搜索?
Timefold求解器Java代码配置:整合构造启发式与局部搜索
问题背景
此前通过solver.xml配置求解器,内容如下:
<constructionHeuristic> <constructionHeuristicType>FIRST_FIT</constructionHeuristicType> </constructionHeuristic> <localSearch> <localSearchType>TABU_SEARCH</localSearchType> </localSearch>
现在希望改用Timefold的Java代码方式配置求解器,但现有代码中找不到添加构造启发式与局部搜索配置的方法,现有代码如下:
var solverConfig= new SolverConfig() .withSolutionClass(EventBinAssignation.class) .withEntityClasses(Event.class) .withEntityClasses(BinAvailablity.class) .withConstraintProviderClass(OptaPlannerConstraintProvider.class) // 该求解器在小数据集上仅运行5秒。 // 否则建议至少运行5分钟("5m")。 .withTerminationSpentLimit(Duration.ofSeconds(5)); SolverFactory<EventBinAssignation> solverFactory = SolverFactory.create(solverConfig);
解决方案
你可以通过SolverConfig的withPhaseList()方法添加构造启发式阶段和局部搜索阶段,对应XML中的配置。修改后的代码如下:
var solverConfig= new SolverConfig() .withSolutionClass(EventBinAssignation.class) .withEntityClasses(Event.class, BinAvailablity.class) // 合并实体类调用,代码更简洁 .withConstraintProviderClass(OptaPlannerConstraintProvider.class) .withTerminationSpentLimit(Duration.ofSeconds(5)) // 配置求解阶段列表:先执行构造启发式,再执行局部搜索 .withPhaseList(List.of( new ConstructionHeuristicPhaseConfig() .withConstructionHeuristicType(ConstructionHeuristicType.FIRST_FIT), new LocalSearchPhaseConfig() .withLocalSearchType(LocalSearchType.TABU_SEARCH) )); SolverFactory<EventBinAssignation> solverFactory = SolverFactory.create(solverConfig);
关键说明
withPhaseList()方法用于定义求解器的执行阶段顺序,列表中顺序即为阶段执行顺序ConstructionHeuristicPhaseConfig对应XML中的<constructionHeuristic>节点,通过withConstructionHeuristicType()指定启发式类型LocalSearchPhaseConfig对应XML中的<localSearch>节点,通过withLocalSearchType()指定局部搜索类型- 原代码中多次调用
withEntityClasses()可合并为一次调用,传入多个实体类参数,简化代码结构
内容的提问来源于stack exchange,提问作者Lovedeep Sangha
相关产品推荐
相关产品推荐

