2010-09-08 12 views
5

Ho molti elenchi di variabili dimensioni contenenti istanze della stessa classe con l'attributo foo, e per ogni lista che deve applicare le regole come:Come controllare i vincoli tra gli elementi di una lista/è questa programmazione di vincoli?

  • se c'è un elemento foo = A non ci possono essere elementi con foo in [ B, C, D]
  • se c'è un foo elemento = X deve da almeno uno con foo in [Y, Z]
  • ci può essere tra elementi MIN e MAX foo = bar

la combinazione delle tre regole precedenti è probabilmente sufficiente per esprimere un simile vincolo Avrò mai bisogno E 'qualcosa di simile a dipendenza del check-in pacchetti software, ma ho le quantità e le versioni mancanza :)

un approccio ingenuo sarebbe:

R_CONFLICT={ A: [B,C,D] } 
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W 
R_MIN  ={BAR: n, BAZ: m} 
R_MAX  ={BAR: o, BAZ: p} 
# now just loop over lists to check them.. 

questo è un problema di Constraint programming? Non ho effettivamente bisogno di risolvere qualcosa per ottenere un risultato, ho bisogno di convalidare la mia lista contro alcuni vincoli e verificare se sono soddisfatti o meno. Come classificheresti questo problema e come lo risolveresti?

Per quello che vale, sto codificando in Python, ma accolgo con favore una risposta di programmazione generica :) Se risulta che devo approfondire la programmazione dei vincoli probabilmente inizierò provando python-constraint.

risposta

4

Risposta breve: sì, è possibile verificarlo utilizzando la programmazione dei vincoli, in effetti si sta fornendo una soluzione e controllandola rispetto a vincoli anziché avere la ricerca del risolutore attraverso domini di potenziali per una soluzione di corrispondenza. Quale tipo di overlay di programmazione dei vincoli, specialmente se si sta usando Python che può facilmente controllare questo tipo di condizioni.

Non ho Python su questa macchina, quindi potrebbe esserci un errore di battitura in questo codice ma mostra ciò che stai cercando senza doverti coinvolgere con la programmazione dei vincoli.

conflict = set([B, C , D]) 
foos = set([x.foo for x in list]) 
if A in foos: 
    if len(foos & conflict): #Set intersection 
     return false 

len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR 

Fondamentalmente direi a meno che i vincoli stanno andando ottenere molto più complesso e si sta andando a voler trovare soluzioni e non solo testare mi piacerebbe restare con il codice, piuttosto che la programmazione a vincoli.

Problemi correlati