2017-01-23 93 views
1

我有一長串基本上基於輸入數據文件的決策變量。但是,爲了方便起見,我們使用下面的示例: 我將決策變量添加到我的模型中,並且這些決策變量中的每一個都被限制在0和1之間(包括0和1之間)。我做了以下內容:(* MYLIST是數據框的在我的程序一欄,所以我用shape[0]參數不一致CPLEX錯誤Python API

model.variables.add(obj=mylist, ub=list(np.ones((1, mylist.shape[0])))), types=[model.variables.type.continuous] * len(mylist)) 

我可能誤會了Python API中如何定義模型構建。我收到了CPLEX錯誤:參數不一致。我懷疑ub給我這個問題,因爲當我刪除它時,一切正常。我應該如何正確設置ubmodel.variables.add函數中的columns參數是指什麼?

回答

1

參數ub應該是一個與obj參數大小相同的序列。因此,而不是ub=list(np.ones((1, mylist.shape[0])))),你想使用ub=[1.0]*len(mylist)ub=np.ones(len(mylist))

columns參數可用於非零添加到約束矩陣列明智的,而不是按行(後面通常會通過Cplex.linear_constraints.add方法完成)。理解columns論點的一種方法是查看文檔中的example

例如:

import cplex 
c = cplex.Cplex() 
c.linear_constraints.add(names = ["c0", "c1", "c2"]) 
c.variables.add(obj = [1.0, 2.0, 3.0], 
       types = [c.variables.type.integer] * 3) 
c.variables.add(obj = [1.0, 2.0, 3.0], 
       lb = [-1.0, 1.0, 0.0], 
       ub = [100.0, cplex.infinity, cplex.infinity], 
       types = [c.variables.type.integer] * 3, 
       names = ["var0", "var1", "var2"], 
       columns = [cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]), 
          [['c2'],[2.0]], 
          cplex.SparsePair(ind = [0, 1], val = [3.0, 4.0])]) 

c.write("example.lp") 

運行後,LP文件看起來像:

Minimize 
obj: x1 + 2 x2 + 3 x3 + var0 + 2 var1 + 3 var3 
Subject To 
c0: var0 + 3 var3 = 0 
c1: 4 var3 = 0 
c2: - var0 + 2 var1 = 0 
Bounds 
     x1 >= 0 
     x2 >= 0 
     x3 >= 0 
-1 <= var0 <= 100 
     var1 >= 1 
     var3 >= 0 
Generals 
x1 x2 x3 var0 var1 var3 
End 

如果你看一下在約束矩陣的第一行(約束 「C0」),第一列(變量「var0」)的係數爲1.0。對於第三行(約束「c2」具有索引2),第一列(變量「var0」)具有-1.0的係數。這對應於columns列表中的第一項(即,cplex.SparsePair(ind = ['c0', 2], val = [1.0, -1.0]))。

+0

非常感謝解釋!我現在慢慢習慣了API。 –

0

我做了一個小改動,那就是ub=list(np.ones(mylist.shape[0]))並且沒有錯誤。在使用model.variables.get_upper_bounds()檢查邊界之後,一切都很正常。

+0

這看起來應該是一個評論,而不是答案(參見[這裏](http://meta.stackexchange.com/questions/23211/how-do-i-add-a-comment-to-an -回答))。 – rkersh

+0

謝謝你讓我知道! :) –