用于生成软件堆栈图的算法

问题描述 投票:2回答:3

我正在寻找一种算法的想法,该算法生成类似于以下的图,给定一组非循环依赖(我使用此图像来表明依赖关系可能很复杂)

alt text (来源:interactivetvweb.org

algorithm diagram
3个回答
2
投票

虽然不是算法(这是你要求的),你可能想要检查NDepend,它执行类似的分析,并生成类似于你之后的图表:

http://ndepend.com/

(我与NDepend没有任何关系)


2
投票

制作这样的图表并不总是可行的。 (非循环)依赖关系:

A取决于X,Y,Z

B取决于X,Y,Z

C取决于X,Y,Z

描述了六个顶点上的完整二部图,即non-planar。对于您显示的图表类型,其结果是图表中的至少一个区域必须分成两个单独的部分,和/或至少其中一个区域不能直接连接到其依赖项。

基于图形的可视化(例如graphvis)可以避免这个问题,其中边缘可以相互交叉。

生成您正在寻找的图表的启发式算法的大纲如下:

  1. 解析依赖关系树以计算每个项目的“级别”。在上面给出的例子中,X,Y和Z将在该图中的1级出现三次,作为A,B和C各自的子级(0级)
  2. 以明显的方式绘制树,每个“级别”的项目处于相同的水平级别,并且他们的祖先/子级分别位于其上方/上方。可以选择在每个级别放置项目的顺序。
  3. 根据单个项目在图表上拆分为多个区域的次数,计算图表有多好的度量标准。如果物品的排序良好,并且代表相同物品的两个或多个区域相互接触,则可以将它们融合在一起。
  4. 使用此度量标准可以使用组合优化算法(例如Metropolis algorithm)优化同一级别的项目排列。

这不会每次产生最好的图形(如果这样的概念甚至是明确定义的......)但是应该为像你的例子这样的问题做一个合理的工作。


0
投票

STAN4J从java代码生成这种图表。

© www.soinside.com 2019 - 2024. All rights reserved.