【发布时间】:2014-11-12 06:40:21
【问题描述】:
我见过this question about the representation of molecules in memory,这对我来说很有意义(tl;dr 将其表示为一个图,其中原子作为节点,键作为边)。但现在我的问题是:我们如何检查两个分子是否相等?这可以概括为我们如何检查(非循环)图的相等性?现在我们将忽略stereoisomers 和循环结构,例如第一个链接中给出的示例中的碳环。
下面是对我的问题的更详细描述:对于我的Molecule 类(截至目前),我打算有一个Atoms 数组和一个Bonds 数组。每个Bond 将指向两端的两个Atoms,并且将具有权重(即该边缘的化学键数)。换句话说,这将最类似于边缘列表图。我的第一个猜测是遍历一个分子中的Atoms,并尝试根据包含Bonds 的Bonds 在另一个分子中找到相应的Atoms,但这是一种相当幼稚的方法,并且复杂性似乎相当大(最好的猜测接近 O(n!)。哎呀。)。
不管复杂性如何,这种方法似乎在大多数情况下都有效,但它似乎对某些分子不起作用。以这些为例(注意 OH 组的不同位置):
H H H OH H
| | | | |
H - C - C - C - C - C - H (2-Pentanol)
| | | | |
H H H H H
H H OH H H
| | | | |
H - C - C - C - C - C - H (3-Pentanol)
| | | | |
H H H H H
如果我们检查这些分子,对于一个分子中的每个原子,在另一个分子中都有一个唯一的相同元素原子,它具有相同数量和类型的键,但这两个分子显然不一样,它们也不相同立体异构体(我现在不考虑)。相反,他们是structural isomers。有没有办法我们也可以检查这个相对结构?使用邻接列表而不是边缘列表会更容易吗?有没有我应该研究的图相等算法(最好是在 Java 中)?我对graph canonization 进行了一些研究,但这似乎是 NP 难的。
编辑:看看Graph Isomorphism Problem Wikipedia Article,似乎有界度数的图对这个问题有多项式时间解。此外,平面图也有多项式解(即边只在端点处相交)。在我看来,分子满足这两个条件,那么这个问题的多项式时间解决方案是什么,或者我在哪里可以找到它?这次我的 Google 搜索让我失望了。
【问题讨论】:
-
@n.m.刚刚看了一下,似乎这个问题一般不知道是 NP 完全的。但是,据说有界度图和平面图都具有多项式解,在我看来,分子两者都是。但是,除非我买一本参考的教科书,否则我似乎无法在任何地方找到这些解决方案,这似乎有点多
-
分子是有界度的,但不一定是平面的(sciencedirect.com/science/article/pii/0040403981800779,尽管大多数“正常”分子是平面的)。抱歉,我不知道有界度图的多项式算法是否免费提供。
-
您可能会在scicomp.stackexchange.com得到(更好的)答案
-
@n.m.:我觉得你太专业了。在 Wikipedia's Graph isomorphism page 的引用和来源之后,我发现这篇文章确实提供了 PDF,但不确定它会有多大用处。 sciencedirect.com/science/article/pii/0022000082900095