programación con restricciones en javagpd.sip.ucm.es/rafa/docencia/pr/presenta/jacop-raul serrano...

15
Programación con restricciones en Java

Upload: doanminh

Post on 11-Feb-2019

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Programación con restricciones en Java

Page 2: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

En nombre es muy explicativo por si solo: JAva COnstraint Programming.

JaCoP es una librería Java de código abierto dedicada al modelado y resolución de problemas con restricciones.

Su núcleo fue creado en el 2001 por Krzysztof Kuchcinski and Radoslaw Szymanek.

Se distribuye con una licencia GNU Affero GPL de manera gratuita.

+ info : www.jacop.eu (Web oficial) Api: jacopapi.osolpro.com

Page 3: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Contiene 3 tipos de resolutores:

Variables de Dominio Finito: IntVar

Conjuntos: SetVar

SAT: BooleanVar (medalla de plata en Minizinc Challenge 2011)

Implementa un intérprete de flatzinc

Page 4: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Código: pr.jacop.EjemploMapas.ColorearMapas.java

Page 5: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Alldifferent: Sintaxis:

▪ Alldifferent(ArrayList<? Extends IntVar> variables) ▪ Alldifferent(IntVar[] variables)

Funcionamiento: ▪ Exige que todas las variables indicadas sean diferentes dos a

dos.

Ejemplo: IntVar a = new IntVar(store, "a", 2, 3); IntVar b = new IntVar(store, "b", 2, 3); IntVar c = new IntVar(store, "c", 1, 3); IntVar[] v = {a, b, c}; store.impose(new Alldifferent(v));

Page 6: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Código: pr.jacop.EjemploSudoku.Sudokus.java

Page 7: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Cumulative:

Sintaxis:

▪ Cumulative(inicios, duraciones, recursos, limiteRecurso)

Funcionamiento:

▪ Planifica en el tiempo los inicios de tareas su duración y sus recursos requeridos con un límite de recursos.

Page 8: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Código: pr.jacop.EjemploCumulative.Programadores.java

Page 9: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

JaCoP dispone de una serie de predicados predefinidos entre los que se encuentran:

Circuit, Element, Distance, Diff2, Min, Max, Sum, SumWeight, ExtensionalSupport, ExtensionalConflict, Assignment, Count, Values, GCC, Among, AmongVar, Regular, Knapsack, Geost, NetworkFlow, Binpacking, Sequence, Stretch, Lex, Soft-Alldifferent, Soft-GCC.

Page 10: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Restricción Especificación JaCoP

X = Const XeqC(X, Const) X = Y XeqY(X, Y) X≠Const XneqC(X, Const) X≠Y XneqY(X, Y) X > Const XgtC(X, Const) X > Y XgtY(X, Y) X ≥ Const XgteqC(X, Const) X ≥ Y XgteqY(X, Y) X < Const XltC(X, Const) X < Y XltY(X, Y) X ≤ Const XlteqC(X, Const) X ≤ Y XlteqY(X, Y) X ⋅ Const = Z XmulCeqZ(X, Const, Z) X ⋅ Y = Z XmulYeqZ(X, Y, Z) X ÷ Y = Z XdivYeqZ(X, Y, Z) X modY = Z XmodYeqZ(X, Y, Z) X + Const = Z XplusCeqZ(X, Const, Z) X + Y = Z XplusYeqZ(X, Y, Z) X + Y + Const = Z XplusYplusCeqZ(X, Y, Const, Z) X + Y + Q = Z XplusYplusQeqZ(X, Y, Q, Z) X + Const ≤ Z XplusClteqZ(X, Const, Z) X + Y ≤ Z XplusYlteqZ(X, Y, Z) X + Y > Const XplusYgtC(X, Y, Const) X + Y + Q > Const XplusYplusQgtC(X, Y, Q, Const) |X| = Y AbsXeqY(X, Y) XY = Z XexpYeqZ(X, Y, Z)

En JaCoP Disponemos de todas las posibles restricciones de variables enteras que se pueden esperar de un lenguaje de programación con restricciones.

Page 11: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Restricción Especificación JaCoP

¬c Not(c); c1 ⇔ c2 Eq(c1, c2); c1 ∧ c2 ∧…∧ cn PrimitiveConstraint[] c = {c1, c2, …cn};

And(c); or ArrayList c = new ArrayList(); c.add(c1); c.add(c2); …c.add(cn); And(c);

c1 ∨ c2 ∨…∨ cn PrimitiveConstraint[] c = {c1, c2, …cn}; Or(c); or ArrayList c = new ArrayList(); c.add(c1); c.add(c2); …c.add(cn); Or(c);

Page 12: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Restricción Especificación JaCoP

X in Dom In(X, Dom); c ⇔ B Reified(c, B); c ⇔¬B Xor(c, B); if c1 then c2 IfThen(c1, c2); if c1 then c2 else c3 IfThenElse(c1, c2, c3);

Operaciones Booleanas BooleanVar[] b = {b1, b2, …, bn}; or ArrayList b = new ArrayList<="" span=""> b.add(b1); b.add(b2); …b.add(bn); BoolanVariable result = new BooleanVar(store, "result");

result = b1 ∧ b2 ∧…∧ bn AndBool(b, result) result = b1 ∨ b2 ∨…∨ bn OrBool(b, result) result = b1 ⊕ b2 XorBool(b1, b2, result) result = b1 → b2 IfThenBool(b1, b2, result)

Page 13: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Restricción Especificación JaCoP

e ∈ A EinA(e, A) S1 = S2 AeqB(S1, S2) S1 ⊆ S2 AinB(S1, S2) S1 ⋃ S2 = S3 AunionBeqC(S1, S2, S3) S1 ⋂ S2 = S3 AintersectBeqC(S1, S2, S3) S1 \ S2 = S3 AdiffBeqC(S1, S2, S3) S1 <> S2 AdisjointB(S1, S2) Match Match(Set, VarArray) #S1 = X CardAeqX(S, X) Weighted sum < S, W > = X SumWeightedSet(S, W, X) Set[X] = Y ElementSet(X, Set, Y)

Page 14: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

Código: pr.jacop.EjemploCumulative.Programadores.java

Page 15: Programación con restricciones en Javagpd.sip.ucm.es/rafa/docencia/pr/presenta/JaCoP-Raul Serrano Ruiz y... · JaCoP es una librería Java de código abierto ... Es fácil de integrar

3.000 millones de razones por las que usar JaCoP:

Es sencillo y rápido de usar.

Es fácil de integrar en aplicaciones comerciales.