質問
文字列の MiniZinc 配列が与えられた場合:
int: numStats;
set of int: Stats = 1..numStats;
array[Stats] of string: statNames;
... MiniZinc データ ファイルから読み込まれたデータ:
numStats = 3;
statNames = ["HEALTH", "ARMOR", "MANA"];
配列内の特定の文字列のインデックスを調べるにはどうすればよいですか? たとえば、その ARMOR は位置 2 にあります。
コンテキスト
ステータスに関するいくつかの制約に関して、アイテムの最適な選択を見つける必要があります。この情報は、次のように宣言された 2D 配列に格納されます。
int: numItems;
set of int: Items = 1..numItems;
array[Items, Stats] of float: itemStats;
したがって、たとえば、選択したアイテムから得られる ARMOR の最小量に関する制約を記述するには、ARMOR が内部配列にインデックス 2 を持っていることを知る必要があります。
データ ファイルは外部プログラムによって生成され、統計の数と順序は動的であるため、制約でインデックスをハードコードすることはできません。
1つの解決策(私の場合は機能しません)
MiniZincチュートリアルでは、興味深いトリックを使用して同様のことを実現しています。
set of int: Colors = 1..3;
int: red = 1;
int: yellow = 2;
int: blue = 3;
array[Colors] of string: name = ["red", "yellow", "blue"];
var Colors: x;
constraint x != red;
output [ name[fix(x)] ];
残念ながら、MiniZinc データ ファイルでは変数宣言が許可されていないため、このトリックは私の場合には機能しません。