Teoría de grafos La figura muestra un mapa con 4 distritos A, B, C y D. Se trata de pintar cada distrito con un color de forma que, dos regiones con un borde común (que no sea un punto) tengan distintos colores y queremos hacer esto usando un mínimo de colores.
1.- Encuentra 1.- Encuentra una representación en términos de vértices y aristas de un grafo a partir del mapa dado. Vértices:
Representación del Grafo:
El resultado es un grafo plano no dirigido, en el que sus vértices están unidos por las aristas de la siguiente manera: G: {(A,B)(A,C)(A,D)(B,C)(B,D)(C,D)} {(A,B)(A,C)(A,D)(B,C)(B,D)(C,D)}
2.- Investiga un algoritmo que aplicado a grafos te permita ir coloreando los vértices de tal forma que no coincidan en color, con el color de los vértices que estén unidos a ellos a través de aristas. Algoritmo voraz (Greedy) Los algoritmos voraces (Greedy) se utilizan típicamente para resolver problemas de optimización: • Minimizar o maximizar, bajo determinadas condiciones, el valor de una función del tipo: f(x 1, x 2, …,x n ) = c 1 x 1 + c 2 x 2 +…+ c n x n.
La solución se va construyendo en etapas: •
En cada etapa se añade un nuevo elemento a la solución parcial. El que nos parece el mejor candidato en ese momento.
•
Las decisiones tomadas nunca se revisan. Voracidad: se consume el mejor elemento lo antes posible.
•
Al final de cada etapa se verifica si la solución parcial ya constituye una solución total para el problema.
Colorear grafo
El algoritmo voraz comienza la coloración de los vértices según orden de éstos en la matriz de adyacencias del grafo. La coloración se realiza siguiendo los siguientes pasos. •
Paso inicial. Ordenamos los vértices del grafo. (el resultado del algoritmo dependerá del orden elegido). Esto es, disponemos los vértices del grafo en una lista (v1, v2, . . . , v n) .
Ahora asignaremos colores a los vértices siguiendo el orden elegido. 1. A v1 le asignamos el primer color disponible; color a. 2. ¿Cómo coloreamos v 2? Si es vecino de v 1 le asignamos el color b; si no lo es, le asignamos el color a. 3. Para colorear v 3, comprobamos si es vecino de v 1 o v2; y no podremos utilizar el color o colores que hayamos utilizado en los que sean sus vecinos.
4. k-ésimo paso. ¿Cómo coloreamos el vértice v k, teniendo en cuenta que ya hemos coloreado los k−1 anteriores? En la lista de colores obviamos los colores usados en los vecinos de v k que ya hayan sido coloreados; de los colores que quedan, elegimos para v k el primero disponible. 5. Se imprime la solución.
3.- Explica el algoritmo de coloración que hayas utilizado, en conjunto con la corrida a mano de la coloración del grafo, la cual representa al mapa dado en la actividad. Aplicando el algoritmo voraz al problema del mapa, donde tenemos cuatro vértices (A,B,C,D), conectados por aristas entre todos y cada uno de ellos, tenemos: Grafo:
Vértices ordenados:
1) Al vértice A, le asignamos el color 1.
2) Como el vértice B está unido con una arista a A no podemos utilizar el color a, así que le asignamos otro color; color 2.
3) Ahora colorearemos el vértice C, y ya que este está conectado tanto con el vértice A y el vértice B, le asignamos otro color: color 3. Los colores se verifican del primero al último que se asignó.
4) Por último tenemos el vértice D, verificamos si se le puede asignar el color 1, 2 o 3, pero al estar conectado por aristas a cada uno de ellos, se le asigna un nuevo color; color 4.
Quedando como resultado un grafo de 4 colores, 1 para cada vértice.
Código java import java.io.*; import java.util.*; import java.util.LinkedList; class Graph { private int V; // Número de vértices. private LinkedList adj[]; //Lista de adyacencia. //Constructor. Graph(int v) { V = v; adj = new LinkedList[v]; for (int i=0; i
for (int u = 1; u < V; u++) { // Se procesan todos los vértices adyacentes // y se indican sus colores como no disponibles. Iterator it = adj[u].iterator() ; while (it.hasNext()) { int i = it.next(); if (result[i] != -1) available[result[i]] = true; } // Econtrar el primer color disponible. int cr; for (cr = 0; cr < V; cr++) if (available[cr] == false) break; result[u] = cr; // Se asigna el primer color encontrado. // Restablecer los valores a false para la siguiente iteración. it = adj[u].iterator() ; while (it.hasNext()) { int i = it.next(); if (result[i] != -1) available[result[i]] = false; } } // Imprimir el resultado. for (int u = 0; u < V; u++) System.out .println("Vértice " + u + " ---> Color " + result[u]); } // Método principal. public static void main(String args[]) { Graph g1 = new Graph(4); g1.addEdge(0, 1); g1.addEdge(0, 2); g1.addEdge(0, 3); g1.addEdge(1, 2); g1.addEdge(1, 3); g1.addEdge(2, 3); System.out .println("Coloración de grafo 1"); g1.greedyColoring();