0

我的 Minizinc 程序中有两组变量。第一组中的每个变量都必然有几个约束,但第二组中的变量仅通过它们与第一组中的变量的交互而受到隐式约束。这意味着第二组中的每个变量可能具有从 0 到 ~8 的任何约束,具体取决于第一组中的变量所取的值。

我看到有一种方法可以通过dom_w_deg搜索注释在搜索时引用放置在变量上的约束数量,但我想知道是否有任何方法可以在运行时访问这些信息?我想这样做是因为我想指定与已经放置在变量上的约束数量相关的附加约束。

我意识到这是一个奇怪的问题,我可能以错误的方式处理整个事情,但我一直在努力解决这个问题一段时间,所以我想我会问。

4

1 回答 1

3

作为一般规则,我认为您正在错误地处理您的问题。我可以识别出导致这种情况的方法中有几个误解:

  • 不同的求解器后端可能会对模型做非常不同的事情以及如何解决它
  • “约束”对于求解器来说不是一个有意义的概念。单个约束可能是后端求解器中的多个传播器,单个传播器,甚至只是覆盖多个约束的传播器的一部分(假设它是基于传播器的后端)。
  • 约束模型具有单调行为,因此您无法根据连接到变量的约束数量以明确且有意义的方式更改模型。
  • 鉴于约束映射到单个传播器,它可能仍然具有非常不同的传播强度,这意味着它可能在求解过程的早期或非常晚期完成。

在不知道您实际尝试实现什么的情况下,作为一种通用技术,您可能对使用具体化感兴趣,其中约束的真实性反映到二进制布尔变量上。一般来说,最好的做法是尽可能少地进行具体化,因为它不会传播太多,但有时需要它。

作为使用物化的一个非常简单的例子,这是一个(可能不是很好)模型,它试图最大化满足的约束数量。

set of int: Domain = 1..10;
var Domain: x;
var Domain: y;
var Domain: z;
array[1..3] of var bool: holds;
constraint holds[1] <-> x < y;
constraint holds[2] <-> y < z;
constraint holds[3] <-> z < x;
var int: goal;
constraint goal = sum(holds);
solve maximize goal;
于 2022-01-17T09:28:24.527 回答