Matching (Pareo)

Anuncio
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.
Descargar