Algorithm 图论:带向量权的最短路径

Algorithm 图论:带向量权的最短路径,algorithm,theory,graph-theory,Algorithm,Theory,Graph Theory,我有一个强连通有向图,边用向量加权,其中每个向量只有非负项。我想找到一个循环,使得权重和对角向量([1,1,1,…1])之间的角度最小化。对于这类事情有什么算法吗 我很有信心Bellman-Ford类型的算法会给我一个相当好的解决方案,但我不相信它会是最好的-…就我对Bellman-Ford算法的理解而言,Dijkstra最短路径算法似乎也会这样做。但这是因为它的贪婪行为 编辑:Dijkstra仅适用于非负条目。但这符合你的问题考虑两个共用一个顶点的循环。完全有可能存在正整数p和q,因此p乘以第

我有一个强连通有向图,边用向量加权,其中每个向量只有非负项。我想找到一个循环,使得权重和对角向量([1,1,1,…1])之间的角度最小化。对于这类事情有什么算法吗


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

就我对Bellman-Ford算法的理解而言,Dijkstra最短路径算法似乎也会这样做。但这是因为它的贪婪行为


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

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

因为弧可以多次使用,所以这个问题可以表述为一个问题。如果实例不是很大,那么不妨尝试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
值之和。

否。即使向量的所有条目都是正的,它们的和之间的夹角也可以随着另一个的增加而减小。考虑〔1, 0〕和〔0, 1〕向量的情形。([0,1]和[1,1])之间的角度=π/4([0,1]+[1,0])和[1,1])之间的角度=0注意,上面的例子显然是2D的,但我希望能够推广到N-d。“向量和[1,1,…,1]之间的角度最小化”这确实是一种指定最优性标准的奇怪方式。经过一点代数运算后,这相当于“sum(x_i)^2/sum(x_i^2)最大化”,这似乎更可能导致一个算法。(尽管它似乎仍然不适合通常的图形搜索算法,因为添加边会使分母比分子膨胀得更大…)这一点很好。我一直在用这个表格,但不是那样想的。在进一步考虑之后,我总是可以旋转我的参考框架,这样我们就可以最小化对任何向量的投影,比如说,[1,0,0,…,0]。你付出的代价是,现在向量条目可能是负数。因此,我们只剩下最小化xi^2/和(xi^2)。我想节省了一个总和。我觉得是时候滥用一些不等式来获得“足够好”的近似值了。Cauchy Swarz将2-范数计算简化为1-范数,三角形不等式将1-范数之和关联起来……任务是找到一个使f(x)=x0/2norm(x)最大化的x。虽然这是一个标量,但我们必须计算它加上更多的向量-f(x+dx)。如果不保存x的每个条目,这是不可能的,因为大多数路径都有不同的向量,我们必须为每个顶点的每个路径保存向量。然而,如果我们愿意牺牲一些正确性并得到一个“足够好”的解决方案,我们可以利用2norm(x+dx)这个事实,如果你坚持一个简单的循环,那么即使决定是否有可能得到完全对齐的角度也是NP难的,从Hamilton循环中减少。如果有可能重新访问弧,那么问题本质上是连续的,可能有一种方法可以通过凸规划计算最大对齐(分数)循环。感谢您的回答。我尝试过暴力手段,但不知道如何处理结果。我可以在图中找到所有简单的循环,并对涉及的边向量求和(因为我可以围绕这些循环进行任意次数的旅行,所以循环之间的行走可以忽略不计)。然后,任务变成:对于每个循环向量席,在n中求AI,求和(AIXI)=KD,其中D= [1,1,1,1] ^ t的另一种方式是寻找[x,-d] [a k] ^ t的零空间,其中x= [x0,x1,x2,x3,…]和a= [a0,a1,a2,…] ^。但它仍然给我留下了许多零空间向量(我的特殊问题是长度为16的~2.5m循环向量,导致2.5m-16/大约2.5m零空间向量)。不幸的是,这些零空间向量中的每一个都至少有一个负值,这意味着我需要找到一个向量的线性组合,从而得到所有正值(任何分数有理值都可以,因为我们可以在以后缩放解决方案).总是有简单的蛮力方法-尝试所有向量的所有组合-但这是非常昂贵的-我的最佳猜测是循环数的阶乘,循环数本身是顶点数的指数。我不希望我有机会完成一个O((e^N)!~O(e^N(N^2))算法。。。所以我想我应该看看stackoverflow要说什么:)我明白你的意思