从 Minizinc 中的加权约束求解中抽样?

Sampling from weighted constraint solving in Minizinc?

我试图在 MiniZinc 中实现的稍微不寻常的约束解决问题:我有一个 CSP,它有一些硬约束和一个软约束,解决方案中的关系应该与示例解决方案具有统计上相似的配置文件。也就是说,如果输入有 5 'red' 和 12 'green',找到的解决方案不必恰好有 5 和 12,但在统计上应该有类似的分布......但也允许罕见的解决方案,例如,没有红色。

虽然我可能有一个严格的约束,即分布必须与分布完全匹配,或者从中获取所有可能的解决方案和样本,但我更喜欢一种可以获取 one 统计上可能具有相似分布(但可以变化)的解决方案。或性能等效的方法。

indomain random 用于 assignmentannotation 似乎可行,但根据我的理解,使用加权的唯一方法是用多个值填充域以填充域具有正确的权重。

或者,我可以将其构建为一个优化问题,并寻找一个解决方案来最大化与所需分布的相似性,但我更喜欢满足硬约束并从整个可能的样本中进行加权采样的解决方案软约束的解决方案 space。

对于大多数优化求解器来说,处理软约束可能是一个相当大的挑战。它通常取决于优化的应用,处理软约束的最佳方法是什么。我认为对于你的问题有两种方法:

  • 鉴于这个问题,您似乎实际上可以自己处理软约束。鉴于该模型相对容易解决,您可以 运行 使用 -a 标志仅具有硬约束的模型,为您提供所有解决方案,然后 select 使用解决方案排名自定义脚本。 (也许可以看看 MiniZinc 的 IPython 扩展,这将使解决方案的处理变得容易)。这可能是最灵活的解决方案,真正让您决定如何使用软约束。我认为这种方法很适合您的问题,因为您的软约束似乎更像是解决方案的排名机制。
  • 用实际的软约束建模并制定一个 objective 函数。可以使用松弛变量或布尔表达式对软约束进行建模。最近甚至出现了一种专门用于软约束的语言:MiniBrass。当使用软约束建模时,通常很难制定 objective 函数。决定哪种软约束组合比其他组合更好并不容易。这种技术仍然经常使用,因为它比第一种更有效。

在您的问题中,您指的是使用随机 selection 的搜索策略。我相信这实际上并不能解决您的问题(或者至少不能单独解决)。由于使用随机 selection 进行搜索,为了满足性,只能说明它找到的第一个解决方案,这可能不满足任何软约束,或者您无论如何都必须制定一个 objective 值。

正如一般建议,您可能需要考虑 运行 调整模型并将相似性限制为最小值,然后查看这些是否能提供您正在寻找的答案。获得这些界限可能对寻找解决方案有很大帮助。 (设置这个最小值也可能会大大提高第一种方法的性能)