Devo usare matrici o dizionari annidati?

3

Come per Dovrei fare la mia domanda su quale struttura dati usare qui? Sto chiedendo questo qui. Spero che questo non sia troppo specifico per l'implementazione.

Attualmente sto sviluppando un programma che rappresenterà le strutture chimiche (e alla fine consentirà manipolazioni / reazioni di esse). Ho nascosto due diversi sistemi di archiviazione di questi dati, ma non sono sicuro di come scegliere quale.

Opzione 1: matrici annidate

I prodotti chimici hanno (più o meno) strutture definite e posizioni relative degli oggetti, e sembra che sarebbe più semplice rappresentare qualcosa di simile con una matrice - quindi posso assegnare "coordinate" definite ad ogni atomo o legame. Sfortunatamente, si finisce per sovrapporsi se si dispone di una struttura che si dirama in modo equo. Per risolvere questo problema ho risolto una soluzione che utilizzava matrici nidificate 5x5.

[[None,  None, [CH3], None, None ],
 [None,  None, Bond,  None, None ],
 [[CH3], Bond, C,     Bond, [CH3]],
 [None,  None, Bond,  None, None ],
 [None,  None, [CH3], None, None ]]

Qui C rappresenta l'elemento carbonio (questo potrebbe essere rappresentato in un paio di modi diversi, e qui non è particolarmente rilevante). Bond rappresenta un legame e [CH3] rappresenta un'altra matrice 5x5. Questo è il più alto ( [0][2] ) CH3

[[None, None, H,    None, None],
 [None, None, Bond, None, None],
 [H,    Bond, C,    Bond, H   ],
 [None, None, Bond, None, None],
 [None, None, Root, None, None]]

Qui il più basso Bond è un riferimento allo stesso oggetto del più alto Bond nella prima struttura, mentre Root è (un po 'indeterminato) il modo di mettere in relazione che questo è dove la matrice si connette al livello successivo su. Se questa fosse una struttura più complessa, uno dei H s sarebbe sostituito da un'altra matrice, ad esempio un [CH3] aggiuntivo.

Vantaggi di questo metodo:

  • Tutto è esplicitamente definito, inclusa la struttura, che è buona secondo Lo Zen di Python .
  • Quando queste sostanze chimiche sono (eventualmente) rappresentate graficamente, sarà (teoricamente) molto più facile assicurarsi che ogni cosa sia al suo posto

Svantaggi:

  • Questo non è affatto leggibile se hai una struttura più complessa
  • Questo è annidato, non piatto
  • Questo richiederà molte ricorsioni per passare attraverso

Opzione 2: dizionari

Un altro modo in cui potrei rappresentarli con una nidificazione significativamente inferiore e una migliore leggibilità sarebbero i dizionari. Ogni molecola sarebbe una chiave in un dizionario {Molecule1 : Data, Molecule2 : Data} e i dati sarebbero anche dizionari Atoms: Data, Bonds: Data . Ciò richiede un po 'meno di nidificazione, ma richiederebbe un po' più di lavoro quando alla fine voglio mostrarli.

Pensieri di chiusura

Prima di fare questa domanda, e in effetti mentre lo scrivevo, sono stato piuttosto impostato sui dizionari. Sembra un metodo più semplice e pulito per archiviare questi dati, e non richiederà di capire una tecnica ricorsiva davvero sgradevole per camminare attraverso una molecola. Tuttavia non sarei sorpreso se mi fossi perso qualcosa ed è per questo che sto chiedendo qui.

Se questo sembra troppo specifico per l'implementazione per favore fammi sapere cosa pensi che dovrei cambiare e farò del mio meglio per renderlo più generale

    
posta Dannnno 17.08.2014 - 19:58
fonte

2 risposte

3

Il "metodo matrix" ha diversi problemi:

  • Perché solo due dimensioni? Moltissime molecole sono strutture piatte bidimensionali (a meno che non lavori esclusivamente con grafene). Praticamente qualsiasi programma che si occupi di strutture chimiche vorrà lavorare in 3D (escludendo quelli il cui solo scopo è quello di disegnare formule strutturali). Riducendo tutto in 2D, stai perdendo informazioni preziose.

  • Quale beneficio darebbe questo metodo? Per prima cosa, trovare gli atomi adiacenti è piuttosto complesso: devi guardare i vicini adiacenti nella matrice, dei quali ottieni solo un massimo di 4 prima di doversi staccare usando "Root". La restrizione artificiale di 4 vicini in una matrice renderà il tuo codice molto brutto.

La mia unica ipotesi sul motivo per cui si desidera utilizzare questo è perché si desidera visualizzare le molecole alla fine. Il display è la parte complicata (appiattire una molecola 3D in una formula 2D è un po 'un'arte anche per un essere umano), ma dovresti cercare di separare la logica di visualizzazione dai dati interni che memorizzano la struttura molecolare.

Non sono del tutto chiaro quale sia il tuo "metodo del dizionario": ad esempio, cosa indica Atoms ? Sono solo etichette arbitrarie, ID o il simbolo dell'elemento? (Ricorda che le chiavi del dizionario devono essere univoche così il simbolo dell'elemento non funzionerà.)

Puoi approfittare del fatto che Python ti permette di avere riferimenti ciclici e di costruire grafici del atomi. Questo ti permette di capire facilmente gli atomi adiacenti.

Ecco un esempio:

class Atom(object):
    def __init__(self, element, position):
        self.element = element
        self.position = position
        # each one for a different bond order, starting at 1
        self.bonds = [set(), set(), set(), set()]
    def bond_with(self, other, order=1):
        self.bonds[order].add(other)
        other.bonds[order].add(self)

# construct hydrogen fluoride
H = Atom("H", (0.0, 0.0, 0.0))
F = Atom("F", (0.0, 0.0, 1.0))
H.bond_with(F)
HF = set((H, F))
    
risposta data 18.08.2014 - 02:37
fonte
2

I dizionari sono ciò che usa la libreria di grafi primari di Python NetworkX . Ogni struttura grafica è un dizionario di dizionari. Quindi è nidificato in un certo senso ma non di molto. Le molecole sono molto rappresentabili dai grafici, essendo collegati a gruppi di nodi.

Se vuoi saltare tutto ciò e andare direttamente al lavoro di modellazione, c'è un kit completo per questo. Il toolkit Molecular Modeling è un insieme di librerie per la gestione delle molecole modellazione in Python. Si rivolge principalmente a Bioscience, ma sono sicuro che potresti usarlo per altri tipi di lavori chimici, come la ricerca sui materiali e la geochimica. Può anche essere riprodotto su vari visualizzatori.

    
risposta data 17.08.2014 - 20:14
fonte

Leggi altre domande sui tag