【问题标题】:How to represent molecules and compare equality如何表示分子并比较相等性
【发布时间】: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 搜索让我失望了。

【问题讨论】:

标签: algorithm graph equality


【解决方案1】:

如果图是非循环的,那么它是一个树同构问题,它有一个非常简单的解决方案。

现在让我们假设所有内部节点都是碳并且所有边都是相同的(稍后将介绍如何放宽此限制。)

将叶节点表示为数字 - 说它们的原子序数。将高度为 1 的树表示为其叶节点的排序列表,因此:

    H             Cl
    |             |
H - C - H  and Cl-C-Cl
    |             |
    H             H

分别是 [1,1,1,1] 和 [1,17,17,17]。显然,如果排序列表相同,则两个分子是同构的。

这推广到更大高度的树 - 将高度为 n 的树表示为其子树的表示列表,按字典顺序排序,所以

    Cl H            H   H
    |  |            |   |
H - C -C-Cl and Cl- C - C - Cl
    |  |            |   |
    Cl H            H  Cl

都是 [[1,1,17],[1,17,17]]。两棵树是同构的,如果它们的表示是。

注意:通常树同构算法适用于有根树。在这里,我们只是从叶子递归到图的中心,有时会给我们留下两个“根”。

    H   H   Cl  
    |   |   |   
H - C - C - C - H
    |   |   |   
    H   H   H   

这里,左边的C是[1,1,1],右边的C是[1,1,17]。中间的 C(这里是根)有这两个列表加上两个叶子。按字典顺序排序为 [1,1,[1,1,1],[1,1,17]]。

现在用于表示非 C 的内部节点 - 你可以通过附加一个带有特殊数字的假叶子来模拟它们,所以

    H   
    |   
H - C - O - H 
    |   
    H  

可以编码为

    H   
    |   
H - C - C - H 
    |   |
    H   Fake

“假”可以在哪里,比如 511,这样我们就知道它不会与任何现有的原子发生冲突。因此,整个分子将是 [[1,1,1],[1,511]]。

所以算法是:

  1. 将两个分子都转换为按字典顺序递归排序的列表形式。
  2. 检查表示是否相等。

【讨论】:

    【解决方案2】:

    @Rafal 讨论了树木的情况。但是如果你没有树呢?这是我的两分钱:

    数学方法

    Mathematica 有一个内置谓词来检查两个图是否同构。如果没有,可以试用 30 天。

    检查 nauty

    nauty 是一个求解器,您可以在其中下载并测试同构。

    提前检测真阴性

    您可以通过简单地计算和比较一些数字/序列来提前检测出真阴性。这包括计算顶点和边集度数的度数序列。一对通过它的图并不一定意味着它们是同构的,但会减少你的空间(可能会大大减少!)。

    最重要的是,recent 问题的进展表明同构测试是有界树宽图的多项式。即使您的图表看起来很一般,它们也可能表现出此属性(或者您可以简单地假设它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多