优化 MiniZinc 中的多个目标

Optimise multiple objectives in MiniZinc

我是CP的新手,但我想解决我在大学遇到的问题。

我有一个 Minizinc 模型,它可以最大限度地减少执行某些任务时使用的机器数量。机器有一些资源,任务有资源需求。除了最小化这个数字,我试图最小化将任务分配给机器的成本(我有一个带有成本的数组)。有没有机会先最小化这个数字,然后再优化 Minizinc 的成本?

例如,我有 3 个任务和 2 个机器。每台机器都有足够的资源来分配 3 个任务,但我想在成本较低的地方分配任务。

抱歉我的英语不好,感谢您的帮助。如果有这样的需要我会贴上我的代码。

您所指的技术称为词典optimisation/objectives。这个想法是针对多个 objective 进行优化,其中 objective 之间有明确的排序。例如,当优化 (A, B, C) 时,我们将优化 BC,受制于 A。因此,如果我们可以提高 A 的值,那么我们将允许 BC 恶化。同样,C 也根据 B.

进行了优化

这种技术经常被使用,但目前(还)没有在 MiniZinc 中得到原生支持。然而,有一些解决方法:

  • radation 模型所示,我们可以将第一个 objective 缩放至少与第二个 objective 的最大值一样多的值(依此类推).这将确保第一个 objective 的任何改进都将胜过第二个 objective 的任何 improvement/stagnation。那么实例的结果应该是字典序最优的。
  • 我们可以将模型分成多个阶段。在每个阶段,我们只会关注一个 objective 值(从最重要到最不重要)。任何后续阶段都会 修复早期阶段的 objectives。最后阶段的解应该给你字典序最优解。
  • 一些求解器本身支持字典优化。在 std/experimental.mzn.
  • 中找到了在 MiniZinc 中使用这些词典 objectives 的一些实验性支持

请注意,词典编纂技术可能并不总是(明确地)谈论最小化和最大化;但是,您始终可以通过否定预期的 objective 值来从一个转换为另一个。