2017-06-06 114 views
0

我正在使用Python和Gurobi,並且在如何優化查詢字典的可變解決方案方面存在困難。Gurobi和Python:如何使用最優變量解決方案查詢字典

my_dict = {(i, j) : func(Z) for i in I for j in J} 

my_dict結果是這樣的:

{(15687, 'B'): [[7, 0, 0, 0], [0, 7, 0, 0], [0, 0, 7, 0], [0, 0, 0, 7]], 
    ... 
(18906, 'C'): [[4, 0, 0, 3], [3, 0, 0, 3], [4, 0, 0, 0], [3, 0, 0, 0]} 

此外我有一個二進制變量x [I,J,Z]和分配約束:

assignment = m.addConstrs((quicksum(x[i, j, z] 
            for z in range(len(my_dict[i, j]))) == 1 
            for i in I for j in J), "assignment") 

假設我獲得作爲最佳解決方案變量

x[15687,'B',0] 1.000000 
x[18906,'C',2] 1.000000 

有沒有辦法檢索my_dict對應於「z」索引的子列表? (例如,如果我的解決辦法是x[18906,'C',2] 1.000000則z = 2,我想獲得的子表[4, 0, 0, 0]

回答

0

你的代碼是不是真的一個很好的小例子,一起工作,所以很難張貼有效的代碼。

一般問題看起來並不難。

如果你原來的字典是這樣的:

{(15687, 'B'): [[7, 0, 0, 0], [0, 7, 0, 0], [0, 0, 7, 0], [0, 0, 0, 7]], 
    ... 
(18906, 'C'): [[4, 0, 0, 3], [3, 0, 0, 3], [4, 0, 0, 0], [3, 0, 0, 0]} 

和您的解決方案是my_dict_opt,也許這樣的事情應該做的(python3):

import numpy as np # easy fp-math comparison 

sublists = [] 
for key, val in my_dict.items(): 
    n_vars = len(val) # my assumption 
    for i in range(n_vars): 
     if np.isclose(my_dict_opt[key + tuple([i])].X, 1.0): # depends on your dict if .X is needed 
      sublists.append(my_dict[key][i]) 

因爲類型的字典中,元素的順序在子列表中沒有定義,這應該只是一個原型,因爲我不清楚這些字典是如何用於你的。

+0

謝謝你的答案,但如果可能,我想避免使用numpy。我對python很陌生,在理解你的解決方案時遇到了問題。此外Gurobi不支持Python 3,所以我使用Python 2.7 – Zeno

+0

(1)np只是爲了保存fp數學。你可以自己做。非最佳(但工作)版本:'''eps = 1e-3; if(abs(x-1.0)<= eps)'''。原因是,你可能想把0.9999當作1,你絕對不應該在花車上進行天真的平等檢查。 (2)Gurobi支持python 3! (3)py2和py3之間的區別僅僅是字典 – sascha

+0

謝謝@sascha,但不幸的是你的解決方案不起作用。我不知道我是否犯了一些使用它的錯誤,但我得到TypeError:只能連接元組(不是「int」)到元組 – Zeno