当前位置: 首页 > 知识库问答 >
问题:

Optaplanner - 施工启发式 在所有规划实体初始化之前找到可行的解决方案

卢恩
2023-03-14

我有这样的设定:

%test.quarkus.optaplanner.solver.termination.best-分数限制=0硬/*软

在施工启发式阶段,如果 optaplanner 在为所有规划实体分配初始值之前获得 0 HARD 分数(可行解决方案),那么在分配更多规划实体初始值后再次变得不可行(-1 HARD),我注意到当施工启发式阶段结束时,optaplanner 不会执行本地搜索,而只是将不可行的解决方案报告为最终最佳解决方案。

最终的最佳解决方案不应该是所有规划实体都被分配了一个值并从那里开始检查是否终止搜索之后的解决方案吗?

我甚至有硬约束,不允许任何规划实体有空规划变量。但是在规划实体在构造启发式阶段被初始化之前,硬约束似乎没有生效。

有没有办法为未初始化的规划实体添加约束?如何让optaplanner在所有规划实体初始化后才能采取最终的最佳解决方案?

以下是我在案例中看到的日志:

2022-02-09 14:20:05,126 INFO  [org.opt.cor.imp.sol.DefaultSolver] (pool-9-thread-1) Solving started: time spent (90), best score (-30init/0hard/0soft), environment mode (REPRODUCIBLE), move thread count (NONE), random (JDK with seed 0).
2022-02-09 14:20:05,198 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (0), time spent (170), score (-28init/-2hard/-5soft), selected move count (32), picked move ([a.0 {null -> MANUAL_ASSEMBLY}, a.0 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,247 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (1), time spent (219), score (-26init/-1hard/-5soft), selected move count (33), picked move ([f.4 {null -> MANUAL_ASSEMBLY}, f.4 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,286 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (2), time spent (258), score (-24init/-1hard/-5soft), selected move count (34), picked move ([2.f {null -> MANUAL_ASSEMBLY}, 2.f {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,315 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (3), time spent (287), score (-22init/-1hard/-4soft), selected move count (35), picked move ([9.8 {null -> MANUAL_ASSEMBLY}, 9.8 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,338 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (4), time spent (310), score (-20init/-1hard/-4soft), selected move count (36), picked move ([6.c {null -> MANUAL_ASSEMBLY}, 6.c {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,362 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (5), time spent (334), score (-18init/-1hard/-4soft), selected move count (37), picked move ([8.3 {null -> MANUAL_ASSEMBLY}, 8.3 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,384 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (6), time spent (356), score (-16init/-1hard/-4soft), selected move count (38), picked move ([f.2 {null -> MANUAL_ASSEMBLY}, f.2 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,400 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (7), time spent (372), score (-14init/-1hard/-3soft), selected move count (39), picked move ([4.6 {null -> MANUAL_ASSEMBLY}, 4.6 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,415 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (8), time spent (387), score (-12init/-1hard/-3soft), selected move count (40), picked move ([8.2 {null -> MANUAL_ASSEMBLY}, 8.2 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,428 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (9), time spent (400), score (-10init/0hard/-3soft), selected move count (41), picked move ([a.4 {null -> MANUAL_ASSEMBLY}, a.4 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,440 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (10), time spent (412), score (-8init/0hard/-2soft), selected move count (42), picked move ([4.5 {null -> MANUAL_ASSEMBLY}, 4.5 {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,453 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (11), time spent (425), score (-6init/0hard/-2soft), selected move count (43), picked move ([5.d {null -> MANUAL_ASSEMBLY}, 5.d {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,474 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (12), time spent (446), score (-4init/0hard/-2soft), selected move count (44), picked move ([8.a {null -> MANUAL_ASSEMBLY}, 8.a {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,501 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (13), time spent (473), score (-2init/0hard/-2soft), selected move count (45), picked move ([6.3 {null -> MANUAL_ASSEMBLY}, 6.3 {null -> a.0}]).
2022-02-09 14:20:05,530 DEBUG [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1)     CH step (14), time spent (502), score (-1hard/-2soft), selected move count (46), picked move ([3.b {null -> MANUAL_ASSEMBLY}, 3.b {null -> Inve.0/0-0}]).
2022-02-09 14:20:05,532 INFO  [org.opt.cor.imp.con.DefaultConstructionHeuristicPhase] (pool-9-thread-1) Construction Heuristic phase (0) ended: time spent (504), best score (-1hard/-2soft), score calculation speed (1446/sec), step total (15).
2022-02-09 14:20:05,641 DEBUG [org.opt.cor.imp.loc.DefaultLocalSearchPhase] (pool-9-thread-1)     LS step (0), time spent (613), score (0hard/-2soft), new best score (0hard/-2soft), accepted/selected move count (100/100), picked move ([a.0..6.3] {f.4} <-reversing-> [8.2..f.2] {a.4}).
2022-02-09 14:20:05,642 INFO  [org.opt.cor.imp.loc.DefaultLocalSearchPhase] (pool-9-thread-1) Local Search phase (1) ended: time spent (614), best score (0hard/-2soft), score calculation speed (1010/sec), step total (1).
2022-02-09 14:20:05,644 INFO  [org.opt.cor.imp.sol.DefaultSolver] (pool-9-thread-1) Solving ended: time spent (614), best score (0hard/-2soft), score calculation speed (1120/sec), phase total (2), environment mode (REPRODUCIBLE), move thread count (NONE).
Explanation of score (-1hard/-2soft):

从日志中,它说“构建启发式阶段(0)结束:花费的时间(504),最佳得分(-1硬/-2软)”,但为什么LOCAL SEARCH会将最佳得分记为“新的最佳得分(0硬/-2硬)”,然后停止,但报告最终的最佳解决方案时会显示“得分解释(-1硬/-2软)?

共有2个答案

锺离飞鸣
2023-03-14

只有在硬分数为

根据您提供的日志,构造启发式方法使用分数 (-1hard/-2soft) 初始化解决方案。然后,本地搜索将求解进一步改进为分数(0hard/-2soft),求解器在满足终止条件时终止。

关于日志中的“分数说明”;我不认为它来自解算器运行本身。您是否有机会使用ScoreManager解释解决方案?

在求解器终止后,您可以验证您收到的最佳解决方案的分数是多少吗?

佘茂才
2023-03-14

我知道哪里出了问题。

Radovan是正确的,optaplanner将在所有规划变量初始化后使用分数。

但我的问题是,我发现规划解决方案中的解决方案得分与我使用scoreManager获得的得分不同。造成混乱。

造成这种情况的原因是,我以前有规划实体,我的约束(写在约束流中)都使用规划实体作为初始匹配语句(“.from(…)”),但后来在我的域模型中,我决定将规划实体更改为另一个类,并保留该类作为新规划实体的锚。我仍然保留了所有旧的约束条件,使用不再是规划实体的旧类,因为我认为它是锚,所以我可以跟踪所有其他规划实体。基本上,我认为在将规划实体更改为另一个类之后,我可以不必重写约束。

这导致了许多无法解释的问题,其中之一是在解决方案中的分数与scoreManager报告的分数不同。

通过这个链接我发现了这个问题:

OptaPlanner解决方案的分数与ScoreManager给出的分数不匹配::e

FULL_ASSERT后,我立即看到optaplanner在约束上报告错误。所以我花时间重写约束,现在问题消失了。

 类似资料:
  • 正如标题所说。我是Optaplanner的新开发人员。在我切换到过度约束规划之前,CH阶段工作正常:这里是CH按预期分配21个实体,LS能够找到一个最优解决方案(忽略中等得分级别): 在切换到可空规划变量后,中等得分水平对每个未分配的实体都有一个惩罚的约束。这是解决optplanner无法找到最佳解决方案的同一个问题实例的日志: null

  • 我正在为一所学校创建课程表生成器,我面临着两个挑战: 在构建启发式阶段,我没有得到任何回调传入这意味着我不能在这个阶段向用户提供任何反馈。(到今天为止只有大约10秒左右,但仍然很烦人。) 我怀疑这是设计使然(从这个问题来看),但如果我错了,请纠正我。 (我怀疑这样的想法是,构造启发式阶段无论如何都应该很快,并且99%的长时间运行的解决方案将花费在本地搜索阶段,因此这是唯一真正重要的阶段。对吗?)

  • 我正在使用Optaplanner解决一个类似于病人入院调度示例的问题。 我面临两个问题。 首先,当一个规划实体(类似于示例中的bedDesignation)被某人(而不是optaplanner)定位时,该规划实体像其他实体一样被打分。手工放置的计划实体变为不可移动的计划实体,但仍被打分为可移动的计划实体。正因为如此,它打破了一些硬性的限制。 BedDesignationPillarPartSwap

  • 对于时间窗VRP的解决方案,我编辑了已求解的XML文件并设置了< code > 我添加了一个SectionFiler类,并按照建议进行了配置。在解决的xml数据文件的末尾,我添加了一些新的未分配客户。 我预计只有新的未分配客户才会被优化并插入现有链的末尾 - 事实并非如此 - 链条被破坏了。 问题:6.2中处理不可移动客户预约的具体内容是什么? 我认为jira问题https://issues.jb

  • 我正试图用java的Optaplanner实现一个简单的云平衡系统,该系统具有过度约束的规划。 最喜欢的是,我正在尝试使用Optaplanner Java库实现一个简单的云平衡系统,该系统具有过度约束的规划。我将模型映射到我的问题(车辆和资产),进行变量替换cpuPower- 如果我使用这个简单的例子,我会收到一个所有进程都已签名的响应,尽管其中一些不能分配给计算机。对于这个问题,optaplan

  • 我正在研究来自OptaPlanner的示例用例。我也找不到任何类似的例子,可以在一个规划实体中求解多个规划变量。例如,在护士名册中,一个轮班的每个可能需要多个分配的。在这种情况下,如何利用planner和编写规则呢?