分子を表すために使用できる優れたデータ構造はありますか?
すべての原子を頂点にすることでグラフとして表現できると考えていましたが、有機化合物には多くの炭素と水素が含まれているのが一般的です。どのように番号を付けますか?分子を表現する良い方法はありますが、同時に効率的な.contains()
方法がありますか?
これの最も基本的な用途の1つは、化合物にカルボニル基、ベンジル水素、またはベンゼン環が含まれているかどうかを確認することです。
分子を表すために使用できる優れたデータ構造はありますか?
すべての原子を頂点にすることでグラフとして表現できると考えていましたが、有機化合物には多くの炭素と水素が含まれているのが一般的です。どのように番号を付けますか?分子を表現する良い方法はありますが、同時に効率的な.contains()
方法がありますか?
これの最も基本的な用途の1つは、化合物にカルボニル基、ベンジル水素、またはベンゼン環が含まれているかどうかを確認することです。
回答:
(30年のソフトウェア開発経験を持つ生化学の卒業生)
非有機分子は「比較的」単純です。面白いものは、C、N、O、Siなど、自分自身と結合できるものです。なぜなら、いくつかの本当にファンキーな組み合わせが得られるからです。ベンゼン環は非常に簡単な例です。いくつかのバリエーションは、炭素の1つを窒素に置き換えて、奇妙に速くなります。
さまざまなタイプのアトムを継承する「atom」オブジェクトから始めます。
各「原子」オブジェクトには、さまざまな結合を表す原子オブジェクトのリストが含まれているため、窒素には固定サイズ3のリストがあります。その後、他の3つの原子へのリンクを格納できます。二重結合は、重複したエントリとして表される可能性があります。
各アトムには、合法的に結合できるものとその方法に関するルールが組み込まれています。
したがって、炭素#1の結合3は水素2の結合1などにリンクされているため、合理的に複雑な分子を明確に構成できます。
理にかなっていることを願っています...
これをモデル化する最初の誘惑は、四分木スタイルのデータ構造を使用することです。各炭素原子には4つの接続があり、各酸素は2つ、各水素は1つです。しかし、これが適切な解決策だとは思いません。
適切な解決策はすでに発明されていると思います。使用するデータ構造は文字列です。
これについて考える。化学者は、有機化合物をかなり長い間モデリングしています。化学者CH4を表示すると、すぐにメタンとして認識されます。彼らにCH3CH2OHを見せれば、彼らはそれをエタノールとして認識するでしょう。彼らは、CH3CH2の組み合わせを「eth」化合物(2つの炭素原子を意味する)として識別し、OHを「アルコール」またはアルコール基として識別するため、これを認識します。
また、部分文字列(正規表現)を検索および識別するための既存の方法論もあります。
プログラムで有機化合物を表すために、化学式を表す文字列と化学名を定義する文字列を含む化合物を定義します。化合物がどの「特別な」特性を持っているかを特定するメソッドを持つことができます。
C#のサンプルクラス:
public class OrganicCompound
{
private Regex benzineRingRegex;
public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
{
this.Formula = formula;
this.Name = nameCalculator.CalculateName(formula);
this.benzineRingRegex = benzineRingRegex
}
public string Formula { get; private set; }
public string Name { get; private set; }
public bool HasBenzeneRing()
{
return Regex.IsMatch(this.Formula, benzineRingRegex);
}
}
明らかに、式に基づいて名前を計算するnameCalculatorクラスを作成する必要があります。ベンジンリングを定義する正規表現を作成する必要があります。検索するグループごとに追加の正規表現を定義します。
この方法で化合物をモデリングする利点は、エンドユーザーのビジネス領域に正確にある言語にあることです。開発者が知っておく必要があるのは、検索する文字列だけです。これは、教科書または化学者が簡単に提供できます。
これらの化学物質の構造表現が必要な場合は、式のSMILES表現の維持を検討することをお勧めします。