220 likes | 375 Views
JaCoP : Java Constraint Programming. Xavier Portilla Edo Luis Bernácer Sanchis. Introducción. JaCoP es una librer í a Java, que permite modelar y resolver problemas con restricciones .
E N D
JaCoP: Java ConstraintProgramming Xavier Portilla Edo Luis Bernácer Sanchis
Introducción • JaCoPes una librería Java, que permite modelar y resolver problemas con restricciones. • Proporciona primitivas para definir dominios finitos, variables, restricciones y métodos de búsqueda. • Descarga e instalación: • Descargar de su página http://sourceforge.net/projects/jacop-solver • Para instalar, simplemente hay queimportarel JaCoP-X.jar.
Introducción • JaCoP ha sido desarrollado activamente desde el año 2001. • Fue creado por: KrzysztofKuchcinski y SzymanekRadosla. • Hay un número de personas que han contribuido al desarrollo JaCoPademás de los desarrolladores principales. • Ganó en 2011 la medalla de plata MiniZincChallengecomo resolutor de booleans. • Posee una licencia GNU AfferoGPL. • Su propósito es declarar que el software cubierto por esta licencia es software libre y protegerlo de intentos de apropiación que restrinjan esas libertades a los usuarios. • Si haces alguna modificación debes publicarlo.
Store • Variables y restricciones se almacenan en un Store. • El Store tiene que ser creado antes de variables y de las restricciones. • Store store = new Store();
Variables de dominio finito • IntVar x = new IntVar(store, "X", 1,100); • Store donde lo incluyes. • Stringidentificativa. • Máximo y mínimo posible de valores del dominio(1,100). • También existen en JaCoP variables de dominio finito que tratan booleans: • BooleanVarbv = new BooleanVar(s, "bv");
Conjuntos • Set se define como un conjunto ordenado de números enteros y un dominio. • SetVars = new SetVar(store, "s", 1, 3); • Store donde lo incluyes. • Stringidentificatibo. • Maximo y minimoposible de conjunto (1,3).
Constraints • JaCoPofrece restricciones primitivas, como la igualdad, la desigualdad, así como las limitaciones lógicasy condicionales. • También ofrece restricciones globales. • Hacen referencia a los predicados en MiniZinc.
Constraints • Aplicación • store.impose( new XeqY(x1, x2)); • O descompuesta: • PrimitiveConstraint c = new XeqY(x1, x2); c.impose(store);
PrimitiveConstraints • JaCoPofrece un conjunto de restricciones primitivas que incluyen: • Operaciones aritméticas básicas (+, -, *, /). • Relaciones básicas (=, !=, <, ≤,>, ≥).
Logical and Conditional constraints • JACOP permite la utilización de constraints a partir de predicados lógicos:
Global Constraints • Alldifferent • IntVara = new IntVar(store, "a", 1, 3); IntVarb = new IntVar(store, "b", 1, 3); IntVarc = new IntVar(store, "c", 1, 3); IntVar[] v = {a, b, c}; Constraint ctr = new Alldifferent(v); store.impose(ctr);
Global Constraint • Cumulative • IntVar[] o = {O1, ..., On};IntVar[] d = {D1, ..., Dn};IntVar[] r = {AR1, ..., ARn};IntVar Limit = new IntVar(Store, "limit", 0, 10); Constraint ctr = Cumulative(o, d, r, Limit);
Global Constraints • Count • Circuit • Element • Distance • Knapsack • Regular • Geost • Binpacking • Diff2 • Assignment • Values • Global cardinality • NetworkFlow • Max y Min
Set Constraints • Se trata de restriccionessobreconjuntos. • SetVar s1 = new SetVar(store, "s1", 1, 3); SetVar s2 = new SetVar(store, "s1", 4, 6); SetVars = new SetVar(store, "s", 1,10); Constraint c = new AunionBeqC(s1, s2, s);
Búsqueda de la solución • Se elige el método de búsqueda que se desee para hallar la solución. • Ejemplo: s = new DepthFirstSearch<TipoVariable>(); (primero en profundidad) • Seguidamente se selecciona algunos parámetro que determinan la heurística del método de búsqueda seleccionado. A esto se le llaman Select. • Ejemplo: select = new InputOrderSelect<tipoVariable>(store, variable , valor del domino a coger);
Búsqueda de la solución • Finalmente solo nos queda llamar al método labeling de nuestro algoritmo de búsqueda. • Ejemplo: s.labeling(store, select); • Este método imprime por pantalla una solución a parte de información adicional, como nodos expandidos, número de decisiones tomadas, etc… • Este método devuelve true si se ha encontrado al menos alguna solución, false en caso contrario.
Ejemplo 1 • Colorear un grafo no dirigido.
Ejemplo 2 • El Problema de las n-reinas. • En JaCoP con 50 reinas tarda aproximadamente unos 156 ms. • En MiniZinc lo tuvimos que parar a los 20minutos de ejecución ya que aun no había encontrado ninguna solución.
Conclusiones • Al ser una librería de Java, tenemos todas las prestaciones de éste lenguaje de programación. • Tiene una sintaxis bastante sencilla de entender si tienes conocimientos básicos de lenguajes orientados a objetos y de lenguajes de restricciones. • Es bastante veloz, al contrario que MiniZinc, pero no es tan rápido como otros lenguajes de restricciones o librerías, como Gecode o Comet.