作为一般规则,我认为您正在错误地处理您的问题。我可以识别出导致这种情况的方法中有几个误解:
- 不同的求解器后端可能会对模型做非常不同的事情以及如何解决它
- “约束”对于求解器来说不是一个有意义的概念。单个约束可能是后端求解器中的多个传播器,单个传播器,甚至只是覆盖多个约束的传播器的一部分(假设它是基于传播器的后端)。
- 约束模型具有单调行为,因此您无法根据连接到变量的约束数量以明确且有意义的方式更改模型。
- 鉴于约束映射到单个传播器,它可能仍然具有非常不同的传播强度,这意味着它可能在求解过程的早期或非常晚期完成。
在不知道您实际尝试实现什么的情况下,作为一种通用技术,您可能对使用具体化感兴趣,其中约束的真实性反映到二进制布尔变量上。一般来说,最好的做法是尽可能少地进行具体化,因为它不会传播太多,但有时需要它。
作为使用物化的一个非常简单的例子,这是一个(可能不是很好)模型,它试图最大化满足的约束数量。
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;