我有一个强连通的有向图,边缘用向量加权,其中每个向量只有非负条目。我想找到一个循环,使得权重之和与对角矢量([1,1,1,... 1])之间的角度最小化。对于这类事情,有没有算法?
我相信Bellman-Ford型算法会给我一个相当不错的解决方案,但我不相信它会是最好的......。
答案 0 :(得分:2)
由于弧可以多次使用,因此可以将此问题表述为quadratic program。如果实例不大,那么尝试维基百科链接到的解算器之一可能是值得的。
让可行的解决方案成为循环x,即简单循环的正线性组合。设A是表示从弧到矢量的线性映射的矩阵。用一个小代数证明了一个技巧:不是最小化Ax相对于全1矢量的角度,我们最小化Ax的长度受到Ax的点积和全部的约束的约束。矢量是1。
现在我们可以写下二次方案。
minimize y1^2 + ... + yn^2 (positive semidefinite objective)
subject to
Ax - y = 0
x is a circulation
最后一个约束分解为线性约束x >= 0
,并且对于每个顶点,进入顶点的弧上的x
值之和等于弧上x
值的总和离开。
答案 1 :(得分:0)
编辑:Dijkstra仅适用于非负数条目。但这适合你的问题
答案 2 :(得分:0)
考虑两个共享一个共同顶点的循环。完全有可能存在正整数p和q,使得第一个周期的向量的p倍加到q乘以第二个周期的向量恰好等于(1,1,...,1的倍数) )。因此,除非你限制在简单的循环中,否则我认为没有一种快速的算法可以证明是最佳的。即使您限制为简单循环,也可以使循环的一部分等于向量x,并且循环的其余部分等于向量c(1,1,...,1) - x,并且您&#39 ; d除非你枚举所有周期并检查它们,否则可能无法知道这一点。因此,如果您想要一个最佳解决方案,我认为强力枚举周期可能是解决问题的唯一可行方法。