[英]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是一種聲明性語言。 在一個約束條件中,你沒有說明一條指令,但你正在向解算器說明“真相”。
這意味着,像一個指令a = a + 1
不會起作用,因為就表示我們正在尋找一個值a
是它本身的價值+ 1
。 由於不存在這樣的值,我們稱模型不一致,因為找不到解。
約束項的思想是表達不同變量和參數之間的關系。 例如,你可以寫: constraint forall(i in N) (a[i] = a[i-1] + 1)
。 這意味着我們將尋找一個值a[i]
,它比i in N
所有i in N
a[i-1]
。 (注意,我們應該添加一個if語句以確保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
表示,這不違反我們的規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.