Clase 7: Modelos complejos II¶
Funciones¶
Funciones en Minizinc
- Posibilidad tener segmentos de código que se reutilizan
- Las funciones pueden ser calculos en este caso son constantes int, float, string, array, boolean, etc
- Las función de variables de decisión, en este caso se declaran con var
- Podemos usar bloques locales dentro de las funciones, con let {declaciones, restriccion} in expresion
% Ejemplo de predicados y funciones
function var int: doubleOf(var int: x) = 2*x;
var int: y;
constraint doubleOf(y) <= 8;
constraint y >= 0;
solve maximize doubleOf(y);
output["y= ", show(y)];
% Ejemplo de predicados y funciones
function var int: doubleOf(var int: x) =
let {
var int: p = 2*x;
constraint x>=0;
}
in p;
var int: y;
var int: z;
%constraint y>=0;
constraint doubleOf(y) <= 8;
constraint doubleOf(3*z) <= 12;
solve maximize doubleOf(y)+doubleOf(z);
output["y= ", show(y),
" z = ", show(z) ];
%Ejemplo minimizar distancia entre dos puntos
include "alldifferent.mzn";
var int: x0;
var int: y0;
var int: x1;
var int: y1;
function var float: distancia(var int:x0, var int:y0, var int:x1, var int:y1) =
let {
var int: d1 = x1*x1-x0*x0;
var int: d2 = y1*y1-y0*y0;
constraint x0 >= 0;
constraint x1 >= 0;
constraint y0 >= 0;
constraint y1 >= 0;
constraint alldifferent([x0,x1]);
constraint alldifferent([y0,y1]);
}
in d1 + d2;
constraint distancia(x0,y0,x1,y1) <= 10.0;
constraint x1 >= 3;
solve minimize x0+y0;
output[
show(x0), " ", show(y0), " | ", show(x1), " ", show(y1)];
Predicados¶
Que son
- Son funciones, pero que retornan booleano (no es necesario especificar)
- Son utiles para aplicar restricciones
- Están optimizados ya que son estrictamente booleanos
%Ejemplo con predicados
include "alldifferent.mzn";
predicate pares(var int: x) =
let
{
var int: p = x;
constraint p > 0;
} in p mod 2 = 0;
array[1..3] of var int: arr;
constraint forall(i in 1..3)(pares(arr[i]));
constraint alldifferent(arr);
constraint forall(i in 1..2)(arr[i] < arr[i+1]);
solve satisfy;
output[show(arr)];