簡體   English   中英

增量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是一種聲明性語言。 在一個約束條件中,你沒有說明一條指令,但你正在向解算器說明“真相”。

這意味着,像一個指令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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM