10.05.2013 Views

El “problema de los matrimonios estables”

El “problema de los matrimonios estables”

El “problema de los matrimonios estables”

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Problema <strong>de</strong> <strong>los</strong> <strong>matrimonios</strong> estables<br />

se trata <strong>de</strong> realizar emparejamientos “<strong>estables”</strong><br />

(si en el emparejamiento hay un hombre y una mujer que no<br />

están emparejados pero se prefieren mutuamente a sus parejas<br />

respectivas, el emparejamiento es “inestable”)<br />

• hay muchos problemas similares (asignaciones entre elementos<br />

<strong>de</strong> acuerdo con <strong>de</strong>terminadas preferencias)<br />

• pue<strong>de</strong> complicarse: las preferencias pue<strong>de</strong>n cambiar tras una<br />

asignación…<br />

Fuente:<br />

conjunto <strong>de</strong> n<br />

hombres<br />

(con sus<br />

preferencias<br />

sobre mujeres)<br />

conjunto <strong>de</strong> n<br />

mujeres<br />

(con sus<br />

preferencias<br />

sobre hombres)<br />

Niklaus Wirth: Algoritmos+Estructuras <strong>de</strong> Datos=Programas,<br />

Ed. <strong>de</strong>l Castillo, S.A., 1980


algoritmo ensaya(ent h:hombre)<br />

variable r:rango<br />

principio<br />

para r:=1 hasta n hacer<br />

seleccionar preferencia r-ésima <strong>de</strong>l hombre h;<br />

si aceptable entonces<br />

registrar pareja;<br />

si h


Solución:<br />

variables x:vector[hombre] <strong>de</strong> mujer<br />

y:vector[mujer] <strong>de</strong> hombre<br />

{OJO: SE USAN VARIABLES GLOBALES}<br />

algoritmo ensaya(ent h:hombre)<br />

variable r:rango; m:mujer<br />

principio<br />

para r:=1 hasta n hacer<br />

{seleccionar pref. r-ésima <strong>de</strong>l hombre h}<br />

m:=mhr[h,r];<br />

si soltera[m] and estable ent {aceptable}<br />

{registrar pareja}<br />

x[h]:=m; y[m]:=h; soltera[m]:=falso;<br />

si h


Cálculo <strong>de</strong> la estabilidad<br />

Datos (calculables a partir <strong>de</strong> mhr y hmr):<br />

variables rhm:vector[hombre,mujer] <strong>de</strong> rango<br />

rmh:vector[mujer,hombre] <strong>de</strong> rango<br />

rhm[h,m] = rango <strong>de</strong> m en la lista <strong>de</strong> preferencias <strong>de</strong> h<br />

rmh[m,h] = rango <strong>de</strong> h en la lista <strong>de</strong> preferencias <strong>de</strong> m<br />

Razones <strong>de</strong> inestabilidad:<br />

• h prefiere a mp antes que a su pareja m y a su vez mp prefiere a<br />

h antes que a su pareja<br />

• m prefiere a hp antes que a su pareja h y a su vez hp prefiere a<br />

m antes que a su pareja<br />

Cálculo:<br />

e:=verdad; i:=1;<br />

