CVXPY在凸程序上给出的无穷大目标值

时间:2018-06-22 15:32:31

标签: cvxpy

我正在使用cvxpy解决凸问题。约束很简单,有3个变量,但我们可以消除一个。目标是凸的,涉及熵和对数。从变量具有期望值的意义上讲,该解决方案是正确的。然而,目标值应约为-1.06,但是它是无限的。评估涉及的表达式是否存在错误?

#!/usr/bin/env python3

import cvxpy as cx
import numpy as np

from math import log

def entr(x):
    return -x * log(x)


def check_obj(a, b, c):
    return -entr(2.0) + -2.0 * log(2.0) + -entr(1.0 + a) + -1.0  + a * log(2.0) + -entr(2.0 + a) -2.0  + a * log(1.0)  -entr(1.0  + a + b + c) + -1.0 + a + b + c * log(2.0) + -entr(2.0) + -2.0 * log(2.0) + -entr(1.0 + b) -1.0  + b * log(2.0) + -entr(2.0 + b) + -2.0 + b * log(1.0)  -entr(1.0 + b + a + c) -1.0 + b + a + c * log(2.0)

a = cx.Variable(name='a')
b = cx.Variable(name='b')
c = cx.Variable(name='c')
obj = -cx.entr(2.0) + -2.0 * cx.log(2.0) + -cx.entr(1.0 + a) + -1.0  + a * cx.log(2.0) + -cx.entr(2.0 + a) -2.0  + a * cx.log(1.0)  -cx.entr(1.0  + a + b + c) + -1.0 + a + b + c * cx.log(2.0) + -cx.entr(2.0) + -2.0 * cx.log(2.0) + -cx.entr(1.0 + b) -1.0  + b * cx.log(2.0) + -cx.entr(2.0 + b) + -2.0 + b * cx.log(1.0)  -cx.entr(1.0 + b + a + c) -1.0 + b + a + c * cx.log(2.0)

p = cx.Problem(cx.Minimize(obj), [0 <= a, 0<= b, 0 <= c, a + b + c == 1])
p.solve()

# should be 'optimal' and indeed it is
print(p.status)

# the following two values should be the same, but p.value is infinite and should be around -1.06
print(p.value)
print(check_obj(a.value, b.value, c.value))

1 个答案:

答案 0 :(得分:0)

它看起来像是熵原子中的错误。我修复了它,并提出了拉取请求here。现在已合并。如果您使用master分支中最新的cvxpy运行代码,则应给出正确的结果。