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

带Scipy的线性规划

  •  2
  • user58925  · 技术社区  · 6 年前

    我试图用Scipy解决一个线性规划问题,我得到一个错误,说参数的维数不匹配。但似乎他们做到了,代码和错误信息如下

    import numpy as np
    from scipy import optimize as opt
    
    
    k = 6
    n = 3
    indexes = [1, 2, 5, 6, 7, 9]
    V = np.zeros((1, k))
    count = 0
    for ID in xrange(1, 4):
        ind = count * n + ID
        p = indexes.index(ind)
        V[0, p] = 1
        count += 1
    
    bounds = []
    for i in xrange(6):
        bounds.append((0, 1))
    bounds = tuple(bounds)
    W1 = np.zeros((3, 6))
    W1[1, 2] = 0.4
    W1[2, 3] = 0.5
    b1 = np.transpose(np.zeros(3))
    b1[1] = 0.8
    b1[2] = 0.25
    
    W3 = np.zeros((3, 6))
    W3[1, 2] = 0.7
    W3[2, 3] = 0.8
    b3 = np.transpose(np.zeros(3))
    b3[1] = 0.6
    b3[2] = 0.2
    
    EQ = np.vstack([W1, W3]).T
    Eb = np.vstack([b1, b3]).T
    
    print EQ.shape, "shape of A_eq"
    print V.shape, "shape of c"
    
    res = opt.linprog(c=V, A_eq=EQ, b_eq=Eb, bounds=bounds, options={"disp": True})
    

    错误消息

    ValueError: Invalid input for linprog with method = 'simplex'.  Number of columns in A_eq must be equal to the size of c
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Sheldore    6 年前

    只要替换一下

    res = opt.linprog(c=V, A_eq=EQ, b_eq=Eb, bounds=bounds, options={"disp": True})
    

    res = opt.linprog(c=V[0], A_eq=EQ, b_eq=Eb, bounds=bounds, options={"disp": True})
    

    V ,您将看到它是一个列表的列表。所以你想要的数据位于 V[0] . 尽管优化失败了。

    作为

    V = np.zeros(k)
    

    然后用在 for

    V[p] = 1.
    

    c=V 在优化部分。