0

我正在使用 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))
4

1 回答 1

0

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

于 2018-06-22T16:21:24.473 回答