在CVXOPT中制定某个LP

时间:2015-08-28 09:49:02

标签: python linear-programming cvxopt

我正在尝试使用CVXOPT解决线性程序。有2n个变量,x_1,...,x_2n。 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

我查了一下,但在我看来,调用matrix()应该将c转换为适当的类型。有谁知道如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

问题是矩阵对象的构造函数将其解释为整数类型,而它应该是double。如果使用明确的双数填充列表,它应该可以工作。

来自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'