2017-11-29 20 views
1

私はminizincでarroundを混乱させています。条件付き出力を達成しようとしています。配列要素の値が 'true'の場合、プログラムはこれらの要素の配列インデックスに関する情報を出力します。これは私が持っているものです。条件付き出力minizinc

include "globals.mzn"; 
int: time=5; 
int: n=3; 
int: l=n*n; 
array[1..4,0..time,1..l] of var bool: X; 
constraint X[1,5,7]=true; 
constraint X[2,5,3]=true; 
constraint X[3,5,9]=true; 
constraint X[4,5,7]=true; 
solve satisfy; 

私のようなので、連結を使用してこの問題を解決しようと試み:

output ["X_"++concat(["\(r)_\(t)_\(pos)" 
| pos in 1..l, r in 1..4, t in 0..time, where X[r,t,pos]==true])++"\n"]; 

を私は、 「MiniZinc許可されていないのですが:型エラー:なし機能や述語付きこの署名が見つかりました: `CONCAT(VARオプト文字列の配列[INT])」」

私がしたいことは、

for pos in 1..l, r in 1..4, t in 0..time 
if X[r,t,pos]==true 
    output ["X_\(r)_\(pos)_\(t)"] 
012のようなものです

どうすれば実現できますか?

答えて

2

where句の決定変数の周りにfix(...)を使用してみてください。

output ["X_"++concat(["\(r)_\(t)_\(pos)" 
| pos in 1..l, r in 1..4, t in 0..time, where fix(X[r,t,pos])==true])++"\n"]; 

fixは、決定変数の実際の値を使用する場合に(しばしば)必要です。その値を比較するなど

var opt stringについてのメッセージはおそらく誤解を招くおそれがあります)

関連する問題