java - 如何保证施工阶段初始化所有实体的计划变量?
问题描述
有时,如果我将构建阶段的“已用秒数”和“未改进的已用秒数”终止设置设置的时间太短,我最终会得到一些未初始化所有计划变量的计划实体。这导致我的搜索阶段抛出有关未初始化的计划变量 ( Local Search phase (1) needs to start from an initialized solution
...) 的异常。
这似乎(部分)违背了建设阶段的目的。我觉得我在某处遗漏了警告?也许我过度配置了我的构建阶段?
这是我的构建阶段的配置代码。我正在使用 Java 来配置我的 Solver 而不是 XML。
TerminationConfig terminationConfig = new TerminationConfig();
ConstructionHeuristicPhaseConfig phaseConfig = new ConstructionHeuristicPhaseConfig();
terminationConfig.setSecondsSpentLimit(60L);
terminationConfig.setUnimprovedSecondsSpentLimit(30L);
terminationConfig.setBestScoreLimit("0hard/0medium/0soft");
phaseConfig.setConstructionHeuristicType(ConstructionHeuristicType.FIRST_FIT);
phaseConfig.setTerminationConfig(terminationConfig);
phaseConfigs.add(phaseConfig);
谁能指出我正确的方向?是否有一种“正确”的方式来保证所有规划实体的所有规划变量都将在构建阶段结束时被初始化?
解决方案
如果您想运行 LS,则在 CH 完成之前终止它是没有意义的。让它完成并在<localSearch>
代替上放置一个终止<solver>
(API当然也支持这一点),以避免它过早完成。
不过,有很多方法可以让 CH 运行得更快,请参阅文档。
或者,将每个终止与一个AND
终止结合起来<bestScoreFeasible>true</>
(= 只有找到可行的解决方案,它才能终止)也可以做你想做的事情,即使作为全局<solver>
终止也是如此。
推荐阅读
- sql - Azure SQL DWH - CTE 和随机样本的问题
- firebase - 在 Firebase 中创建新的 Web 应用程序时,缺少数据库 URL
- javascript - 如何使用大量编码日志调试汇总构建输出?
- swift - 将字符串转换为具有不同时区的日期会给出错误的日期
- python - Pydantic 是否接受具有单值和多值的相同查询?
- html - 我怎样才能在引导工作室中制作这种类型的布局
- python - 如何修复替换中的 ValueError
- heroku - 构建成功后超出 Heroku 内存配额
- python - 从 CSV 列中去除空格并覆盖列
- python - 在运行时提取 python 轮子的版本