在 CVXOPT 中制定某个 LP
Formulating a certain LP in 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 转换为适当的类型。有谁知道如何解决这个问题?
问题是矩阵对象的构造函数将其解释为整数类型,而它应该是双精度的。如果您用明确的双数填充列表,它应该可以工作。
来自 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'
我正在尝试使用 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 转换为适当的类型。有谁知道如何解决这个问题?
问题是矩阵对象的构造函数将其解释为整数类型,而它应该是双精度的。如果您用明确的双数填充列表,它应该可以工作。
来自 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'