Problema nº: 3 Nombre: MINIMUM GRAPH COLORING URLSs: • http://www.nada.kth.se/~viggo/wwwcompendium/node15.html • http://citeseer.nj.nec.com/article/benson99approximating.html 1. Descripción Dado un grafo no dirigido, el cual denota un conjunto de sectores o áreas separadas por un conjunto de aristas, se debe determinar el mínimo conjunto de colores capaces de pintar los sectores de un grafo, con la restricción de que dos colores iguales no pueden ser utilizados en sectores adyacentes. Este problema es también conocido como “Minimum Chromatic Number”. 2. Formato de entrada La estructura central de entrada se basa en una matriz binaria de adyacencia, basada en sectores, donde se indica cuando dos sectores son adyacentes. Esta matriz se puede cargar desde una fuente externa (un archivo, por ejemplo) en un formato basado en listas de pertenencia, por ejemplo: Fuente externa de matrices 1: 2 3 5 2: 5 1 … Establece que el sector 1 es adyacente con los sectores 2, 3 y 5. El sector 2 es adyacente con los sectores 5 y 1, etc. Paralelamente, se debe contar con un listado de colores, también en un esquema de fuente externa (un archivo, por ejemplo) rojo azul blanco … 3. Formato de salida (descripción de la solución a la instancia) La solución debe ser expresada como un listado impreso en pantalla o en un archivo indicando el sector y el color que este debe posee: 1: rojo 2: azul 3: blanco … 4. Casos de prueba Considérese el siguiente grafo no dirigido: 1 4 3 2 6 5 Entrada 1: 2 3 2: 1 3 3: 1 2 4 5 4: 3 6 5: 3 6 6: 4 5 Salida 1: rojo 2: blanco 3: azul 4: blanco 5: blanco 6: azul rojo blanco azul verde amarillo naranja 5. Indicaciones generales Lo relevante de este problema es el grafo de adyacencia mas allá de especificar información respecto a los nodos del grafo o algún “costo” para sus aristas. Si bien es cierto existen adaptaciones para este problema considerando estos factores, estas capacidades quedan fuera de la ámbito de esta versión del problema. Se recomienda la utilización de un esquema voraz o exhaustivo, tomando el problema de tamaño N ( N = Número de sectores) y asignando el primer color a un sector inicial, luego repetir el procedimiento para un problema de tamaño N − 1 hasta resolver completamente el problema Esto se logra en forma recursiva en forma simple, principalmente utilizando programación funcional. 6. Indicaciones para Scheme En Scheme, resulta natural expresar la adyacencia como una lista conformada por pares que considera el sector y una lista de sectores adyacentes, por ejemplo (considerando el caso de prueba presentado en la sección 4): ((1 (2 3)) (2 (1 3)) (3 (1 2 4 5)) (4 (3 6)) (5 (3 6)) (6 (4 5))) De esta forma, se debe implementar una función denominada MGC que reciba una lista de adyacencia y una lista de colores. La salida debe ser una lista de asignaciones entre sector y color: 1 => (MGC (rojo blanco azul verde amarillo naranja) ((1 (2 3)) (2 (1 3)) (3 (1 2 4 5)) (4 (3 6)) (5 (3 6)) (6 (4 5)))) Value: ((1 rojo) (2 blanco) (3 azul) (4 blanco) (5 blanco) (6 azul)) 7. Indicaciones para Prolog Similar es el caso de Prolog donde resulta simple expresar este problema con una noción de listas, de esta manera se debe implementar un predicado MGC que reciba tres parámetros (lista de colores, lista de adyacencia y resultado) y asigne una lista de asociación al tercer parámetro: ?- MGC ([rojo, blanco, azul, verde, amarillo, naranja], [[2, [1, 3]],[3, [1, 2, 4, 5]], [4, [3, 6]], [5, [3, 6]], [6, [4, 5]]], S). Y “retorna” una lista que representa la asignación: S = [[1, rojo], [2, blanco], [3, azul], [4, blanco], [5, blanco], [6, azul]];