我正在考虑使用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']
我得到的错误是:
pcost dcost gap pres dres
0: 0.0000e+00 1.2500e-02 1e+00 1e+00 2e-01
Traceback (most recent call last):
File "simple_network.py", line 45, in <module>
x = solvers.cp(F, A=E, b=b)['x']
File "/usr/local/lib/python2.7/dist-packages/cvxopt/cvxprog.py", line 1966, in cp
xdot_e, xaxpy_e, xscal_e, options = options)
File "/usr/local/lib/python2.7/dist-packages/cvxopt/cvxprog.py", line 782, in cpl
raise ValueError("Rank(A) < p or "\
ValueError: Rank(A) < p or Rank([H(x); A; Df(x); G]) < n
我不确定如何从这里开始。我假设这个html" target="_blank">优化问题可以用cvxopt来解决,因为手动找到最佳流是足够简单的。如果有人能告诉我如何纠正这个代码,或者告诉我为什么这种类型的问题不适合这个软件,我将不胜感激。
提前感谢。
今天遇到了同样的问题。
另一种解决方法是删除冗余约束。
取矩阵E的SVD:
E = U S V'
S具有与E相同的形状,最后一行将是全零(因为您的矩阵排名为3)。
让y=V'x
并重新排列相等约束
E x = b
U S V' x = b
S V' x = U' b
U'b
的最后一行必须为零,否则问题不可行。
设<code>T<code>为<code>S V‘
然后,您可以使用等式约束
T x = c
或者,cvxpy
使用QR分解进行类似的操作
经过进一步的思考,我意识到这个问题是因为cvxopt要求等式约束中矩阵的秩不小于等式约束的个数。
在我的情况下,这意味着我的发生矩阵的秩必须等于网络中的节点数。然而,图论的一个结果是,任何具有n个节点的简单连接图都将具有秩为n-1的关联矩阵。这将产生排名错误。
我解决这个问题的方法是选择一个节点,并向其添加两条额外的边:一条从节点开始,但没有任何地方,另一条从任何地方开始,终止于节点。这实际上会在矩阵中添加两列。然后,我在矩阵中增加了一行,要求这两条新边上的流量之和为零。
通过这种方式,我增加了矩阵的秩,而无需添加任何其他节点。添加这些边不会影响原始网络上的流,因为我要求新边上的流保持为零。
这是一种有点老套的方法,但似乎很管用。
我的任务是使用用户填充的int数组合并两个数组,我们必须假设用户最多有10000个输入,用户输入负数停止。然后将数组从最小到最大排序并打印出来。起初我以为这很容易,但当我完成时,我开始得到如下输出: 正如你所看到的,这六个是不合适的,我不知道如何修复它。这是源代码,我已经包括了大量的评论,因为我真的希望你们能帮助我尽你们最大的能力。如果可以使用相同的技术而不在代码中实现新的技术和方法,请这样做。我
函数“def gekko_obj(x)”适用于任何x值。 但是,当m作为Gekko目标函数调用时,它会失败。Obj(gekko_obj(x))。 文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第710行,在runfile execfile(文件名,命名空间)中 文件“/anaconda3/
@错误:使用序列设置数组元素 我试图确定下行风险。 我有一个回报形状的二维数组(1000,10),投资组合从100美元开始。在一行中每一个回报复合10次。对所有行都这样做。将每一行的最后一个单元格的值与最后一列值的平均值进行比较。如果值小于平均值或为零,则保留该值。所以我们将有一个(1000,1)数组。最后我找到了它的均方差。 目标是最小化均方差。约束:权重需要小于1 预期回报,即wt*ret应等
当我运行这个程序时,为什么它调用带有字符串参数重载的方法。 如果我将我的方法重写为 它将显示空白控制台,这意味着它不是String的实例,那么它为什么以这种方式调用呢?
为什么会引发主线程上的网络异常?its在异步任务上 } 编辑: 完整代码: logcat:
安装问题 PS C:\Users\Administrator sharp@0.21.3安装C:\用户\管理员\gatsby-site3\node_modules\锐(节点安装/libvips 使用缓存的C:\Users\Administrator\AppData\Roaming\npm-cache\u libvips\libvips-8.7.0-win32-x64.tar.gz info shar