【问题标题】:Graph theory: shortest path with vector weights图论:向量权重的最短路径
【发布时间】:2014-03-31 07:34:38
【问题描述】:

我有一个用向量加权的边的强连通有向图,其中每个向量只有非负条目。我想找到一个循环,以使权重之和与对角向量 ([1, 1, 1, ... 1]) 之间的角度最小化。有没有针对这类事情的算法?

我相当有信心 Bellman-Ford 类型的算法会给我一个相当好的解决方案,但我不相信它会是-最好的-...

【问题讨论】:

  • “向量和 [1, 1, ..., 1] 之间的角度被最小化”肯定是一种奇怪的方式来指定最优标准。经过一点代数,这相当于“sum(x_i)^2/sum(x_i^2) 被最大化”,这似乎更有可能导致算法。 (尽管它似乎仍然不适合通常的图搜索算法,因为添加边会使分母比分子膨胀更多......)
  • 好点。我一直在使用这种形式,但没有那样想。经过进一步考虑,我总是可以旋转我的参考系,这样我们就可以将投影最小化到任何向量上——比如 [1, 0, 0, 0, ..., 0]。您付出的代价是现在向量条目可能是负数。因此,我们只剩下最小化 xi^2/sum(xi^2)。我想可以节省一个总和。
  • 我觉得可能是时候滥用一些不等式来获得“足够好”的近似值了。 Cauchy-Swarz 将 2 范数计算减少到 1 范数,三角不等式将 1 范数之和联系起来......
  • 任务是找到一个使 f(x) = x0/2norm(x) 最大化的 x。虽然这是一个标量,但我们必须通过添加更多向量来评估它 - f(x + dx)。如果不保存 x 的每个条目,就无法完全做到这一点,而且由于大多数路径都有不同的向量,我们必须为每个顶点的每个路径保存向量。但是,如果我们愿意牺牲一些正确性并获得“足够好”的解决方案,我们可以使用 2norm(x + dx)
  • 如果你坚持一个简单的循环,那么即使是通过汉密尔顿循环的归约来决定是否有可能使角度完全对齐也是 NP 困难的。如果可以重新访问弧,那么问题本质上是连续的,并且可能有一种方法可以通过凸规划计算最大对齐(分数)循环。

标签: algorithm theory graph-theory


【解决方案1】:

由于弧可以多次使用,这个问题可以表述为quadratic program。如果实例不大,那么可能值得尝试 Wikipedia 链接到的求解器之一。

让我们将可行的解决方案视为循环 x,即简单循环的正线性组合。令 A 为表示从弧到向量的线性映射的矩阵。有一个技巧,用一点代数证明:我们不是最小化 Ax 相对于全一向量的角度,而是在 Ax 和全一向量的点积为 1 的约束下最小化 Ax 的长度。

现在我们可以写出二次规划了。

minimize y1^2 + ... + yn^2 (positive semidefinite objective)
subject to
Ax - y = 0
x is a circulation

最后一个约束分解为线性约束x >= 0,并且对于每个顶点,进入顶点的弧上的x 值的总和等于离开的弧上的x 值的总和。

【讨论】:

  • 啊,好老的二次规划。我是如何获得数学学位却从未遇到过的?谢谢,最有帮助。虽然我相信这会奏效,但对于那些阅读,我想我会以不同的方式处理它。如果我们让 M = [A | -d],其中 d 为 [1, 1, ..., 1]^T 且 y = [x^T, k]^T,则完美对齐的解将满足 My = 0。唉, y >= 0 表示这并不总是有解决方案,因此我们可以将 r.r 最小化,前提是 My = r 和 y >= 0。
  • @DomJack 是纯数学学位吗?与应用类型不同,他们倾向于在紧集上看到连续函数,然后就收工了。
  • 否定,已应用。我听说过诸如“图论”和“分析”之类的术语,但更多的是建模重点。仍然超级有用,不要误会我的意思——我实际上可以掌握我现在正在阅读的大多数维基百科页面的基本概念——当我什至不知道要搜索什么词时,我就会离开那条众所周知的小溪;)
【解决方案2】:

据我所知,Bellman-Ford 算法似乎是 Dijkstra 最短路径算法也是如此。但由于它的贪婪行为,它的速度更快。

编辑:Dijkstra 仅适用于非负条目。但这会适合你的问题

【讨论】:

  • 不,不会。即使向量的所有条目都是正数,它们和之间的角度也会随着另一个向量的增加而减小。考虑 [1, 0] 和 [0, 1] 向量的情况。 ([0, 1] 和 [1, 1]) 之间的角度 = pi/4 (([0, 1] + [1, 0]) 和 [1, 1]) 之间的角度 = 0 注意上面的例子很明显2D,但我希望能够推广到 N-D。
【解决方案3】:

考虑两个共享一个公共顶点的循环。完全有可能存在正整数 p 和 q,因此 p 乘以第一个周期的向量加上 q 乘以第二个周期的向量正好等于 (1,1,...,1) 的倍数。因此,除非您限制在简单的循环中,否则我认为没有可以证明是最优的快速算法。即使您限制为简单的循环,您也可以使循环的一部分等于向量 x,而循环的其余部分等于向量 c(1,1,...,1) - x,并且您会除非您枚举所有周期并检查它们,否则可能无法知道这一点。因此,如果您想要一个最佳解决方案,我认为暴力枚举循环可能是解决您的问题的唯一可行方法。

【讨论】:

  • 感谢您的回复。我尝试了蛮力方法,但甚至不知道如何处理结果。我可以在图中找到所有简单的循环并将所涉及的边向量求和(并且由于我可以在这些循环周围进行任意次数的行程,因此可以使循环之间的行走可以忽略不计)。那么任务就变成了:对于每个循环向量xi,在N中求ai使得sum(aixi) = kd,其中d = [1,1,1,1]^T看它会找到 [X, -d] [ak]^T 的零空间,其中 X = [x0, x1, x2, x3, ... ] 和 a = [a0, a1, a2, .. .]^T.
  • 这本身是相当微不足道的(或者至少,在文献中有很好的介绍),但它仍然给我留下了很多零空间向量(我的特殊问题有大约 2.5m 长度为 16 的循环向量,导致在 2.5m - 16 /大约 2.5m 零空间向量中)。不幸的是,这些零空间向量中的每一个都至少有一个负值,这意味着我需要找到导致所有正值的向量的线性组合(任何小数有理值都可以,因为我们可以稍后缩放解决方案)。
  • 总是有简单的蛮力方法 - 尝试所有向量的所有组合 - 但这非常昂贵 - 我最好的猜测是循环数的阶乘,它本身是顶点数的指数。我不喜欢我完成 O((e^N)!) ~ O(e^(N^2)) 算法的机会......所以我想我会看看 stackoverflow 是怎么说的:)。
  • 我明白你在说什么。我要说的是,问题中似乎没有任何结构可供您利用,因此蛮力枚举可能是您能做的最好的事情。我试图给出我认为可能是这种情况的原因,我可能错了。希望您能得到肯定的答复。
猜你喜欢
  • 2017-07-06
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多