为什么添加硬约束会产生糟糕的解决方案?

Why does adding a hard constraint produce bad solutions?

我正在尝试使用 Optaplanner 将生产单位最佳地分配给一组承包商。目标是分配生产单位,使实际库存尽可能接近最优库存。为此,我使用了软约束,简单来说,它遵循以下基本等式:

这是我软约束评分的依据。 Optaplanner 的目的就是最小化这种差异。但是,我确实有一个硬约束,它指定了可以分配的最小生产单位。每当将此约束引入问题时,Optaplanner 都会生成低于最优的解决方案。它基本上将所有可用的生产单元分配给一个承包商,以免违反最小生产数量限制。

这确保没有承包商被分配少量的生产单位(分配 0 是可以的),但它有意想不到的后果,软约束根本没有优化。延长 运行 时间基本上只是在不同承包商之间移动整个生产单元。

这不是没有足够的生产单位的问题,因为我有大约 10000 个可用单位,而最低生产数量是 120 个。这应该足以将其分配给多个承包商并优化库存,而不是分配 10000 个单位给一个承包商。

有没有办法在 Optaplanner 完全忽略软约束的情况下包含这个硬约束?

编辑:澄清一下,硬约束仅在生产单位低于 120 时进行惩罚。 奖励高于 120 的生产单位。最大可能的硬分值为 0 .

(为简单起见,我说“将单位分配给承包商”,而实际上 Optaplanner 是“将承包商分配给单位”)

它可能陷入了深度局部最优,因为缺乏足够聪明的方法来摆脱它(而且它对于元启发式算法来说太深了,无法摆脱它)。如果您打开 DEBUG(以及后来的 TRACE)日志记录,您将看到 optaplanner 做出的决定。

尝试添加支柱变化和交换动作:

<constructionHeuristic/>
<localSearch>
  <unionMoveSelector>
    <changeMoveSelector/>
    <swapMoveSelector/>
    <pillarChangeMoveSelector/>
    <pillarSwapMoveSelector/>
  </unionMoveSelector>
</localSearch>

如果这没有帮助,您将需要自定义移动。