mq (irmh[mp,y[mp]]<br />

fsi;<br />

i:=i+1<br />

fmq;<br />

i:=1; lim:=rmh[m,h];<br />

mq (i


algoritmo relaciones<br />

constante n=8<br />

tipos hombre = 1..n;<br />

mujer = 1..n;<br />

rango = 1..n;<br />

variables h:hombre; m:mujer; r:rango;<br />

mhr:vector[hombre,rango] <strong>de</strong> mujer;<br />

hmr:vector[mujer,rango] <strong>de</strong> hombre;<br />

rhm:vector[hombre,mujer] <strong>de</strong> rango;<br />

rmh:vector[mujer,hombre] <strong>de</strong> rango;<br />

x:vector[hombre] <strong>de</strong> mujer;<br />

y:vector[mujer] <strong>de</strong> hombre;<br />

soltera:vector[mujer] <strong>de</strong> booleano<br />

principio<br />

para h:=1 hasta n hacer<br />

para r:=1 hasta n hacer<br />

leer(mhr[h,r]);<br />

rhm[h,mhr[h,r]]:=r<br />

fpara<br />

fpara;<br />

para m:=1 hasta n hacer<br />

para r:=1 hasta n hacer<br />

leer(hmr[m,r]);<br />

rmh[m,hmr[m,r]]:=r<br />

fpara<br />

fpara;<br />

para m:=1 hasta n hacer<br />

soltera[m]:=verdad<br />

fpara;<br />

ensaya(1)<br />

fin


algoritmo ensaya(ent h:hombre)<br />

variable r:rango; m:mujer<br />

principio<br />

para r:=1 hasta n hacer<br />

m:=mhr[h,r];<br />

si soltera[m] entonces<br />

si estable entonces<br />

x[h]:=m; y[m]:=h; soltera[m]:=falso;<br />

si h


{OJO: SE USAN VARIABLES GLOBALES}<br />

algoritmo escribir_solución<br />

variables h:hombre; rh,rm:entero<br />

principio<br />

rh:=0; rm:=0;<br />

para h:=1 hasta n hacer<br />

escribir(x[h]);<br />

rh:=rh+rhm[h,x[h]];<br />

rm:=rm+rmh[x[h],h]<br />

fpara;<br />

escribir(rh,rm)<br />

fin<br />

Nota:<br />

rh<br />

=<br />

n<br />

∑ rhm<br />

h=<br />

1<br />

[ h,<br />

x[<br />

h ] rm rmh[<br />

x[<br />

h]<br />

, h]<br />

= ∑<br />

=<br />

n<br />

h 1<br />

la solución con mínimo valor <strong>de</strong> rh se llama “solución<br />

masculina estable óptima” y<br />

la <strong>de</strong> mínimo rm es la “óptima estable femenina”


Ejemplo:<br />

matriz mhr<br />

rango 1 2 3 4 5 6 7 8<br />

hombre 1 selecciona la mujer 7 2 6 5 1 3 8 4<br />

2 4 3 2 6 8 1 7 5<br />

3 3 2 4 1 8 5 7 6<br />

4 3 8 4 2 5 6 7 1<br />

5 8 3 4 5 6 1 7 2<br />

6 8 7 5 2 4 3 1 6<br />

7 2 4 6 3 1 7 5 8<br />

8 6 1 4 2 7 5 3 8<br />

matriz hmr<br />

rango 1 2 3 4 5 6 7 8<br />

mujer 1 selecciona el hombre 4 6 2 5 8 1 3 7<br />

2 8 5 3 1 6 7 4 2<br />

3 6 8 1 2 3 4 7 5<br />

4 3 2 4 7 6 8 5 1<br />

5 6 3 1 4 5 7 2 8<br />

6 2 1 3 8 7 4 6 5<br />

7 3 5 7 2 4 1 8 6<br />

8 7 2 8 4 5 6 3 1<br />

Solución:<br />

x1 x2 x3 x4 x5 x6 x7 x8 rh rm c*<br />

Sol. 1 7 4 3 8 1 5 2 6 16 32 21<br />

2 2 4 3 8 1 5 7 6 22 27 449<br />

3 2 4 3 1 7 5 8 6 31 20 59<br />

4 6 4 3 8 1 5 7 2 26 22 62<br />

5 6 4 3 1 7 5 8 2 35 15 47<br />

6 6 3 4 8 1 5 7 2 29 20 143<br />

7 6 3 4 1 7 5 8 2 38 13 47<br />

8 3 6 4 8 1 5 7 2 34 18 758<br />

9 3 6 4 1 7 5 8 2 43 11 34<br />

c* es el número <strong>de</strong> evaluaciones <strong>de</strong> estabilidad<br />

solución 1 = óptima masculina; solución 9 = óptima femenina

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!