Organik bir bileşiği temsil etmek için hangi veri yapısını kullanırsınız?


11

Bir molekülü temsil etmek için kullanılabilecek iyi veri yapıları var mı?

Her atomu bir tepe noktası haline getirerek belki de onu bir Grafik olarak temsil ettiğimi düşünüyordum, ancak organik bileşiklerin çok sayıda Karbon ve Hidrojen içermesi yaygındı. Nasıl numaralandırırdınız? Molekülleri temsil etmenin iyi bir yolu var, ama aynı zamanda etkili bir .contains()yöntem var mı?

Bunun en temel kullanımlarından biri, bir bileşiğin karbonil grubu, ya da benzilik bir hidrojen, hatta bir benzen halkası içerip içermediğini kontrol etmek olacaktır.



8
Sanırım bir kimyager sormalısın. Bunu nasıl programlayacaklarını bilmeyebilirler, ancak bileşiklerin nasıl temsil edileceğini biliyorlar ve olasılıkların çoğunu düşünüyorlar (örneğin, sadece altıgen ile benceni temsil ediyorlar). Ayrıca, bazı soyutlama seviyeleri vardır (bir protein, bir grup atom olarak değil, bir aminoasit dizisi olarak tanımlanır). Kağıtta nasıl temsil edileceğini anladıktan sonra, programlama kısmı oldukça basit olmalıdır
SJuan76

Bu mükemmel bir soru. Umarım biraz sonra bazı düşünceler ekleme şansım olur.
Stephen

2
Hatırlanması gereken iki şey: atomların farklı izotoplara sahip olabileceğini ve bazı bileşiklerin aynı elementlere sahip olduğunu, ancak bağlanma konumu nedeniyle farklı olduğunu unutmayın .
Telastyn

Yanıtlar:


7

(Biyokimya 30 yıllık yazılım geliştirme tecrübesi ile mezun oldu)

Organik olmayan moleküller "nispeten" basittir. İlginç olanlar kendileriyle bağ kurabilenlerdir, örneğin C, N, O, Si çünkü gerçekten korkak kombinasyonlar elde edebilirsiniz. Benzen halkası çok basit bir örnektir. Bazı varyasyonlar, Karbonlardan biri için bir Azotun yerini alır ve tuhaflaşır.

Ben ondan miras çeşitli atom türleri ile bir "atom" nesne ile başlar.

Her "atom" nesnesi, çeşitli bağları temsil eden atom nesnelerinin bir listesini içerecektir, böylece Azot, sabit boyutlu 3 listesine sahip olacaktır. Daha sonra, diğer üç atoma bağlantıları saklayabilir. Bir çift bağ, çift giriş olarak temsil edilebilir.

Her atomun neye yasal olarak bağlanabileceği ve nasıl bağlanabileceği ile ilgili kuralları vardır.

Böylece, makul derecede karmaşık molekülleri açık bir şekilde oluşturabilirsiniz - çünkü Karbon # 1 üzerindeki bağ 3, Hidrojen 2 üzerindeki bağ 1'e bağlıdır.

Umarım mantıklıdır ...


4

Bunu modellemenin ilk cazibesi dört ağaç tarzı bir veri yapısı kullanmaktır. Her karbon atomu, her biri iki oksijen ve her biri bir hidrojen olmak üzere dört bağlantıya sahiptir. Bunun doğru çözüm olduğunu düşünmüyorum.

Bence uygun çözüm zaten icat edildi. Kullanılacak veri yapısı bir dizedir.

Bunun hakkında düşün. Kimyacılar uzun süredir organik bileşikler modelliyorlar. Bir kimyager CH4'ü gösterirseniz, bunu hemen metan olarak tanıyacaklardır. Onlara CH3CH2OH gösterin ve bunu etanol olarak tanıyacaklar. Bunu fark ederler çünkü CH3CH2 kombinasyonunu bir "et" bileşiği (iki karbon atomu anlamına gelir) ve OH'yi bir "anol" veya alkol grubu olarak tanımlarlar.

Ayrıca alt dizeleri aramak ve tanımlamak için önceden var olan bir metodolojimiz var - normal ifadeler.

Dolayısıyla, organik olarak bir bileşiği programlı olarak temsil etmek için, bir bileşiği, kimyasal formülünü temsil eden bir ip ve kimyasal adını tanımlayan bir ip içerecek şekilde tanımlayacağım. Bileşiğin hangi "özel" özelliklerine sahip olduğunu belirleyen yöntemlere sahip olabilir.

C # 'da bir örnek sınıf:

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);
    }
}

Açıkçası, formülü temel alan adı hesaplayan nameCalculator sınıfını yazmanız gerekir. Bir benzin halkasını tanımlayan regex'i oluşturmanız gerekir. Aramak istediğiniz grupların her biri için ek regex'ler tanımlayın.

Bileşikleri bu şekilde modellemenin avantajı, tam olarak son kullanıcının iş alanında olan dilde olmasıdır. Geliştiricinin bilmesi gereken tek şey, bir metin kitabı veya bir kimyager tarafından kolayca sağlanabilen, aranacak dizelerdir.

Bu kimyasalların yapısal temsili gerekirse, formülün SMILES temsillerini muhafaza etmeyi öneriyorum.

SMILES kimyasal formül gösterimi


2
İzomerleri bu şekilde nasıl ele alırsınız ?

Bu harika bir soru. Bunun zaten düşünülmüş olduğu ortaya çıkıyor. Cevaba SMILES kimyasal formül temsili hakkında bilgi ekledim.
Stephen

aslında hangi özellikleri modellemek istediğinize bağlı olarak kullanılabilen çeşitli sistematik ad sistemleri vardır
jk.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.