Programación por restricciones clase 14 Camilo Rueda Universidad Javeriana-Cali Programación por restriccionesclase 14-- p.1/19 Modelamiento en CCP Dos tipos de restricciones: Solubles Solucionables eficientemente con técnicas de optimización. Chequeables Menos adaptadas para solución eficiente, pero es fácil chequear si una solución las cumple. Las restricciones son chequeables después de tener valores para sus variables: se debe ramificar sobre variables de búsqueda Valores de las variables deben enumerarse En general, variables enteras o discretas. A veces continuas. Ramificar se hace particionando el dominio. Programación por restriccionesclase 14-- p.2/19 Solucionables vs chequeables Cómo relacionar variables de restricciones solucionables con variables de restricciones chequeables? No es en general bueno optimizar sobre solucionables sin mirar chequeables Interacción mediante condicionales if P then S Si el predicado P (restricciones chequeables) se cumple, imponer la restricción solucionable S La ramificación puede hacer que el antecedente P se vuelva válido. Reducción de dominios opera sobre restricciones chequeables Técnicas de optimización operan sobre solucionables. Programación por restriccionesclase 14-- p.3/19 Marco general El marco general de modelamiento es: Minimizar f (x) + r(y) (función objetivo) Sujeto a: pi (y), i ∈ I1 (restricciones chequeables) gi (y), i ∈ I2 (restricciones solucionables) qi (y) → hi (x), i ∈ I3 (restricciones condicionales) di (x, y), i ∈ I4 (restricciones mixtas) x ∈ X (variables solucionables) yj ∈ Dj , para todo j (variables de búsqueda) Programación por restriccionesclase 14-- p.4/19 restricciones Restricciones chequeables pi (y), qi (y) pueden ser fórmulas proposicionales, inecuaciones 0/1, lógica de variables discretas,etc. Restricciones f (x), gi (x), hi (x) son engenral inecuaciones lineales o no lineales sobre variables continuas xj Las restricciones mixtas di (x, y) son restricciones acumulativas, de elemento, etc. Programación por restriccionesclase 14-- p.5/19 Resumen del modelo Restricciones chequeables, solucionables o condicionales, u otras definidas en términos de estas. Restricciones chequeables contienen solamente variables de búsqueda, discretas o continuas restricciones solubles contienen solamente variables solucionables, generalmente continuas. El antecedente de las condicionales son restricciones chequeables El consecuente son restricciones solucionables La función objetivo es separable: Los valores de x y de y son independientes El problema de minimizar f (x sobre restricciones solubles debe ser “fácil”. En general f (x) es función lineal. Programación por restriccionesclase 14-- p.6/19 Restricciones globales La formulación de un modelo es más compacta si incluye restricciones globales Aplicables a muchos problemas Tienen propagadores específicos eficientes Ayudan a construír un lenguaje de modelado para ciertos dominios. Algunas restricciones globales: element sum all-different cummulative Programación por restriccionesclase 14-- p.7/19 Restricción element m_element(y, (c1 , c2 , ..., ck ), z) y es una variable discreta ci son expresiones z debe tomar el valor de la y-esima expresión La restricción m − element es útil para definir restricciones que involucran variables del problema en los subíndices. es equivalente a (y = i) → (z = ci ), i ∈ 1..k Una variante: x_element(y, (xj1 , ..., xjk ), z). La variable z toma el valor de la y-ésima variable x Programación por restriccionesclase 14-- p.8/19 Uso de element Para restricciones que involucran términos de la forma cs(y) , donde s(y) es una función de la variable de búsqueda y Se implementa con m_element(y, (cs(1) , ..., cs(k) ), z) Y se reemplaza toda ocurrencia de cs(y) por z. Ejemplo: La restricción cy,y+1 ≥ 10, donde y ∈ {1, 2, 3, 4}. cy,y+1 se reemplaza por z y la restricción m_element(y, (c1,2 , c2,3 , c3,4 , c4,5 ), z), se agrega al modelo Igual para x_element. Se debe evitar agregar no-linealidades. Ejemplo: P j cyj xj ≥ 10 se remplaza por: P j zj ≥ 10 x_element(yj , (c1 xj , ..., ck xj ), zj ), para todo j Programación por restriccionesclase 14-- p.9/19 Restricción sum m_sum(y, (S1 , ..., Sk ), (c1 , ..., cm ), z) Si es un conjunto de índices en {1, ..., m} Los cj son constantes. y es variable entera Equivale a la restricción: (y = i) → z= P j∈Si cj para i = 1, ..., k La versión x_sum(y, (S1 , ..., Sk ), (f1 (x), ..., fm (x)), z) equivale a (y = i) → z= P j∈Si fj (x) Programación por restriccionesclase 14-- p.10/19 Ejemplo de sum sum(y, ({1, 2, 3}, {1, 2, 4}, {1, 3, 4}), (10, 20, 50, 40), z) con y = 2 equivale a: z = 10 + 20 + 40 sum(y, ({1, 2, 3}, {1, 2, 4}, {1, 3, 4}), (x1, x2 , x3 , x4 ), z) con y = 3 equivale a: z = x1 + x3 + x4 Programación por restriccionesclase 14-- p.11/19 Restricción all_different all_dif f erent(x1 , ..., x4 ). asegura que todas las variables tengan valores diferentes Ejemplo, problema del agente viajero: Programación por restriccionesclase 14-- p.12/19 Restricción all_different all_dif f erent(x1 , ..., x4 ). asegura que todas las variables tengan valores diferentes Ejemplo, problema del agente viajero: cyk ,yk+1 = costo de ir del nodo yk al nodo yk+1 yk = nodo recorrido en la etapa k. Formulación: Programación por restriccionesclase 14-- p.12/19 Restricción all_different all_dif f erent(x1 , ..., x4 ). asegura que todas las variables tengan valores diferentes Ejemplo, problema del agente viajero: cyk ,yk+1 = costo de ir del nodo yk al nodo yk+1 yk = nodo recorrido en la etapa k. Formulación: minimizar P k cyk ,yk+1 Sujeto a: all_dif f erent(y1 , ..., yn ) Otra formulación: Programación por restriccionesclase 14-- p.12/19 Restricción all_different all_dif f erent(x1 , ..., x4 ). asegura que todas las variables tengan valores diferentes Ejemplo, problema del agente viajero: cyk ,yk+1 = costo de ir del nodo yk al nodo yk+1 yk = nodo recorrido en la etapa k. Formulación: minimizar P k cyk ,yk+1 Sujeto a: all_dif f erent(y1 , ..., yn ) Otra formulación: P minimizar k ck,yk Sujeto a: all_dif f erent(y1 , ..., yn ) Programación por restriccionesclase 14-- p.12/19 Propagación de element Para la primera forma de la restricción, m_element(y, (c1 , c2 , ..., ck ), z), basta arco-consistencia: Dz0 = Dz ∩ {cj | j ∈ Dy } Dy0 = Dy ∩ {cj | j ∈ Dz } Ejemplo, sea Dz = {20, 30, 60, 80, 90} y Dy = {1, 3, 4} Dz0 = {20, 30, 60, 80, 90} ∩ {20, 40, 60} = {20, 60} Dy0 = {1, 3, 4} ∩ {1, 2, 4} = {1, 4} Programación por restriccionesclase 14-- p.13/19 Propagación de element(2) Para la segunda forma de la restricción, x_element(y, (xj1 , ..., xjk ), z), arco-consistencia puede no implicar hiper-arco consistencia. Dy , Dz son finitos, pero Dx1 , ..., Dxk pueden ser finitos o continuos S 0 Dz = Dz ∩ j∈Dy Dxj Dy0 = Dy ∩ {j | Dz ∩ Dxj 6= ∅} Dx0 j D0 z = Dx j si Dy0 = {j} sino Programación por restriccionesclase 14-- p.14/19 Ejemplo de x_element Considere x_element(y, (x1 , x2 , x3 , x4 ), z), con dominios: Dz = {20, 30, 60, 80, 90} Dy = {1, 3, 4} Dx1 = {10, 50} Dx2 = {10, 20} Dx3 = {40, 50, 80, 90} Dx4 = {40, 50, 70} Entonces: Dz0 = {20, 30, 60, 80, 90} ∩ {10, 40, 50, 70, 80, 90} = {80, 90} Dy0 = {1, 3, 4} ∩ {3} = {3} Dx0 1 = Dx1 Dx0 2 = Dx2 Dx0 3 = Dz0 = {80, 90} Dx0 4 = Dx4 Programación por restriccionesclase 14-- p.15/19 Propagación de sum La restricción m_sum(y, (S1 , ..., Sk ), (c1 , ..., cm ), z) propaga así: Dominio de z Dz0 = Dz ∩ n P j∈Si cj | i ∈ Dy o ∈ Dz o Dominio de y Dy0 = Dy ∩ n i| P j∈Si cj Ejemplo: m_sum({1, 2, 3}, {1, 2, 4}, {1, 3, 4}), (10, 20, 50, 40), z), con dominios: Dz = {30, 50, 80, 100}, Dy = {1, 2, 3} Dz0 = {30, 50, 80, 100} ∩ {70, 80, 100} = {80, 100} Dy0 = {1, 2, 3} ∩ {2, 3} = {2, 3} Programación por restriccionesclase 14-- p.16/19 Propagación de all_different all_dif f erent(x1 , ..., xn ). La idea es representar la restricción en un grafo: Cada variable xi es un vértice cada valor vj de los dominios es un vértice Hay un arco (xi , vj ) si vj está en el dominio de xi Definiciones: Una correspondencia (“matching”) es un subgrafo en el que cada nodo es incidente a exactamente un arco. Una correspondencia cubre los vértices y1 , ..., yn cuando cada uno de ellos es incidente a un arco de la correspondencia Obviamente, una correspondencia que cubre todos las variables de all_dif f erent(x1 , ..., xn ) es solución a la restricción. Programación por restriccionesclase 14-- p.17/19 Propagación de all_different(2) Propiedades: Una correspondencia es de máxima cardinalidad (cmc)si tiene el mayor número de arcos. Una correspondencia que cubre a y1 , ..., yn existe sí y sólo si cualquier correspondencia de máxima cardinalidad cubre a y1 , ..., yn Un algoritmo de Hopcroft-Karp encuentra una correspondencia de máxima cardinalidad en O(n1/2 m, donde m es el número de arcos Con esto se determina si la restricción es satisfactible. Paso siguiente, encontrar arcos que NO pueden ser parte de una cmc. Teorema (Berge): Un arco pertenece a algunas, pero no a todas las cmc ssi: pertenece a un ciclo alternante o pertenece a un camino alternante par, uno de cuyos extremos es un vértice incidente a ningún arco en la correspondencia. Programación por restriccionesclase 14-- p.18/19 Propagación de all_different(3) Procedimiento: Encuentre una cmc Para cada vértice que no está cubierto por la cmc, marq ue todos los arcos que sean parte de un camino alternante que comience en ese vértice. Por el teorema de Berge, estos arcos pertenecen al menos a uno (pero no a toda) cmc Por la misma razón, marque todo arco que pertenezca a un ciclo alternante Ahora, por el teorema de Berge, dado cualquier arco no marcado, si es parte de la cmc, debe pertenecer a toda cmc Entonces: eliminar arcos no marcados que no sean parte de la cmc. Programación por restriccionesclase 14-- p.19/19