【发布时间】:2016-12-19 02:40:02
【问题描述】:
我正在尝试以下内容作为 CVXOPT 中的学习练习。我对示例代码 here 进行了细微修改,删除了不等式约束并添加了一些等式约束。
from cvxopt import solvers, blas, matrix, spmatrix, spdiag, log, div
solvers.options['show_progress'] = False
import numpy as np
np.random.seed(1)
# minimize p'*log(p)
# subject to
# sum(p) = 1
# sum(p'*a) = target1
# sum(p'*max(a-K,a^2)) = target2
a = np.random.randint(20, 30, size=500)
target1 = 30
target2 = 0.60
K = 26
A = matrix(np.vstack([np.ones(500), a, np.array([max(x-K,x*x) for x in a])]))
b = matrix([1.0, target1, target2])
n = 500
def F(x=None, z=None):
if x is None: return 0, matrix(1.0, (n,1))
if min(x) <= 0: return None
f = x.T*log(x)
grad = 1.0 + log(x)
if z is None: return f, grad.T
H = spdiag(z[0] * x**-1)
return f, grad.T, H
sol = solvers.cp(F, A=A, b=b)
p = sol['x']
但是当我执行以下操作时:
np.sum(p)
243.52686763225338
这违反了优化的第一个约束。我无法弄清楚这里出了什么问题。 (请注意,由于我使用随机数生成变量 a,您的 np.sum(p) 会产生不同的值,但您应该观察到与我相同的违规行为。
即使我保留原始链接中的不等式约束并添加两个额外的等式约束,也违反了等式约束。
是否有任何其他我可以可靠使用的包,即维护的包?
编辑: 如果没有可行的解决方案,不应该有没有找到可行解决方案的消息吗?
【问题讨论】:
-
由于两个额外的等式约束,该问题不可行。检查解决方案,可以看到状态未知,不可行。
标签: python convex-optimization cvxopt