输入顺序和评分

Input order and scoring

各位 OptaPlanner 爱好者,您好,

在我的公司,我们正在尝试构建基于 OptaPlanner 的产品,但我们 运行 陷入了令人抓狂的境地。我们有大约 15 个约束,具有不同的惩罚和权重。

我们的主要问题是,似乎 有时 ,尤其是在非常明显的情况下,OP 不会将实体移动到满足我们评分系统的位置。我们手动检查每个案例,我们总是问自己:“为什么它不能把实体 X 放在这里???”。

在每个有问题的情况下,如果 OP 只是将某些实体移动到正确的位置,所有约束都将得到满足,并且分数将是 0/0/0 或更好。它似乎很早就决定,在它的计划中,某些实体永远不能移动到或移动回某些位置。

另一个复杂的因素是有时如果我们改变输入顺序,问题就会解决。

总的来说,似乎 OP 使用的引擎盖下有一个我们无法理解的魔法。在我开始将代码转储到这个问题之前,有人可以提供一些评论吗?

非常感谢, 乔

这个问题很含糊,所以答案也很含糊。

最重要的一点:没有办法保证 OptaPlanner 会找到任何特定的解决方案,无论好坏。如果我们知道如何进行搜索 space 并得出解决方案,那么我们一开始就不需要 OptaPlanner。

您提到的幕后“魔法”是随机性。除非您使用 REPRODUCIBLE 环境模式(或在未生产时使用断言模式),否则 OptaPlanner 将永远不会在无数可能的解决方案中采用相同的路径。 OptaPlanner 无法知道是否会有更好的解决方案。它只会尝试随机更改,然后看看会发生什么。它将使用一些智能启发式算法来猜测从那里开始的最佳方式。

OptaPlanner 的搜索方式 space 在很大程度上是随机的,仅受约束的引导。你需要小心谨慎地设计你的约束。我认为最重要的是确保您不会引入分数陷阱。分数陷阱是两种截然不同的解决方案导致相同分数的情况。如果分数相同,则认为解决方案具有同等质量。如果你,作为一个人,可以看到两个解决方案在质量上不同但它们的分数相同,我建议你弄清楚如何将你的洞察力转化为约束。

一旦您的约束尽可能最好地描述了您的问题,下一个目标就是评分函数的性能。 OptaPlanner 会找到好的解决方案,前提是它有足够的时间进行搜索。一种方法是给它几个小时或几天。另一种方法是加快评分功能。这本身就是一个主要话题,在不了解问题具体情况的情况下,真的不可能在这里给出建议。一条通用准则:如果您的平均分数计算量大约为每秒数百或更低,那么您需要做一些工作来帮助 OptaPlanner 帮助您。您每秒可以处理的随机变化越多,在相同的计算时间下找到好的解决方案的机会就越大。

最后,我要谈谈你关于输入顺序的观点。是的,每次改变输入顺序,OptaPlanner都会给出不同的结果。即使你选择 REPRODUCIBLE 环境模式——因为你的问题由于输入顺序突然不同了。为避免这种情况,您应该使订单保持一致,或者您应该研究 planning entity difficulty and planning value strength 为您做同样的事情。

编辑:OptaPlanner 的一个缺点是,在小数据集上,我们可能(由于随机性的性质)错过看似明显的好解决方案,而人类会发现这一点。在这些小数据集上,使用蛮力是一种明显的方法 - 例如参见 [​​=13=]。但随着数据集变得越来越大,这将无法扩展,OptaPlanner 的本地搜索将大大优于任何人类所能做的任何事情。这就是 OptaPlanner 的闪光点,也是它应该被使用的地方。