2016-08-06 73 views
0

我得到這個決策變量:提高約束添加在Gurobi(Python的接口)的性能

x={} 
for j in range(10): 
    for i in range(500000): 
     x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%d%d" %(i,j)) 

所以我需要添加約束爲每個x [I,J]變量是這樣的:

for p in range(10): 
    for u in range(500000): 
     m.addConstr(x[u,p-1]<=x[u,p]) 

這花了我很多時間,多了12小時,然後在我的電腦上出現了缺少內存彈出窗口。 有人能helpme改善這個約束加法問題

+1

我很驚訝,當你用p = 0和p-1索引時,它不會引發錯誤。 – sascha

回答

1

一般備註:

  • 它看起來相當昂貴,一般

具體注加500萬點的限制:

方法

  • 您通過使用字典
    • 儘管有恆定訪問的複雜性是在浪費時間和空間,這些常數是大
    • 他們還浪費內存
  • 在一個簡單的2維的情況是這樣的:堅持陣列!

有效性

  • 你的索引是缺少第一個元素的邊界情況,所以索引休息!

嘗試此(更有效的方法;使用numpy的的陣列):

import numpy as np 
from gurobipy import * 

N = 10 
M = 500000 

m = Model("Testmodel") 
x = np.empty((N, M), dtype=object) 
for i in range(N): 
    for j in range(M): 
     x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%d%d" %(i,j)) 
m.update() 

for u in range(M): # i switched the loop-order 
    for p in range(1,N): # i'm handling the border-case 
     m.addConstr(x[p-1,u] <= x[p,u]) 

結果:

  • 〜2分鐘
  • 〜2.5GB存儲器(完整的程序,包括Gurobi的內部)
+0

謝謝Sascha我會立即嘗試 – jmparejaz

+0

numpy在這種情況下沒有幫助:大部分內存都是由Gurobi Var和Constr對象拍攝的。 –

+0

@GregGlockner numpy作爲一個字典當然更具有內存效率(當然,它的索引速度更快)。但當然你是對的,Gurobi的內部將主宰這個片段中的時間/記憶。出於好奇:在向量化/矩陣形式(而不是一個接一個地)中給出約束時有一些好處(我認爲它在gurobipy中可用),例如A <= B,其中A和B是矩陣=基本的庫設計 - 建模 - 像cvxpy這樣的工具,雖然它在內部推理方面與凸面有所不同)。這應該有助於內部效率,或不是? – sascha

2

很可能,您的物理內存不足並使用虛擬(交換)內存。這不會導致您的計算機報告內存不足警告或錯誤。

我重寫代碼如下:

from gurobipy import * 

m = Model() 

x={} 
for j in range(10): 
    for i in range(500000): 
    x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%d%d" %(i,j)) 
m.update() 

for p in range(10): 
    for u in range(500000): 
    try: 
     m.addConstr(x[u,p-1]<=x[u,p]) 
    except: 
     pass 
m.update() 

我測試此使用Gurobi優化6.5.2的計算機上用的Intel Xeon處理器E3-1240(3.40千兆赫)和32 GB的物理內存。它能夠在1分14秒內製定變量和限制條件。您可以使用列表來保存少量內存,但我相信Gurobi Var和Constr對象需要比Python字典或列表更多的內存。

+0

感謝Greg Glockner,現在認識到問題是因爲缺乏內存,你知道Gurobi是否可以用GPU編程來執行嗎?t – jmparejaz

+1

@jmparejaz Gurobi目前還不支持GPU編程(也許不會在不久的將來)。因此忽略了很多可以說Gurobi和GPU方法解決的問題的東西,只是讓我告訴你,使用GPU編程,內存通常只是一個更大的問題(特別是在深度學習; GPU一般來說內存比主內存更貴)。獲得工作站的32GB內存相當便宜,32GB的GPU將非常昂貴(如果存在的話)。 – sascha