2017-09-17 3 views
1

Ich habe eine einfache Frage bezüglich der Minizinc-Syntax. Meine Eingangs .dzn Datei enthält einen Satz von 2 dimentional Arrays (etwa bis zu 30 Arrays), erklärt sich wie folgt:Minizinc, wie man eine Karte oder eine Wörterbuchdatenstruktur erstellt

rates_index_0 = array2d(1..3, 1..501, [ 15, 20, 23, .... 
rates_index_12 = array2d(1..3, 1..501, [ 21, 24, 27, .... 
... 

Anmerkung: Indexzahlen haben Lücken in ihnen (zB 12 -> 20)

In meinem Modell muss ich eines dieser Arrays abhängig vom Wert der Variablen verwenden. In der üblichen Programmiersprache würde ich es mit einer Karte oder einer Wörterbuchdatenstruktur lösen. Aber in Minizinc ich hartzucodieren dies auf folgende Weise:

function var int: get_rate(int: index, var int: load, int: dc_size) = 

     if index == 0 then 
      rates_index_0[dc_size, load] 
     else if index == 12 then 
      rates_index_12[dc_size, load] 
     else if index == 16 then 
      rates_index_16[dc_size, load] 
     else if index == 20 then 
      rates_index_20[dc_size, load] 
     else 
      assert(false, "unknown index", 0) 
     endif endif endif endif; 

Das einzige offensichtliche Problem mit diesem Code ist, dass ich brauche Modell I-Eingang ändere jedes Mal zu ändern. Gibt es einen besseren Weg, wie ich das generisch kodieren kann?

Danke!

Antwort

3

In abstrakterer Weise ist eine Map-Struktur nichts anderes als eine Funktion, die Eingaben eines bestimmten Typs einem Array zuordnet. Eine Karte kann somit durch ein Array und eine Funktion ersetzt werden. (Der Unterschied ist, dass Sie die Funktion selbst definieren müssen)

Bevor ich mit dem Rest anfange, möchte ich darauf hinweisen, dass, wenn Ihr Modell im Allgemeinen schnell kompiliert, Sie vielleicht ein Triple-Array ohne die Funktion versuchen möchten, rates_index = array3d(0..60, 1..3, 1..501, [ 15, 20, 23, ..... Dies kostet mehr Speicher, macht das Modell jedoch flexibler.

Die allgemeine Art der Verwendung einer Map-Struktur wäre die Definition einer Funktion map_index, die Ihre Eingabe, in diesem Fall ganze Zahlen, dem Index des Arrays, auch ganze Zahlen, zuordnet. Dies bedeutet, dass wir dann ein extra Ebenen-Array definieren können, um auf das richtige zu zeigen: rates_index = array3d(0..nr_arrays, 1..3, 1..501, ..... Dies bedeutet, dass der Inhalt von get_rates dann sein kann: rates_index[map_index(index), dc_size, load].

Die Funktion map_index selbst in ihrer einfachsten Form eine andere Version Ihrer if-then-else Aussagen enthalten würde:

function int: map_index(int: index) = 
    if index == 0 then 
     0 
    else if index == 12 then 
     1 
    else if index == 16 then 
     2 
    else if index == 20 then 
     3 
    else 
     assert(false, "unknown index", 0) 
    endif endif endif endif; 

auch immer Sie es dynamisch durch Erzeugen eines zusätzlichen Array mit dem Array-Nummer für jeden Index machen, setzen -1 für alle Arrays, die nicht verfügbar sind. Für Ihr Beispiel würde das Mapping wie folgt aussehen: array[0..20] of int: mapping = [0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1, -1, -1, 2, -1, -1, -1, 3];. Die map_index Funktion könnte dann dynamisch definiert werden als:

function int: map_index(int: index) = 
    mapping[index]; 
+0

OK, ich sehe, könnten Sie bitte Ihre Aussage über Kompilierung und Speichernutzung klären. Benötigt array3d (0..60, 1..3, 1..501) mehr Rechen-/Speicherressourcen als 60 array2d (1..3, 1..501)? Ich habe Ihre Lösung verstanden, im Grunde füge ich einfach mein Array2ds in ein 3d zusammen und mappe dann Indizes. Der einzige Nachteil ist, dass die Daten für Menschen schwieriger zu verstehen sind. Aber natürlich muss ich das Modell nicht ändern. Vielen Dank! – kirbo

+2

Ich denke du hast es verstanden! Zum Speicherverbrauch: 60 2d-Arrays nehmen beim Kompilieren nicht mehr Speicher auf als die kombinierten 3d-Arrays. Wenn Sie jedoch den Übersetzungsschritt nicht ausführen und zusätzliche (leere) Arrays im 3D-Array hinzufügen möchten, die nicht zu den 2D-Arrays gehören, kann der Speicherbedarf hoch sein. – Dekker

+0

hab es geschafft, danke! – kirbo

Verwandte Themen