Matching (Pareo) Definición Dado un grafo, un pareo es un subconjunto de aristas los cuales no tiene vértices en común. A G H I J K L M C B D E G = {V, E} F Ej. de pareo: AB DF EG HI LM Pareo maximal Un pareo maximal es un pareo que contiene el máximo número de aristas posibles, minimizando así el número de vértices sin unir. En el mejor de los casos, el pareo maximal contendrá a lo sumo V/2 aristas. En el ej. anterior, el pareo maximal podría ser: AB DF EG HI LM JK Grafo bipartido Se dice que G = {V, E} es un grafo bipartido si se cumple que: 1) V = V1 V2 y V1 V2 = ; 2) e E, e = (v1, v2) donde v1 V1 y v2 V2 J1 A J2 B J3 C J4 D J5 pareo maximal: A J2 B J5 C J3 Pareos en Grafos Bipartidos Definición Sea un grafo dirigido, bipartido con conjuntos disjuntos de vértices V y W, en el cual los lados están dirigidos desde los vértices de V a los vértices de W. (Cualquier vértice de G está en V o en W, pero no en ambos.) Un pareo para G es un conjunto de lados E los cuales no tienen vértices comunes. Un pareo maximal para G es un pareo E que contiene el máximo número de lados. Un pareo completo para G es un pareo E que tiene la siguiente propiedad: si v V, entonces (v, w) E, para algún w W. El problema de pareos en un grafo bipartido puede modelarse como un problema de redes de la sig. forma: 1) Se asigna capacidad 1 a todas las aristas. 2) Se agrega una fuente (F) y aristas con capacidad 1 que van entre la fuente F y todos los vértices de un mismo grupo. 3) Se agrega tambien un sumidero (S) y aristas con capacidad 1 que van entre S y todas los vértices del otro grupo. J1 F A J2 B J3 S C J4 D J5 Un flujo de la red, proporciona un pareo en G, donde las aristas con flujo 1 son las pertenecientes al pareo. Equivalentemente, un flujo maximal corresponde a un pareo maximal. Problema de pareja estable (Grafo Bipartido Pesado) Asumimos que existen 2 grupos de N hombres y N mujeres cada uno. Cada hombre debe hacer una lista de preferencias sobre las mujeres y viceversa. El problema seria encontrar N parejas respetando sus preferencias lo mas posible. Llamaremos pareja no estable, cuando dos personas que no están en pareja se pretenden a la pareja que se les asigno. A B C D E 1 2 3 4 5 2 5 1 3 4 1 2 3 4 5 2 3 5 4 1 1 3 2 4 5 5 3 2 1 4 E A D B C D E B A C A D B C E C B D A E D B C E A En este caso, un ej. de asignación inestable seria: A1 B3 C2 D4 E5 porque A prefiere a 2 antes que a 1 y 2 prefiere a A antes que a C, haciendo el correspondiente intercambio, la nueva configuración quedaría: A2 B3 C1 D4 E5 Un algoritmo posible para encontrar una configuración, podría ser el remover parejas inestables una a la vez. No solamente que este proceso es lento, sino que no necesariamente termina. Siguiendo con el ej., B y 2 hacen una pareja inestable, por lo tanto la nueva configuración queda: A3 B2 C1 D4 E5 Ahora la pareja inestable es B y 1, llegándose a la configuración: A3 B1 C2 D4 E5 La pareja inestable es ahora A con 1, llegándose a esta nueva config. y hallándose un ciclo: A1 B3 C2 D4 E5 Un algoritmo que evita estos ciclos es: 1) Elegir a cada hombre como candidato, uno por vez. 2) Al primer hombre candidato se lo junta con la primera mujer de su lista. 3) Se pasa al próximo hombre como candidato y se lo junta con la primera mujer de su lista, si no esta en pareja. Si la mujer esta en pareja, dicha mujer elige dependiendo de su lista. Al hombre que abandona se le asigna la próxima mujer de su lista. 4) Estos ciclos continuan hasta que algun candidato encuentra a una mujer que no estaba en pareja. Estas son las asignaciones que se logran ejecutando el algoritmo anterior, al ejemplo A 2 A B 2 1 A B C 2 1 2 3 A B C D 2 1 2 1 5 2 3 A 2 5 1 B 1 2 3 4 C D E 2 1 5 3 3 3 5 2 La implementación de este algoritmo es: for (int m = 1; m <= TAM; m++) { for (int s = m; s != 0; ) { next[s]++; w = prefer[s][next[s]]; if (rank[s][w] < rank[fiancee[w]][w]) { t = fiancee[w]; fiancee[w] = s; s = t; } } } donde: prefer: es la matriz traspuesta de preferencias de los hombres. rank: es la matriz de ranking de las mujeres sobre los hombres. El número que se encuentra en la posición rank [i][j],es la posición en la que se encuentra el hombre j en la lista de prioridades de la mujer i. next: es un array donde en la posición next[i] se guarda la próxima posición de la mujer que se le asignara al hombre i, en caso que se requiera. fiancee: es un array donde se almacenan las actuales parejas de las mujeres.