有人问到 GraphViz 中的重叠子簇,得到如下回复:
抱歉,没有。一般子图可以共享节点而不意味着包含子集,但不能共享集群。问题出在图中。如果簇可以任意重叠,那么绘制它们就变成了绘制维恩图的问题,没有好的算法。
“绘制维恩图的问题”的正式定义或示例是什么?为什么它(我假设 NP-complete/hard)很难?(加分:对一个著名的 NP 完全问题进行简化)
有人问到 GraphViz 中的重叠子簇,得到如下回复:
抱歉,没有。一般子图可以共享节点而不意味着包含子集,但不能共享集群。问题出在图中。如果簇可以任意重叠,那么绘制它们就变成了绘制维恩图的问题,没有好的算法。
“绘制维恩图的问题”的正式定义或示例是什么?为什么它(我假设 NP-complete/hard)很难?(加分:对一个著名的 NP 完全问题进行简化)
您有 N 个点和一个二元关系 R,并且您需要以图形方式表示该关系,以便每个节点都由欧几里得平面上的一个圆表示,以便两个圆重叠当且仅当对应的节点 n 和 n' 它认为 n R n'。
在许多情况下,我们可以将 GraphViz 用于相同的目的,而不是像这样的维恩图,使用对偶图,它是集合交集的布尔格。每个节点代表要包含的集合和要排除的集合的唯一选择。仅通过包含/排除单个集合而不同的节点被连接。
对于越来越多的集合,当然通常会有很多很多的节点和边。但是在许多实际设置中,会有很多集合根本不相交,因此可以省略那些相交节点以及从它们到其他节点的任何边。通过这种方法,节点和边的数量可以减少到实际数量。
在布置结果图时,最好选择 GraphViz 算法“neato”并要求避免节点重叠。进行这些设置的一种方法是在图表的左大括号内写入layout=neato,overlap=prism; .