2010-09-08 19 views
5

I tienen muchas listas de tamaño variable que contiene las instancias de la misma clase con foo atributo, y para cada lista que debe aplicar reglas como:¿Cómo verificar las restricciones entre los elementos en una lista/es esta Programación de Restricciones?

  • si hay un elemento foo = A no puede haber elementos con foo en [ B, C, D]
  • si hay un foo elemento = X debe por al menos una con foo en [y, Z]
  • no puede haber entre elementos MIN y MAX foo = bar

la combinación de las tres reglas anteriores probablemente sea suficiente para expresar cualquier restricción similar Lo necesitaré alguna vez Es algo así como la comprobación de dependencia en paquetes de software, pero tengo cantidades y versiones falta :)

un enfoque ingenuo sería:

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.. 

¿Es un problema de Constraint programming? Realmente no necesito resolver algo para obtener un resultado, necesito validar mi lista contra algunas restricciones y comprobar si están satisfechas o no. ¿Cómo clasificaría este problema y cómo lo resolvería?

Por lo que vale, estoy codificando en Python, pero doy la bienvenida a una respuesta de programación genérica :) Si resulta que debo ahondar en la programación de restricciones Probablemente comenzaré probando python-constraint.

Respuesta

4

Respuesta breve: sí, esto podría verificarse mediante la programación de restricciones; de hecho, está suministrando una solución y verificandola contra restricciones en lugar de que la solución resuelva en dominios de potenciales para una solución coincidente. ¿Qué tipo de exceso de programación de restricción hace estragos, especialmente si está utilizando Python que puede verificar fácilmente ese tipo de condiciones?

No tengo Python en esta máquina, por lo que puede haber un error/error en este código, pero muestra lo que está buscando sin necesidad de involucrarse en la programación de restricciones.

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 

Básicamente yo diría que a menos que las restricciones se van a poner mucho más compleja o que van a querer encontrar soluciones en lugar de probar me quedo con código en lugar de la programación con restricciones.

Cuestiones relacionadas