programación con restricciones en javagpd.sip.ucm.es/rafa/docencia/pr/presenta/jacop-raul serrano...
TRANSCRIPT
Programación con restricciones en Java
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
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
Código: pr.jacop.EjemploMapas.ColorearMapas.java
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));
Código: pr.jacop.EjemploSudoku.Sudokus.java
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.
Código: pr.jacop.EjemploCumulative.Programadores.java
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.
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.
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);
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)
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)
Código: pr.jacop.EjemploCumulative.Programadores.java
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.