13.6. 分数陷阱
确保您的任何分数限制都不会导致分数陷阱。陷阱的 score 约束对多个约束匹配应用相同的权重。将这个组约束匹配在一起,并为该约束创建一个 flatlined score 功能。这可能导致解决方案状态,其中必须完成几项移动才能解决或降低该单一约束的权重。以下示例演示了分数陷阱:
- 每个操作表都需要两个文档,但您一次只移动一个文档。solver 没有激励地将文档组织移到没有文档人员的表中。要修复这个问题,请在分数函数中仅有一个 doctors 以上的表。
- 两个考试必须同时进行,但您一次只能移动一个考试。解决者必须在不移动同一迁移的情况下,将一项考试移至另一个时间插槽。要解决此问题,请添加一个粗粒度迁移,同时移动两个考试。
下图显示了分数陷阱:
如果蓝色项目从过载计算机移到空计算机,则硬分数应该提高。但是,陷阱得分的实施无法做到这一点。solver 最终应该会遇到这个陷阱,但会花费大量努力,特别是在过载计算机上有更多进程时。在这段操作之前,实际上可能开始将更多的进程移到该超载计算机中,因为这样做没有损失。
注意
避免分数陷阱并不意味着您的分数功能应该足够智能,以避免本地 optima。保留为优化算法以处理本地 optima。
避免分数陷阱意味着可以单独避免每个分数约束。
重要
始终指定责任程度。业务经常表示"如果解决方案可行,则这并不重要"。 虽然这对业务而言是如此,对分数计算而言并不重要,因为从了解解决方案不良的分数计算中受益。在实践中,软限制通常以自然方式执行此操作,而这只是出于硬限制而做的一个问题。
可以通过多种方式处理分数陷阱:
-
改进 score 约束,以区分分数权重。例如,为每个缺少的 CPU 而不是
-1hard
(如果没有任何 CPU )进行 penalize-1hard
。 -
如果业务视角不允许更改分数约束,请添加一个较低分数,分数约束。例如,如果缺少任何 CPU,在每个缺少的 CPU 上 penalize
-1
subsoft - 使用现有的细粒度移动添加粗粒度移动和取消选择它们。粗粒度移动有效执行多次移动,通过单一移动直接获得分数陷阱。例如,将多个项从同一容器移动到另一个容器。