簡體   English   中英

MiniZinc 約束:變量集 = 關聯域集

[英]MiniZinc Constraint: set of variables = set of associated domains

我對 MiniZinc 非常陌生,並嘗試 model 我覺得應該是一個簡單的約束但是我真的很難理解語法和查看各種文檔讓我更加困惑。

基本上我想將特定的變量集約束到它們相關域的特定集,在我的例子中只是 0..1。 這是我想要實現的一個非工作示例:

set of int: DOMAIN = 0..1;

var DOMAIN: x11;
var DOMAIN: x12;
var DOMAIN: x13;
var DOMAIN: x21;
var DOMAIN: x22;
var DOMAIN: x23;

% obviously these constraint don't work but this is the gist is what i'm going for
constraint [x11, x12, x13] = [1, 0, 1] \/ [1, 0, 0] \/ [0, 1, 0]; 
constraint [x11, x21] = [1,0] \/ [1,1];
% ... etc (ultimately every variable will appear in 2 constraints and this situation
% represents a grid of 1's and 0's)

(然后我只想使用solve satisfy;簡單地將變量分配給 0..1 以便滿足所有約束)

對於草率的解釋,我深表歉意,但正如您所知,我顯然對此很陌生。 如果有人可以幫助我制定這些約束,我將不勝感激 - 我認為我已經大大簡化了語法,不確定是否會涉及表約束?

正如@sascha 所說,當有很多選擇時,使用表約束可能是最好的選擇。 您的約束可以寫成:

constraint table([x11, x12, x13], [|
    1,0,1 |
    1,0,0 |
    0,1,0 |
|]);
constraint table([x11, x21], [|
    1,0 |
    1,1 |
|]);

如果有許多(小)(布爾)表約束,那么對於某些求解器來說,直接使用 Boolean 子句可能更有效。 此語法實際上與您的非工作示例非常相似:

constraint [x11, x12, x13] = [1, 0, 1] \/ [x11, x12, x13] = [1, 0, 0] \/ [x11, x12, x13] = [0, 1, 0]; 
constraint [x11, x21] = [1,0] \/ [x11, x21] = [1,1];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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