获取 MiniZinc 中变量的附加约束数

Get number of attached constraints on a variable in MiniZinc

我的 Minizinc 程序中有两组变量。第一组中的每个变量都必须对其施加多个约束,但第二组中的变量仅通过它们与第一组中变量的交互而受到隐式约束。这意味着第二组中的每个变量可能有 0 到 ~8 个约束,具体取决于第一组中变量采用的值。

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

我意识到这是一个奇怪的问题,我可能以错误的方式处理了这整件事,但我已经为这个问题苦苦思索了一段时间,所以我想我会问。

一般来说,我认为您错误地解决了问题。我可以确定导致这种情况的方法中有几个误解:

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

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

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

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;