【问题标题】:Graph layout optimization in C#C# 中的图形布局优化
【发布时间】:2010-11-18 00:24:27
【问题描述】:

我有一个需要组织为美学图表的对象列表。我目前的方法涉及 IronPython 和遗传算法,但这需要的时间太长了。

我一直在阅读 Graphviz、QuickGraph 和 Graph#,但我不需要可视化部分 - 我已经有一个应用程序可以显示给定 x/y 坐标的节点。有人告诉我,Sugiyama 算法和基于力的算法系列都倾向于输出令人愉悦的图形,但我似乎找不到一个 .NET 库可以在没有一些非常严格的源代码的情况下输出坐标而不是图像黑客攻击。

任何人都可以推荐库、算法或类似的东西吗?

【问题讨论】:

    标签: c# optimization performance graph-layout


    【解决方案1】:

    有许多选项,各有利弊 - 您可能需要筛选 this,这是一个或多或少可以满足您需求的软件列表。

    以前很难找到开源解决方案,但曾经获得商业许可的MSAGL 现在是seems to be open source

    Graph#QuickGraph 的区别在于后者提供了图遍历和操作原语,但不提供任何布局算法。 Graph# 包含所有可用的源代码,并且从我(简要地)看到的情况来看,布局引擎和绘图实现之间有一个巧妙的分离。

    Graphviz 是用纯 C/C++ 编写的,相当单一,将描述图形的文本文件作为输入,并产生基于矢量和光栅的各种类型的输出。它不太适合作为插件布局引擎,但可以通过脱壳并提供必要的输入文件并解析输出来使用。虽然不是一个非常干净的解决方案。

    还有一个叫做OGDF的东西。尽管它完全是用 C++ 编写的,但它被设计为用作布局引擎库,并为此提供了结构良好的界面。如果您有兴趣,它支持各种布局算法,包括优化的 Sugiyama。

    如果您有兴趣在 Sugiyama 上实现优化的变体,您可以随时使用 neat description of the algorithm 自行开发:)

    但最终,您可能应该在决定库之前确定您所采用的布局类型。

    【讨论】:

    【解决方案2】:

    Microsoft Research 有一个自动图形布局引擎,可以帮助您完成这项工作。

    您可以在这里阅读更多信息:

    http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/

    【讨论】:

    【解决方案3】:

    以防万一有人遇到类似问题。有一个 GraphX for .NET 开源项目,其中包含许多与可视化引擎分离的布局算法。因此,您可以只使用逻辑库,执行计算并获取坐标包以在您自己的 vis 工具中使用。

    https://github.com/panthernet/GraphX

    【讨论】:

      【解决方案4】:

      yFiles 具有非常复杂的强制导向(称为“有机”)和基于 Sugiyama(“称为分层”)布局算法的实现。它们为 Java、.net、Silverlight、Flex 和 Javascript 提供无需查看器的实现。检索坐标的 API 可在线获取here

      算法及其质量可以在免费的yEd Graph Editor 应用程序中进行测试,但这些库仅在商业上可用。

      【讨论】:

      • 一个有点贵的解决方案,但是非常好的架构和文档,加上几个平台的库(现在包括一些 HTML5)
      【解决方案5】:

      作为 modsl 系统的一部分,在 Java 中有一个 Sugiyama 布局实现,Apache 许可证。来源是here

      我能够相当容易地将其转换为基于 digraph 的混合 Objective-C/Objective-C++ implementation

      【讨论】:

        【解决方案6】:

        我已经通过这种方式得到了节点的坐标

        namespace GleeTest
        {
            class GleeTest
            {
        
                static void Main() {
                    Microsoft.Glee.GleeGraph oGleeGraph = new Microsoft.Glee.GleeGraph();
        
                    Microsoft.Glee.Splines.ICurve oCurve =
                       Microsoft.Glee.Splines.CurveFactory.CreateEllipse(
                           1, 1,
                           new Microsoft.Glee.Splines.Point(0, 0)
                           );
                    Microsoft.Glee.Node strNode1 = new Microsoft.Glee.Node("Circle", oCurve);
        
                    Microsoft.Glee.Node strNode3 = new Microsoft.Glee.Node("Diamond", oCurve);
                    Microsoft.Glee.Node strNode4 = new Microsoft.Glee.Node("Standard", oCurve);
                    Microsoft.Glee.Node strNode2 = new Microsoft.Glee.Node("Home", oCurve);
        
                    oGleeGraph.AddNode(strNode1);
                    oGleeGraph.AddNode(strNode2);
                    oGleeGraph.AddNode(strNode3);
                    oGleeGraph.AddNode(strNode4);
        
                    Microsoft.Glee.Edge oGleeEdge1 =
                       new Microsoft.Glee.Edge(strNode1, strNode2);
                    Microsoft.Glee.Edge oGleeEdge2 =
                    new Microsoft.Glee.Edge(strNode2, strNode1);
                    Microsoft.Glee.Edge oGleeEdge3 =
                    new Microsoft.Glee.Edge(strNode2, strNode2);
                    Microsoft.Glee.Edge oGleeEdge4 =
                    new Microsoft.Glee.Edge(strNode1, strNode3);
                    Microsoft.Glee.Edge oGleeEdge5 =
                    new Microsoft.Glee.Edge(strNode1, strNode4);
                    Microsoft.Glee.Edge oGleeEdge6 =
                  new Microsoft.Glee.Edge(strNode4, strNode1);
        
        
                    oGleeGraph.AddEdge(oGleeEdge1);
                    oGleeGraph.AddEdge(oGleeEdge2);
                    oGleeGraph.AddEdge(oGleeEdge3);
                    oGleeGraph.AddEdge(oGleeEdge4);
                    oGleeGraph.AddEdge(oGleeEdge5);
                    oGleeGraph.AddEdge(oGleeEdge6);
        
                    oGleeGraph.CalculateLayout();
        
        
                    System.Console.WriteLine("Circle position  " + oGleeGraph.FindNode("Circle").Center.X + "," + oGleeGraph.FindNode("Circle").Center.Y);
                    System.Console.WriteLine("Home position = " + oGleeGraph.FindNode("Home").Center.X + "," + oGleeGraph.FindNode("Home").Center.Y);
                    System.Console.WriteLine("Diamond position = " + oGleeGraph.FindNode("Diamond").Center.X + "," + oGleeGraph.FindNode("Diamond").Center.Y);
                    System.Console.WriteLine("Standard position = " + oGleeGraph.FindNode("Standard").Center.X + "," + oGleeGraph.FindNode("Standard").Center.Y);
        
        
        
        
                }
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-04-01
          • 2015-05-25
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 2019-01-04
          • 2012-02-24
          相关资源
          最近更新 更多