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

时间:2018-05-04 23:31:59

标签: random constraint-programming minizinc

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

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

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

我可以替代地将其框架化为优化问题,并寻找最大化与所需分布相似性的解决方案,但我更喜欢满足硬约束的东西,并从整个可能的方面做加权样本软约束的解空间。

1 个答案:

答案 0 :(得分:2)

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

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

在您的问题中,您可以使用随机选择来参考搜索策略。我相信这实际上不是你问题的答案(或者至少不是它本身)。因为随机选择搜索要么是为了满足,要么只说出它找到的第一个解决方案,这可能不满足任何软约束,否则你将不得不制定一个客观值。

正如一般建议,您可能需要考虑运行模型并将相似性约束为最小值,并查看这些是否给出了您正在寻找的答案。获得这些边界可能对搜索解决方案有很大帮助。 (设置此最小值也可能会大大提高第一种方法的性能)