Java 绘制图形结构的算法?

Java 绘制图形结构的算法?,java,python,algorithm,optimization,graph,Java,Python,Algorithm,Optimization,Graph,我有一个有向图G=(V,E),我想重新绘制,因为它目前非常混乱。这是一个正在可视化的流程图,因为| V |>1000,并且V中的每个V都有一个以上的输出边,所以很难用肉眼跟踪。例如;左下角的节点通过边连接到右上角的节点。例如,如果这两个节点相邻放置,效果会更好。有太多的边缘,这是一个痛苦的跟踪每一个 我可以访问并更改所有顶点的(x,y)坐标。我想通过保持G的当前结构,以更人性化的方式重新绘制G。我认为最小化相交边的数量可能是一个开始 有没有一种算法可以帮助我重新绘制这个图表 我的问题是,如何将(

我有一个有向图G=(V,E),我想重新绘制,因为它目前非常混乱。这是一个正在可视化的流程图,因为| V |>1000,并且V中的每个V都有一个以上的输出边,所以很难用肉眼跟踪。例如;左下角的节点通过边连接到右上角的节点。例如,如果这两个节点相邻放置,效果会更好。有太多的边缘,这是一个痛苦的跟踪每一个

我可以访问并更改所有顶点的(x,y)坐标。我想通过保持G的当前结构,以更人性化的方式重新绘制G。我认为最小化相交边的数量可能是一个开始

有没有一种算法可以帮助我重新绘制这个图表

我的问题是,如何将(x,y)坐标分配给v中的每个v,使其组织得更好,更易于跟踪和读取?我如何正式表达这些需求?如果这是NP,我应该使用启发式吗?这是一个有组织的图表的例子,有点凌乱(虽然比我要处理的要小得多)

任何帮助都将不胜感激。谢谢

编辑:我仍在寻找一个切中要害的答案。我研究过平面直线和正交绘图方法,但我得到的是冗长的研究论文。我正在寻找的是一个实现,伪代码或者至少是一些让我开始的东西


编辑2:我不想显示图表。算法的输入应该是
图G(由V和E组成)
,输出应该是
{(xi,yi)对于V}中的每个vi

你想看graphviz.org;这是一个有很多研究的难题,重新实现车轮不是正确的方向


可能您必须让java编写一个数据文件,像“点”这样的工具可以读取并用于图形布局。

这个凌乱的文件似乎是用样条线绘制的,请尝试。事实上,这是一个非常困难的问题,我总是使用GraphViz作为后端图形绘制工具,您可以使用-Gsplines=line选项生成所需的图形。

谢谢Tom的回答。你能说得更具体一点吗,我应该研究graphviz的哪一部分?graphviz是为你绘制图形而设计的。Tom建议让graphviz为您绘制代码,而不是自己编写代码。dot语言非常简单,生成dot文件的代码不应该用log来编写。不,不是家庭作业。只是尝试自动化和简化事情……边缘是绘制为直线还是曲线其实并不重要。我更感兴趣的是节点在二维平面上的位置,这样相交的边越少,边的长度越小。