我有一个(循环无向)图,存储在一个合适的结构中(这取决于选择的语言)。节点代表现实世界中的地方,边代表它们之间的联系,所以我对绘图有一种初步的猜测。
我必须用一些约束和要求来绘制这个图,并且从我读过的(科学文献和关于绘图的书籍)来看,目前没有一个算法专门解决这个要求,尽管 Sugiyama 的磁化弹簧非常接近我想要的达到。然而,如果提供合适的成本函数,模拟退火可以解决这个问题,这不是一项简单的任务。
所以问题是:你能帮我制作一个程序,用下面列举的约束来解决图形绘制问题吗?
约束和要求
- 边缘必须以 45 k度对齐,k介于 0 和 7 之间(如果此要求太强,则至少为整数)。但是,在算法的执行过程中,我认为没有理由禁止违反该约束。
- 由于图表示物理位置,算法必须保持相对位置(例如,如果节点 A 在初始猜测中是 B 的东北偏北,则 A 必须是 B 的北或东北,但可以例外以满足下一个要求)。
- 节点距离应该趋向于“自然”的预定义长度和对齐方式(如果图形是开放链,算法应该输出对齐在一条线上的等距节点)
- 弯曲应发生在节点处,两个相邻边缘之间的角度应为 135 度,叉除外。
- 必须避免边缘交叉。
- 标签不得与图纸的任何部分重叠,并且应按以下规范定位(0 度 = 水平轴,文本框逆时针旋转):
- 如果这个不是水平的,则与超级边缘(对齐边缘的聚合)正交
- Bend:prefer [凸边,与最长的相邻超边正交]
- 水平边缘
- 45度
- -45度
- -135度
- 水平下方
- 水平以上
- 135度
我还没有选择编程语言,但我想我会坚持使用 C/C++、Python、Perl 或 Lua。输入将是我一开始谈到的“对象”,输出将是相同的“对象”,但节点位置已被优化算法改变。
典型的问题将有大约 500 个节点,小区域人口密集且连接,这些区域之间的连接密度较低(但不是唯一的)。我对效率不感兴趣,至少目前是这样。