python - 只有等式约束的 CVXOPT

标签 python convex-optimization cvxopt

我正在尝试以下内容作为 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) 将生成不同的值,但您应该观察到与我相同的违规行为。

即使我保留原始链接中的不等式约束并添加两个额外的等式约束,也会违反等式约束。

是否有任何其他我可以可靠地使用的包,即维护的包?

编辑: 如果没有可行解,是不是应该提示找不到可行解?

最佳答案

作为@tihom评论这个问题是不可行的。你真的确定这是你要解决的问题吗?您的第一个约束意味着:

p1 + p2 + ... + pn = 1
p1*a1 + p2*a2 + ... + an*pn = 30
p1*a1^2 + p2*a2^2 + ... pn*an^2 = 0.6

由于 ai >= 20 对于所有 i,最后一个约束永远不能与第一个或第二个约束同时满足。也就是说,总和 p1*a1^2 + p2*a2^2 + ... pn*an^2 总是大于其他总和(注意 pi > 0).

如果你让 target1 = sum(a/500.)target2= sum(a*a/500.) 存在满足你的约束的点,你可以找到最优解。

请注意,在最后一个约束中,最大值简化为 max(a - K, a^2) = a^2,这与 a 无关。

编辑:如果您检查解决方案(例如,print sol),您将得到如下内容:

{'status': 'unknown', 'zl': <0x1 matrix, tc='d'>, 'dual slack': 1.0000000000000007, 'relative gap': 0.005911420508296136, 'dual objective': -97.17320604198335, 'snl': <0x1 matrix, tc='d'>, 'gap': 0.9737154924375709, 'primal objective': -164.7176835197311, 'primal slack': 0.9737154924375703, 'znl': <0x1 matrix, tc='d'>, 'primal infeasibility': 0.5114570271204905, 'dual infeasibility': 0.5091221046374248, 'sl': <0x1 matrix, tc='d'>, 'y': <3x1 matrix, tc='d'>, 'x': <500x1 matrix, tc='d'>}

注意 status'unknown',即没有找到可行的解决方案。这在 cvxopt.solvers.cp 的文档中:http://cvxopt.org/userguide/solvers.html?highlight=cp#cvxopt.solvers.cp

关于python - 只有等式约束的 CVXOPT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215080/

相关文章:

python - 如何找到 Seaborn 版本

python - 在具有实际值的 cvxpy 中检查约束是可以的

python - cvxpy 正在解决产生空答案

python - Pandas:与 cvxopt 矩阵之间的转换

python - 将 numpy 向量转换为 cvxopt

python - 使用 python 和 matplotlib 绘制 Excel 工作表?

python - 使用numpy进行非最大抑制的2D峰发现

python - Odoo - 更改继承 View 上的域

r - 受范数不等式约束的二次函数最小化

python - mac 上的 cvxopt 问题//架构不兼容