2015-08-28 120 views
2

我正在嘗試用CVXOPT解決一個線性程序。有2n個變量,x_1,...,x_2n。 LP的形式是在CVXOPT中制定某個LP

min x_{n+1}+...+x_{2n}

s.t. Ax \leq b

這裏,A和b是固定的。從這裏看起來很直接。由於我正在優化後半部分變量的總和,因此我創建了一個包含n個零和n個向量的向量:c =(0,...,0,1,...,1),並具有以下代碼假設A和b是已經計算):

c = [1]*(2*k + 2) 
for i in range(k + 1): 
    c[i] = 0 
c = matrix(c) 
sol=solvers.lp(c,A,b) 
print(sol['x']) 

該代碼是直接從CVXOPT文檔。不過,我得到一個錯誤說:

TypeError: 'c' must be a dense column matrix 

我看這件事,但在我看來,調用矩陣()應該已轉化的C爲適當的類型。有誰知道如何解決這一問題?

+0

我沒有解釋什麼是K,但我認爲這應該與這個問題無關。如果我錯了,請告訴我。 –

回答

3

問題是矩陣對象的構造函數將其解釋爲整數類型,而它應該是雙精度型的。如果你用明確的雙數填充你的列表,它應該工作。

從cvxopt的source code

if type(c) is not matrix or c.typecode != 'd' or c.size[1] != 1: 
    raise TypeError("'c' must be a dense column matrix") 

檢查..

import cvxopt 
k = 20 
c = [1]*(2*k + 2) 
for i in range(k + 1): 
    c[i] = 0 

c = cvxopt.matrix(c) 
print c.typecode # Prints 'i' 

解決方案:

c = [1.]*(2*k + 2) 
print c.typecode # Prints 'd' 
+0

謝謝!我認爲這可能是答案。然而,在做出這個改變之後,我得到一個錯誤:TypeError:'G'必須是一個密集或稀疏的'10'列矩陣。 –

+0

我看到有關於此錯誤的一個stackoverflow問題,但我沒有看到該線程和這個之間的許多相似之處。你對此有何看法? –

+0

這是一個不同的錯誤,因爲它與您定義矩陣「A」的方式有關。你能否檢查一下'A'被定義爲類型'd'(我們上面做了什麼)並且它具有正確的維數? – Ioannis