代码之家  ›  专栏  ›  技术社区  ›  jlewk

scipy.linprog可行性的Bug?(A_ub@x0<=b_ub).all()为True,但--linprog(np.zeros_like(x0),A_ub=A_ub,b_ub=b_ub

  •  0
  • jlewk  · 技术社区  · 1 年前

    有numpy,scipy的版本

    numpy 1.25.0
    scipy 1.11.0
    

    以下内容 scipy.optimize.linprog 呼叫

    import numpy as np
    from scipy.optimize import linprog
    
    A_ub = np.array(
          [[-0.15729144,  0.29943807,  0.29311432],
           [-1.32475528, -2.1125364 , -1.55138585],
           [ 1.00861965,  0.53283629, -0.14939833],
           [ 1.07581479,  0.164022  , -1.19889684]])
    
    b_ub = -np.ones(4)
    
    print(linprog(np.zeros(3),
            A_ub=A_ub,
            b_ub=b_ub))
    
    

    返回不可行状态,

           message: The problem is infeasible. (HiGHS Status 8: model_status is Infeasible; primal_status is At lower/fixed bound)
           success: False
            status: 2
               fun: None
                 x: None
               nit: 0
    

    但这个问题实际上是可行的,因为

    x0 = np.array([ 229.1748166 , -507.05266751,  512.14005547])
    print('x0 is feasible?', (A_ub @ x0 <= b_ub).all())
    

    返回True。不应该 linprog 在这种情况下返回一个可行的点和不同的状态代码和消息?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Erwin Kalvelagen    1 年前

    来自 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html :

    请注意,默认情况下lb=0,ub=None。

    所以 x0 = np.array([ 229.1748166 , -507.05266751, 512.14005547]) 可行的