Python 在CVXOPT中构造一个LP
我试图用CVXOPT解一个线性规划。有2n个变量,x_1,…,x_2n。LP的形式为 最小x{n+1}+…+x{2n} s、 t.Ax\leq b 这里,A和b是固定的。从这里看来这很简单。由于我在优化后半部分变量的和,我创建了一个由n个零和n个一组成的向量:c=(0,…,0,1,…,1),并有以下代码(假设已经计算了a和b): 此代码直接来自CVXOPT文档。然而,我得到一个错误,说:Python 在CVXOPT中构造一个LP,python,linear-programming,cvxopt,Python,Linear Programming,Cvxopt,我试图用CVXOPT解一个线性规划。有2n个变量,x_1,…,x_2n。LP的形式为 最小x{n+1}+…+x{2n} s、 t.Ax\leq b 这里,A和b是固定的。从这里看来这很简单。由于我在优化后半部分变量的和,我创建了一个由n个零和n个一组成的向量:c=(0,…,0,1,…,1),并有以下代码(假设已经计算了a和b): 此代码直接来自CVXOPT文档。然而,我得到一个错误,说: TypeError: 'c' must be a dense column matrix 我查了一下,但在
TypeError: 'c' must be a dense column matrix
我查了一下,但在我看来,调用matrix()应该将c转换为适当的类型。有人知道如何解决这个问题吗?问题是矩阵对象的构造函数将其解释为整数类型,而它应该是双精度的。如果您用显式的双倍数字填充列表,它应该可以工作 从cvxopt的
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'
我没有解释k是什么,但我认为这与这个问题无关。如果我错了,请告诉我。谢谢!我认为这可能是答案。然而,在做了这个更改之后,我得到了一个错误:TypeError:'G'必须是一个密集或稀疏的'd'矩阵,有10列。我看到关于这个错误有一个stackoverflow问题,但我没有看到这个线程和这个线程之间有多少相似之处。您对此有什么见解吗?这是一个不同的错误,因为它与您定义矩阵
a
的方式有关。您能检查一下A
是否定义为d类型(我们在上面所做的)并且它的维度数量是否正确吗?A的类型代码是否为“d”,维度是否已签出。A中的列数是10,与错误似乎所说的相反。在这一点上,也许最好打开一个新的线程,是吗?我建议这样做。然后,它将有一个完整的描述,并对社区有更多的可见性。我敢打赌,很多使用cvxopt的人也会犯类似的错误。。
c = [1.]*(2*k + 2)
print c.typecode # Prints 'd'