2017-09-17 99 views
1

我有一個關於Minizinc的語法的簡單問題。我的.dzn文件輸入包含一組2門維陣列(約高達30陣列),聲明如下:Minizinc,如何創建地圖或字典數據結構

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

注:索引號中都有間隙(例如,12 - > 20)

在我的模型中,我需要根據變量的值使用這些數組中的一個。在通用編程語言中,我會使用映射或字典數據結構來解決它。但在Minizinc我以下列方式硬編碼的:

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; 

這段代碼的一個明顯的問題是,我需要每個更改輸入時間來改變模式。有沒有更好的方式如何以通用的方式編碼?

謝謝!

回答

3

以更抽象的方式,映射結構不過是一種將某種類型的輸入映射到數組的功能。因此地圖可以被數組和函數取代。 (不同之處在於你必須自己定義函數)

在我開始研究其餘的內容之前,我想指出,如果你的模型編譯速度一般很快,你可能想嘗試一個沒有函數的三元數組, rates_index = array3d(0..60, 1..3, 1..501, [ 15, 20, 23, ....。這會花費更多的內存,但會使模型更加靈活。

使用映射結構的一般方法是定義一個函數map_index,它將輸入(本例中爲整數)映射到數組的索引和整數。這意味着我們可以定義一個額外的水平數組來指向正確的數組:rates_index = array3d(0..nr_arrays, 1..3, 1..501, ....。這意味着get_rates的內容可以是:rates_index[map_index(index), dc_size, load]

以最簡單的形式將包含您if-then-else語句的另一個版本的功能map_index本身:

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; 

但是你可以把它通過動態產生,包含每個索引的序列號一個額外的陣列,把-1對於所有不可用的陣列。對於您的示例,映射將如下所示: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];。然後,map_index函數可以動態地定義爲:

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

好的,我明白了,請您澄清一下關於編譯時間和內存使用情況的聲明。 array3d(0..60,1..3,1..501)比60 array2d(1..3,1..501)需要更多的計算/內存資源嗎? 我明白你的解決方案,基本上我只是將我的array2ds合併到一個3d中,然後映射索引。唯一的缺點是數據對於人類來說更難以理解。但是現在我不需要改變模型。謝謝! – kirbo

+2

我想你明白了!關於內存消耗:60二維數組在編譯期間不會佔用比組合的三維數組更多的內存。但是,如果您不想執行轉換步驟並選擇在3d數組中添加不在2d數組之間的額外(空)數組,則可能會有大的內存開銷。 – Dekker

+0

明白了,謝謝! – kirbo