Transcript pptx - GPD

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.
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 que importar el
JaCoP-X.jar.

Introducción


JaCoP ha sido desarrollado activamente desde el año
2001.
Fue creado por: Krzysztof Kuchcinski y Szymanek
Radosla.



Hay un número de personas que han contribuido al desarrollo
JaCoP además de los desarrolladores principales.
Ganó en 2011 la medalla de plata MiniZinc Challenge
como resolutor de booleans.
Posee una licencia GNU Affero GPL.

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.
 String identificativa.
 Máximo y mínimo posible de valores del
dominio(1,100).

También existen en JaCoP variables de dominio
finito que tratan booleans:
 BooleanVar
bv = new BooleanVar(s, "bv");
Conjuntos


Set se define como un conjunto ordenado de
números enteros y un dominio.
SetVar s = new SetVar(store, "s", 1, 3);
 Store
donde lo incluyes.
 String identificatibo.
 Maximo y minimo posible de conjunto (1,3).
Constraints


JaCoP ofrece restricciones primitivas, como la
igualdad, la desigualdad, así como las limitaciones
lógicas y 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.impose(store);
c = new XeqY(x1, x2);
Primitive Constraints

JaCoP ofrece un conjunto de restricciones primitivas
que incluyen:
 Operaciones
aritméticas básicas (+, -, *, /).
 Relaciones básicas (=, !=, <, ≤,>, ≥).
Primitive Constraints
Logical and Conditional constraints

JACOP permite la utilización de constraints a partir
de predicados lógicos:
Global Constraints

Alldifferent
 IntVar
a = new IntVar(store, "a", 1, 3);
IntVar b = new IntVar(store, "b", 1, 3);
IntVar c = 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 restricciones sobre conjuntos.
 SetVar
s1 = new SetVar(store, "s1", 1, 3);
SetVar s2 = new SetVar(store, "s1", 4, 6);
SetVar s = new SetVar(store, "s", 1,10);
Constraint c = new AunionBeqC(s1, s2, s);
Set Constraints
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 20 minutos 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.