gpt4 book ai didi

constraint-programming - 在 Minizinc 中增加变量数组元素

转载 作者:行者123 更新时间:2023-12-03 23:22:08 25 4
gpt4 key购买 nike

我想对特定的数组元素执行简单的增量操作:

最小不工作示例 :

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 是一种声明性语言。在约束中,您不是在说明指令,而是在说明求解器所知道的“真相”。

这意味着像 a = a + 1 这样的指令将不起作用,因为您声明我们正在寻找 a 的值那就是它自己的值(value) + 1 .由于不存在这样的值,我们称模型不一致,因为找不到解决方案。

约束项的思想是表达不同变量和参数之间的关系。例如,您可以写:constraint forall(i in N) (a[i] = a[i-1] + 1) .这意味着我们将寻找一个值 a[i]a[i-1] 多 1所有 i in N . (请注意,我们可能应该添加一个 if 语句以确保 i-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 ,这不违反我们的规则。

关于constraint-programming - 在 Minizinc 中增加变量数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49272969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com