使用给定(错误的)节点距离优化图形的布局

时间:2013-05-05 20:21:09

标签: algorithm math graph mathematical-optimization

我有一个松散连接的图表。对于此图中的每个边,我知道位置 p处节点 v w 之间的近似距离 d(v,w) (v) p(w) R3中的矢量,不仅仅是欧氏距离。错误应该很小(比方说< 3%),第一个节点是< 0,0,0>。

如果根本没有错误,我可以用这种方式计算节点位置:

set p(first_node) = <0,0,0>
calculate_position(first_node)

calculate_position(v):
    for (v,w) in Edges:
        if p(w) is not set:
            set p(w) = p(v) + d(v,w)
            calculate_position(w)
    for (u,v) in Edges:
        if p(u) is not set:
            set p(u) = p(v) - d(u,v)
            calculate_position(u)

距离的误差不相等。但为了简单起见,假设相对误差(d(v,w)-d'(v,w))/ E(v,w)是N(0,1) - 正常 - 分散式。我想最小化平方误差的总和

sum( ((p(v)-p(w)) - d(v,w) )^2/E(v,w)^2 ) for all edges

图形可能具有适量的节点(> 100),但节点之间只有一些连接,并且已经“预过滤”(如果这些子图之间只有一个连接,则分成子图)。

我尝试过使用hooks low的简单“物理模型”,但它的速度慢且不稳定。对于这类问题,是否有更好的算法或启发式算法?

1 个答案:

答案 0 :(得分:2)

这看起来像linear regression。获取以下形式的错误术语,即没有正方形并拆分为单独的坐标:

(px(v) - px(w) - dx(v,w))/E(v,w)
(py(v) - py(w) - dy(v,w))/E(v,w)
(pz(v) - pz(w) - dz(v,w))/E(v,w)

如果我理解正确,您正在为所有节点px(v)寻找值py(v)pz(v)v,以便上述术语的平方和为最小化。

您可以通过以下方式创建矩阵 A 和向量 b 来执行此操作:每个对应于上述形式的等式, A 的每个对应一个变量,即单个坐标。对于 n 顶点和 m 边缘,矩阵 A 将具有3 m m行(因为你分开坐标)和3 n -3列(因为您还修复了第一个节点px(0)=py(0)=pz(0)=0)。

(px(v) - px(w) - dx(v,w))/E(v,w)的行在1/E(v,w)的列中会有一个条目px(v),在-1/E(v,w)的列中会有条目px(w)。所有其他列将为零。向量 b 中的相应条目为dx(v,w)/E(v,w)

现在解决linear equation A T · A x = A T · b 其中 A T 表示transpose A 的。解决方案向量 x 将包含顶点的坐标。你可以把它分成三个独立的问题,每个坐标方向一个,以保持线性方程组的大小。