【问题标题】:cvxpy is solving to produce empty answercvxpy 正在解决产生空答案
【发布时间】:2021-06-20 20:43:21
【问题描述】:

我正在使用以下代码:

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 定义的不同值。

【问题讨论】:

    标签: python python-3.8 cvxpy convex-optimization


    【解决方案1】:

    记得在调用prob.solve() 之后尝试访问变量的值之前检查prob.value 是否有限。由于你有一个最大化问题,并且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...
    

    你会看到你的代码有效。

    【讨论】:

      【解决方案2】:

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

      prob.solve(verbose=True)
      

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

      print(prob.status)
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 2021-10-28
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        • 2020-05-31
        相关资源
        最近更新 更多