Random Minizing?

Random Minizing?,random,constraint-programming,minizinc,Random,Constraint Programming,Minizinc,我试图在Minizing中实现一个稍微不寻常的约束解决问题:我有一个CSP,它有一些硬约束和一个软约束,解决方案中的关系应该具有与示例解决方案相似的统计特征。也就是说,如果输入有5个“红色”和12个“绿色”,则找到的解决方案不必正好有5个和12个,但在统计上可能有类似的分布……但也允许罕见的解决方案,例如,没有红色 虽然我可能有一个硬约束,即分布必须与分布完全匹配,或者从中获取所有可能的解决方案和样本,但我更喜欢一种搜索策略,该策略可以获得一个在统计上可能具有类似分布(但可以变化)的解决方案。或

我试图在Minizing中实现一个稍微不寻常的约束解决问题:我有一个CSP,它有一些硬约束和一个软约束,解决方案中的关系应该具有与示例解决方案相似的统计特征。也就是说,如果输入有5个“红色”和12个“绿色”,则找到的解决方案不必正好有5个和12个,但在统计上可能有类似的分布……但也允许罕见的解决方案,例如,没有红色

虽然我可能有一个硬约束,即分布必须与分布完全匹配,或者从中获取所有可能的解决方案和样本,但我更喜欢一种搜索策略,该策略可以获得一个在统计上可能具有类似分布(但可以变化)的解决方案。或者是一种与性能相当的方法

indomain random
用于
assignmentannotation
似乎可行,但据我所知,使用权重的唯一方法是使用多个值填充域,以正确的权重填充域


或者,我可以把它作为一个优化问题,并寻找一个解决方案,最大限度地提高与所需分布的相似性,但我更喜欢满足硬约束的东西,并从软约束的整个可能解决方案空间中进行加权采样。

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

  • 考虑到这个问题,您实际上可以自己处理软约束。考虑到模型相对容易求解,您可以使用
    -a
    标志仅使用硬约束运行模型,以提供所有解决方案,然后使用自定义脚本选择解决方案排名。(也许可以看看迷你锌的IPython扩展,这将使处理溶液变得容易)。这可能是最灵活的解决方案,真正让您决定如何使用软约束。我认为这种方法很适合您的问题,因为您的软约束似乎更像是解决方案的排序机制
  • 模型结合实际软约束条件,制定目标函数。软约束可以用松弛变量或布尔表达式建模。最近甚至出现了一种专门用于软约束的语言:。当使用软约束进行建模时,通常很难制定目标函数。决定哪种软约束组合比其他软约束组合更好并不容易。这种技术仍然经常被使用,因为它比第一种更有效
在您的问题中,您指的是使用随机选择的搜索策略。我相信这实际上并不能解决你的问题(或者至少不能解决问题本身)。由于使用随机选择进行搜索,或者为了满足性,只声明它找到的第一个解决方案,这可能不满足任何软约束,或者您将不得不制定一个目标值

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