【问题标题】:Graph theory - force based autolayout algorithm图论 - 基于力的自动布局算法
【发布时间】:2011-05-14 04:47:32
【问题描述】:

只是想在开始实施之前检查一下我的理论是否正确。

常量:

  • m = 顶点质量(都一样 - 可能设置为节点半径)
  • k = 恒定的边缘力。
  • l = “能量最小状态”的边长。

变量:

  • d = 两个顶点之间的距离。
  • cl = 当前边的长度。

理论: 每个顶点对每个其他顶点都有排斥力,即:m / (d^2)。对于每条边,它都表现出一个力,两个顶点都将它们“拖动”到使边达到“能量最小状态”的方向;所以每个顶点:-k * ((l - cl) / 2).

伪代码:

until energy minimal state
   for each vertex v1
      for each vertex v2
         if v1 != v2
            v1.velocity += m / square_distance (v1, v2)
         endif
      end
   end
   for each edge e
      e.v1.velocity += -k * (delta_min_energy_len (e) / 2)
      e.v2.velocity += -k * (delta_min_energy_len (e) / 2)
   end
   for each vertex v
      v.position += (v.velocty * dampening_constant)
   end                
end

评论:那么这行得通吗?我应该将mk 设置为什么?

【问题讨论】:

  • 不要忘记某种阻尼。否则,您的顶点将永远摆动。
  • 看起来你的“for each edge”循环除了v1的那一行之外应该还有v2的一行。
  • 另外,你如何检测外部循环的条件“能量最小状态”何时满足?在我看来,这需要更具体一点。
  • 感谢...您的第一条评论 - 现在已修复。当所有顶点的速度都是标称的(非常小)时,就达到了“能量最小状态”。
  • 也许这隐含在您的伪代码中,但每个加速语句velocity += ... 都需要提供方向。我假设你可以通过将加速度的大小乘以 (v1 - v2) 或 (v2 - v1) 来得到这个。

标签: algorithm layout graph-theory force-based-algorithm


【解决方案1】:

你在正确的路线上。您的术语/物理学有点偏离:您所谓的质量和“k”与最好称为“电荷”(用于平方反比定律排斥)和“弹簧常数”的东西混在一起了胡克定律吸引力。

正如对您问题的评论回复中所指出的,您确实需要一些阻尼来实际将能量带出系统,否则它只会振荡将势能转换为动能并永远返回。更糟糕的是,模拟精度问题很容易导致能量无限增加,如果你不小心,模拟就会“发疯”。

这个wikipedia article 有一些很好的伪代码,你会发现它们与你的非常相似,但上面提到了几点(尽管请注意,即使该伪代码在加速度计算中也缺少除以质量;请参阅页面的讨论)。

您还需要考虑一下开始模拟的初始分布,以及如果存在(可能)更好的全局最小值,您对陷入局部最小值的可能性有多大的关心。这些点是相关的;很大程度上取决于图形的拓扑。如果它是一棵简单的树,那么获得一个漂亮的布局将毫无困难。如果它有很多循环和结构......祝你好运。

【讨论】:

    【解决方案2】:

    我不会为每个顶点选择相同的 m。相反,我会让它与它所连接的其他顶点的数量成正比。这样,图的末端飞到他们的位置比高度连接的末端更快。

    我不知道 k。

    【讨论】: