繁体   English   中英

在较小图上但有大量测试的图同构

[英]Graph isomorphism on smaller graphs but large number of tests

图同构是计算机科学中一个经过充分研究的问题,但尚不知道多项式时间算法(有一些主张,但尚未被证明)。

我必须测试两个图的同构性,但就我而言,问题略有不同。 图的大小小于或等于10或11,即顶点数量较少。 图的边缘可以是密集的或稀疏的,因此在边的数量上没有限制。 这种成对测试(同构性检查)的数量大约为10 ^ 8。

如果有人可以提出一些最适合这种情况的算法。 如果算法可以并行化也很好。

任何帮助表示赞赏。

这个答案依赖于以下事实:对于所有同构检查,两个图之一将是相同的。 您可以为每个节点计算各种各样的数字,这些数字在重新标记下不变:

  • 节点的度数
  • 邻居的度数之和
  • 邻居的邻居度数之和
  • 对于度数为k的邻居,其邻居度数之和
  • 包含此节点的长度为k的循环数
  • 从该节点到任何其他节点的最大距离
  • 距该节点距离k的节点数
  • ...

您可以获取参考图并为每个节点计算其中一些数字。 幸运的是,您会发现一组函数,这些函数的计算成本并不高,并且这些函数所产生的数字将唯一地标识每个节点。 您甚至可以将这些数字散列为一个数字。 在这种情况下,您可以按以下方式处理每个输入图:通过计算这些数字及其每个节点的哈希值,可以快速确定参考图中的哪个节点对应于输入图的每个节点(如果有)。 节点之间一一对应后,检查所有边缘是否合适。

如果找不到足够便宜的唯一描述每个节点的函数集,我希望在大多数现实世界的图中(即,不是专门为高对称性构造的),您仍然会获得相当小的等价类,因此请检查所有每个类中可能的排列对于您的应用程序来说仍然足够便宜。

就像一个想法:如果性能在这里是一个真正的问题,您甚至可以尝试将分析结果转换为定制的程序代码。 因此,对于每个参考图,您都将让您的应用程序编译一小段代码,然后可以动态加载该代码,以便利用编译器优化的机器代码可以为您提供的所有功能来执行这些检查。 不确定是否值得付出努力,但是我认为这可能是一种有趣的方法。

高度对称的图可能需要更多的工作。 您可以尝试预先确定图的同构。 例如,如果可以在不影响图结构的情况下互换v1和v2的标签,则对于您处理的每个输入图,如果不确定是否将给定顶点映射到v1或v2,您都知道不会无关紧要,因此您不必尝试这两种选择,而可以简单地任意选择v1。 这大大减少了您必须检查的排列数量。

如果您有一种方法可以快速分辨出从v1到v2有多少条边,则可以快速生成两个图的小表示并进行蛮力检查。 但是,如果您不能快速浏览所有内容,那意味着您甚至无法有效地阅读输入内容,而不是在谈论检查同构

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM