Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么CVXOPT会给出这种非线性网络流优化的秩误差?_Python_Optimization_Cvxopt_Convex Optimization_Network Flow - Fatal编程技术网

Python 为什么CVXOPT会给出这种非线性网络流优化的秩误差?

Python 为什么CVXOPT会给出这种非线性网络流优化的秩误差?,python,optimization,cvxopt,convex-optimization,network-flow,Python,Optimization,Cvxopt,Convex Optimization,Network Flow,我正在考虑使用cvxopt来解决一些非线性网络流优化问题。为了理解基础知识,我尝试了一个非常简单的测试网络,它只有4个顶点和5条边 我的网络看起来像。蓝色和红色节点分别是源节点和汇节点 每个边缘的成本为: alpha*x**2 其中x是包含每条边上的流的向量,alpha是某个系数。我的优化问题是: min sum(alpha*x**2) subject to: E*x = b x >= 0 其中E是边弧关联矩阵,b是包含源和汇的向量。因此,矩阵向量方

我正在考虑使用cvxopt来解决一些非线性网络流优化问题。为了理解基础知识,我尝试了一个非常简单的测试网络,它只有4个顶点和5条边

我的网络看起来像。蓝色和红色节点分别是源节点和汇节点

每个边缘的成本为:

alpha*x**2
其中x是包含每条边上的流的向量,alpha是某个系数。我的优化问题是:

     min sum(alpha*x**2)

subject to:

     E*x = b
     x >= 0 
其中E是边弧关联矩阵,b是包含源和汇的向量。因此,矩阵向量方程Ex=b应仅执行基尔霍夫定律(即每个节点的流量守恒)

我的python脚本是:

from cvxopt import matrix, spdiag, solvers

#Four vertices, five edges
E = matrix(0.0, (4,5))
E[0,0] = 1.0
E[0,1] = 1.0
E[1,0] = -1.0
E[1,2] = 1.0
E[1,3] = 1.0
E[2,1] = -1.0
E[2,2] = -1.0
E[2,4] = 1.0
E[3,3] = -1.0
E[3,4] = -1.0

#Source-sink vector
b = matrix(0.0, (4,1))
b[0] = 0.5
b[3] = -0.5

#Coefficient in the quadtratic
alpha = 1.0

#Function to pass to cvxopt
def F(x=None, z=None):

    if x is None:
        return 0, matrix(0.05, (5,1))
    if min(x) <= 0.0:
        return None

    f = sum(alpha*(x**2))
    Df = (2.0*alpha*x).T
    if z is None:
        return f, Df

    D2f = 2.0*alpha*matrix(1.0, (5,1))
    H = spdiag(z[0]*D2f)
    return f, Df, H

#Solve
x = solvers.cp(F, A=E, b=b)['x']
来自cvxopt导入矩阵、spdiag、解算器
#四个顶点,五条边
E=矩阵(0.0,(4,5))
E[0,0]=1.0
E[0,1]=1.0
E[1,0]=-1.0
E[1,2]=1.0
E[1,3]=1.0
E[2,1]=-1.0
E[2,2]=-1.0
E[2,4]=1.0
E[3,3]=-1.0
E[3,4]=-1.0
#源-汇向量
b=矩阵(0.0,(4,1))
b[0]=0.5
b[3]=-0.5
#四元系中的系数
α=1.0
#传递给cvxopt的函数
def F(x=无,z=无):
如果x为无:
返回0,矩阵(0.05,(5,1))

如果min(x)在仔细考虑之后,我意识到这个问题是因为cvxopt要求等式约束中矩阵的秩不小于等式约束的数目

在我的例子中,这意味着关联矩阵的秩必须等于网络中的节点数。然而,图论的一个结果是,任何具有n个节点的简单连通图都将具有秩为n-1的关联矩阵。这会产生秩错误

我解决这个问题的方法是选择一个节点,并向其添加两条额外的边:一条从节点开始但不通向任何地方,另一条从任何地方开始并终止于节点。这实际上会向矩阵中添加两列。然后,我在矩阵中增加了一行,要求这两条新边上的流之和为零

通过这种方式,我增加了矩阵的秩,而没有添加任何额外的节点。原始网络上的流不受添加这些边的影响,因为我要求新边上的流保持为零


这是一个有点黑客的方式来做,但它似乎做的把戏

今天遇到了同样的问题

另一种解决方法是删除冗余约束

以矩阵E的奇异值分解为例:

E = U S V'
S的形状与E相同,最后一行将全部为零(因为矩阵的秩为3)

y=V'x
重新排列等式约束

E x = b
U S V' x = b
S V' x = U' b
T x = c
U'b
的最后一行必须为零,否则问题不可行

T
设为
sv'
的前3行,将
c
设为
U'b
的前3行

然后可以使用相等约束

E x = b
U S V' x = b
S V' x = U' b
T x = c
或者,
cvxpy
使用QR分解