图形同构是计算机科学中一个研究得很好的问题,但是没有已知的多项式时间算法(有一些声明,但它们都没有被证明)。
我必须测试两个图的同构,但对于我的情况,问题略有不同。图形的大小小于10或11,即顶点数量较少。对于图形可以是密集或稀疏的边缘数量没有限制。这种成对测试(同构检查)的数量将在10 ^ 8左右。
如果有人可以建议一些最适合这种情况的算法。如果算法可以并行化也会很棒。
任何帮助表示感谢。
答案 0 :(得分:2)
这个答案依赖于这两个图中的一个对于所有同构检查都是相同的事实。您可以为每个节点计算多种数字,这些数字在重新标记下是不变的:
您可以获取参考图并为每个节点计算其中几个数字。运气好的话,你会找到一组功能,这些功能的计算成本不会太高,并且结果数字将唯一地标识每个节点。您甚至可以将这些数字哈希到一个数字。在这种情况下,您可以按如下方式处理每个输入图:通过计算每个节点的这些数字及其散列,您可以快速确定参考图中的哪个节点对应于输入图的每个节点(如果有)。一旦节点之间有一对一的对应关系,检查所有边缘是否合适都是微不足道的。
如果你没有找到足够便宜的功能集来描述每个节点,我希望在大多数真实世界的图形中(即不是专门为高对称性构建的),你仍然会获得相当小的等价类,因此检查每个类中的所有可能的排列对于您的应用程序来说可能仍然足够便宜。
同样的想法:如果性能在这里是一个真正的问题,您甚至可能会尝试将分析结果转换为自定义程序代码。因此,对于每个参考图,您都应该编译一小段代码,然后可以动态加载以执行这些检查,并使用编译器优化的机器代码可以提供的所有功能。不确定这是否值得付出努力,但我认为这可能是一种有趣的方法。
高度对称的图表可能需要更多工作。您可以尝试预先识别图形的同构。例如,如果您可以在不影响图形结构的情况下交换v1和v2的标签,那么对于您处理的每个输入图形,如果您不确定是否将给定顶点映射到v1或v2,您知道它不会问题,所以你不必尝试两种选择,但可以随意选择v1。这大大减少了你必须检查的排列数量。
答案 1 :(得分:-1)
如果您有办法快速了解从v1到v2有多少边缘,那么您可以快速生成两个图形的小型表示并进行强力检查。但如果你不能快速通过所有的边缘,这意味着你甚至无法有效地阅读你的输入而不是讨论检查同构