在 Minizinc 中递增变量数组元素
Increment variable array elements in Minizinc
我想对特定数组元素执行简单的递增操作:
最小的不工作示例:
array[1..2] of var 0..1: a = [0, 0];
constraint forall (i in 1..2) (
a[i] = a[i] + 1
);
output ["\(a)"];
solve satisfy;
这会产生 minizinc
输出
WARNING: model inconsistency detected
stack.mzn:3:
in call 'forall'
in array comprehension expression
with i = 1
stack.mzn:4:
in binary '=' operator expression
=====UNSATISFIABLE=====
% stack.fzn:1: warning: model inconsistency detected before search.
为什么这是模型中的不一致 -- 为什么我不能引用当前数组元素的旧值?有没有其他方法可以将当前数组元素增加 1?
我是约束求解的新手,所以我希望这不是一个非常愚蠢的问题。
了解 MiniZinc 是一种声明性语言很重要。在约束条件下,您不是在说明指令,而是在说明求解器已知的 "truth"。
这意味着像 a = a + 1
这样的指令将不起作用,因为您声明我们正在寻找 a
的值,该值是它自己的值 + 1
。由于不存在这样的值,我们称模型不一致,因为找不到解决方案。
约束项的思想是表达不同变量和参数之间的关系。例如,您可以这样写:constraint forall(i in N) (a[i] = a[i-1] + 1)
。这意味着我们将寻找一个值 a[i]
,对于所有 i in N
,它比 a[i-1]
多 1。 (请注意,我们可能应该添加一个 if-statement 以确保 i-1 保持在给定范围内)
作为一般规则:如果等号的一侧有文字,则在另一侧使用该文字会产生不一致的模型。
如果您仍想创建一个将给定数组的值增加 1 的 MiniZinc 模型,您可以使用以下模型:
set of int: N = 1..2
array[N] of int: a = [0,1];
array[N] of var int: b;
constraint forall(i in N) (
b[i] = a[i] + 1
);
由于变量 a
现在用 b
表示,这并不违反我们的规则。
我想对特定数组元素执行简单的递增操作:
最小的不工作示例:
array[1..2] of var 0..1: a = [0, 0];
constraint forall (i in 1..2) (
a[i] = a[i] + 1
);
output ["\(a)"];
solve satisfy;
这会产生 minizinc
输出
WARNING: model inconsistency detected
stack.mzn:3:
in call 'forall'
in array comprehension expression
with i = 1
stack.mzn:4:
in binary '=' operator expression
=====UNSATISFIABLE=====
% stack.fzn:1: warning: model inconsistency detected before search.
为什么这是模型中的不一致 -- 为什么我不能引用当前数组元素的旧值?有没有其他方法可以将当前数组元素增加 1?
我是约束求解的新手,所以我希望这不是一个非常愚蠢的问题。
了解 MiniZinc 是一种声明性语言很重要。在约束条件下,您不是在说明指令,而是在说明求解器已知的 "truth"。
这意味着像 a = a + 1
这样的指令将不起作用,因为您声明我们正在寻找 a
的值,该值是它自己的值 + 1
。由于不存在这样的值,我们称模型不一致,因为找不到解决方案。
约束项的思想是表达不同变量和参数之间的关系。例如,您可以这样写:constraint forall(i in N) (a[i] = a[i-1] + 1)
。这意味着我们将寻找一个值 a[i]
,对于所有 i in N
,它比 a[i-1]
多 1。 (请注意,我们可能应该添加一个 if-statement 以确保 i-1 保持在给定范围内)
作为一般规则:如果等号的一侧有文字,则在另一侧使用该文字会产生不一致的模型。
如果您仍想创建一个将给定数组的值增加 1 的 MiniZinc 模型,您可以使用以下模型:
set of int: N = 1..2
array[N] of int: a = [0,1];
array[N] of var int: b;
constraint forall(i in N) (
b[i] = a[i] + 1
);
由于变量 a
现在用 b
表示,这并不违反我们的规则。