首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cvxpy+ecos:问题不可行,如何正确扩展

cvxpy+ecos:问题不可行,如何正确扩展
EN

Stack Overflow用户
提问于 2019-03-08 06:27:50
回答 1查看 290关注 0票数 2

我有以下代码:

代码语言:javascript
复制
import numpy as np
import cvxpy as cp
import math
import sys

def solve05( p, a ):
    m,n,ids,inv,k = 0,len(p),{},{},0
    for i in range(n):
        for j in range(n):
            ids[(i,j)] = k
            inv[k] = (i,j)
            k = k+1
    # Problem data
    A = np.zeros((2*n,n*n+n))
    D = np.zeros((2*n,n*n+n))
    b = np.zeros(2*n)
    B = np.zeros(2*n)
    c = np.zeros(2*n)
    for j in range(n):
        for i in range(n):
            idx = ids[(i,j)]
            A[j,idx] = 1
        b[j] = 1
    for i in range(n):
        for j in range(n):
            idx = ids[(i,j)]
            A[i+n,idx] = p[j]
        A[i+n,n*n+i] = -1
        b[i+n] = p[i]
    # Construct the problem
    x = cp.Variable(n*n+n)
    print("M = ",A)
    print("b = ",b)
    CF = 1e3
    print("Now scaling M by ",CF)
    A = A*CF
    print(A)
    b = b*CF
    constraints = [0 <= x, A*x == b]
    pex = x[n*n]+x[n*n+1]+x[n*n+2]+1
    constraints.append(x[n*n] <= a[0]*CF)
    constraints.append(x[n*n+1] <= a[1]*CF)
    constraints.append(x[n*n+2] <= a[2]*CF)
    constraints.append(x[n*n] >= 0.01)
    constraints.append(x[n*n+1] >= 0.01)
    constraints.append(x[n*n+2] >= 0.01)
    ex = pex.__pow__(-1)
    print("Dummy variables: ",x[n*n],x[n*n+1],x[n*n+2])
    print("Objective function: ",ex)
    print("[should be convex] Curvature: ",ex.curvature)
    objective = cp.Minimize(ex)
    prob = cp.Problem(objective,constraints)
    result = prob.solve(verbose=True)
    print('problem state: ', prob.status)
    alpha = np.zeros((n,n))
    for i in range(n):
        for j in range(n):
            alpha[i,j] = x.value[ids[(i,j)]]
    dummy = [x.value[j] for j in range(n*n,n*n+n)]
    return (x,alpha)


if __name__ == '__main__':
    p = [0.0005,0.0001,0.0007]
    a = [900,500,700]
    n = len(a)
    (sl,alpha) = solve05(p,a)
    for row in alpha:
        for x in row:
            print("%.4f " % (x), end=" "),
        print("")

它失败了,因为“问题不可行”的结论,我渴望知道为什么。有没有办法知道更多?我不是凸编程专家,所以任何关于为什么这是一个糟糕的模型的评论都是值得赞赏的。我也尝试过扩展这个问题,因为我认为一些数值不稳定可能是导致问题的原因,但是天啊。

EN

回答 1

Stack Overflow用户

发布于 2019-03-08 08:00:50

ecos+cvxpy给出的答案是正确的。这个问题是不可行的,这可以通过总结所有的方程并观察到,对于某些e > 0,LHS是一些量F,而RHS是F+e

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55053820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档