微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cvxpy 正在解决产生空答案

如何解决cvxpy 正在解决产生空答案

我正在使用以下代码

import sys,numpy as np
import cvxpy as cvx

if __name__ == '__main__':
    sims = np.random.randint(20,30,size=500)
    center = 30
    n = [500,1]

    # minimize     p'*log(p)
    # subject to
    #              sum(p) = 1
    #              sum(p'*a) = target1

    A = np.mat(np.vstack([np.ones(n[0]),sims]))
    b = np.mat([1.0,center]).T

    x = cvx.Variable(n)
    obj = cvx.Maximize(cvx.sum(cvx.entr(x)))
    constraints = [A @ x == b]
    prob = cvx.Problem(obj,constraints)
    prob.solve()
    weights = np.array(x.value)

这里的 x.value 是空的。我不确定如何修改我的上述设置。我正在尝试将 sims 的平均值重新调整为此处由变量 center 定义的不同值。

解决方法

首先是调试方式: 尝试使用它来查看问题所在:

prob.solve(verbose=True)

这是为了检查是否找到了解决方案:

print(prob.status)

在您的情况下,问题是不可行的,您试图解决的线性问题 - 并不总是有解决方案。您可以引入一个“eps”变量来定义您的问题所需的精度,或者使用线性代数库提前测试是否存在某些解决方案。

,

在调用 prob.value 之后尝试访问变量的值之前,请记住检查 prob.solve() 是否是有限的。由于您有一个最大化问题,而 prob.value 返回 -inf (见下面的输出),这意味着您的问题不可行:

import sys,numpy as np
import cvxpy as cvx

if __name__ == '__main__':
    sims = np.random.randint(20,30,size=500)
    center = 30
    n = [500,1]

    # minimize     p'*log(p)
    # subject to
    #              sum(p) = 1
    #              sum(p'*a) = target1

    A = np.mat(np.vstack([np.ones(n[0]),sims]))
    b = np.mat([1.0,center]).T

    x = cvx.Variable(n)
    obj = cvx.Maximize(cvx.sum(cvx.entr(x)))
    constraints = [A @ x == b]
    prob = cvx.Problem(obj,constraints)
    prob.solve()
    print(prob.value)
    weights = np.array(x.value)

输出:

-inf

来自Variable values return 'None' after solving the problem

在实践中使用优化模型时,诊断不可行性问题是一项常见任务。通常您会发现代码中存在错误,或者您会发现抽象的数学模型可能不可行(即使编码完美)。

要快速参考您的抽象数学模型是如何不可行的,而不是代码中的错误,您可以尝试替换

constraints = [A @ x == b]

constraints = [A @ x >= b] # Outputs 183.9397...

或与

constraints = [A @ x <= b] # Outputs 6.2146...

你会看到你的代码有效。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。