2012-10-06 33 views
1

我正在使用Solverstudio(使用Pulp求解程序),並且試圖從3D變量獲得2D輸出(到電子表格中)發現該變量的某些值。將3D數組更改爲包含Python/Pulp中的列表的2D數組

我用盡:

for (m,c,t) in mct:     
if Ymct[m][c][t].varValue>0: 
    Schedule[m,t]=[c] 

但因爲有一個爲幾μm超過1個C值,T的組合,它不工作。我想要列出所有m,t組合的c值。

請幫忙?

回答

0

使用collections.defaultdict作爲Schedule,你可以簡單地通過增加c s到列表:

from collections import defaultdict 

schedule = defaultdict(list) 
for (m,c,t) in mct: 
    if Ymct[m][c][t].varValue>0: 
    schedule[(m,t)].extend([c]) 

(順便說一句,你應該正確地根據PEP8命名變量具體來說,使用under_store變量名和。函數名和CapWords類名)


更新:

要編寫defaultdict到CSV,您可以考慮以下方法:導入CSV

from collections import defaultdict 

schedule = defaultdict(list) 
schedule[1, 1] = [2, 3, 4] 
schedule[1, 2] = [3, 4, 5] 
schedule[1, 3] = [4, 5, 6] 
schedule[1, 4] = [5, 6, 7] 

with open("data.csv", "wb") as f: 
    csv.writer(f).writerows([k, ] + v for k, v in schedule.iteritems()) 

另外,我想知道如果LpVariable.varValue可以返回列表。如果是這樣,則follwoing變化應該工作:

#schedule=defaultdict(list) 
schedule = LpVariable.dicts("schedule", (moderator, time)) 

# ... many lines ... 

for (m,c,t) in mct: 
    if Ymct[m][c][t].varValue>0: 
     #schedule[(m,t)].extend([c]) 
     schedule.setdefault(m, {}).setdefault(t, []).append(c) 

# List entries in model output area 
for (m,t) in mt: 
    if len(schedule[(m,t)])>0: 
     print (m,t), schedule[m][t] 
     #print (m,t), schedule[(m,t)] 

# ... many lines ... 

for (m,t) in mt: 
    timetable[m,t]=schedule[m][t].varValue 
    #timetable[m,t]=schedule[m,t].items() 

你可以在這裏閱讀在改變的代碼:http://pastebin.com/UCVjqRwQ

+0

感謝很多答案(和提醒)。 Im新的python,因爲我只用它來解決excel中的線性模型(使用solverstudio,但使用ironpython求解器)。 我現在使用: 從集合導入defaultdict 時間表= defaultdict(列表) 在MCT(M,C,T): 如果Ymct [M] [C] [T] .varValue> 0: (m,t),如果len(schedule [(m,t)])> 0,則表示(m,t)時間表[(米,噸)] –

+0

林不知道如果我做錯了什麼,但它仍然不會允許我將列表添加到我的工作簿中的單元格(並且它沒有添加時,我使用此代碼)。我在電子表格的某個範圍上定義了計劃[(m,t)],但沒有任何更改。我甚至不確定solverstudio(有紙漿)是否允許在單元格中列出:S 我至少可以使用「print」命令在模型輸出部分獲得答案。這比我想象的要好:D 如果您對我可能做錯的任何其他想法,請讓我知道 –

+0

@MarilizevanBuisbergen沒有解決方案中如何使用Schedule的代碼,恐怕我將無法分辨爲什麼它不會允許您將列表添加到單元格中。 –