0

对于我的模型,我有大约 120 个人和 650 个任务。我现在想用 choco 3.3.3 分配这些任务。为此,我有一个 boolMatrix "assignment" 120x650,如果任务分配给该人,则为 1,否则为 0。但现在我必须以不同的标准进行优化,例如尽量减少加班,遵守人民的意愿等等。最好的方法是什么?

我的直觉:我看不到只累积惩罚的方法,所以我的直觉是有一个矩阵,其中每个人都有一系列“惩罚”,所以如果我有加班,惩罚[i][0]有例如,惩罚 5,如果他不想执行任务,惩罚 [i][1] 有惩罚 4。然后我有一个 IntVar 分数,这是惩罚的总和,我优化分数。

  1. 惩罚矩阵是要走的路吗?
  2. 以及如何初始化这些变量?
  3. 是否可以在合理的时间内使用 choco 进行优化(每个可行的解决方案都有分数)?
    在护士调度示例中,使用了此策略:solver.set(IntStrategyFactory.domOverWDeg(ArrayUtils.flatten(assignment), System.currentTimeMillis()));
  4. 我应该使用什么策略?阅读 choco 用户指南并没有帮助我获得一个好主意......
4

1 回答 1

2

从您的问题看来,您尚未尝试实施和测试您的模型,因此我们无能为力。反正:

Q1)我没有清楚地理解你的方法,但可能有很多路要走。通过测试,您将知道它是否解决了您的问题。也许您也可以使用整数变量 x,其中 x=k 表示任务 x 由资源 k 完成。您还可以使用集合变量来收集每个资源的所有任务。

关于惩罚,您应该在想知道如何使用库对其进行编码之前,将如何以数学方式(从问题规范)正式计算它们。更一般地说,在研究如何得到它之前,你必须非常清楚和正式地说明你想要得到什么。

Q2) 要创建变量,您应该使用 VariableFactory。初始域应包含所有可能的值。

Q3)这取决于确切的问题和您的模型。据推测,是的,您可以在很短的时间内获得非常好的解决方案。如果您想要一个数学上最优的解决方案,并证明它是最优的,那么这可能会很长。

Q4) 指定搜索策略不是强制性的。选择最好的需要经验和基准测试,因此您应该尝试其中的一些来找出最适合您的情况。您还可以添加 LNS(一种本地搜索)来促进优化...

希望这可以帮助

于 2016-01-22T10:02:07.043 回答