1 #include "backtracking.h"
4 BackTracking(size_type capacidad) : Susanita(capacidad)
7 /* Llamada recursiva: Ensaya una alternativa desde el hombre iH hasta el final de la lista */
8 void BackTracking::Ensayar(personas_type::iterator iH)
10 /* Recorro todas las mujeres de este hombre */
11 for (personas_type::iterator iM = (*iH)->prefs.begin(); iM != (*iH)->prefs.end(); ++iM)
13 /* Si la mujer está soltera y la pareja es estable*/
14 if (((*iM)->estado == Persona::SOLTERO) && ParejaEstable(iM, iH))
17 (*iM)->comprometer_con_bt(**iH);
19 /* Si quedan hombres solteros */
20 if (!(*iH == *(hombres.rbegin())))
22 /* Sigo armando parejas estables */
27 /* Si este es el último hombre entonces tengo una configuración estable */
30 //this->mostrar_estado();
33 /* Rompo el compromiso */
34 (*iM)->romper_compromiso(**iH);
40 bool BackTracking::ParejaEstable(personas_type::iterator Mujer, personas_type::iterator Hombre)
42 /* Una pareja (Mujer,Hombre) es estable si no existe: */
43 /* 1) ninguna mujer iM por la que Hombre tenga más preferencia que Mujer, y que a su vez iM prefiera más a Hombre que a su actual pareja */
44 /* 2) ningún hombre iH por el que Mujer tenga más preferencia que Hombre, y que a su vez iH prefiera más a Mujer que a su actual pareja */
49 /* Tomo la primer mujer de la lista de preferencias del hombre */
50 personas_type::iterator iM = (*Hombre)->prefs.begin();
53 /* Mientras no encuentre a la mujer actual (o sea, voy viendo a las que prefiero más que a la candidata) */
54 while((iM<Mujer) && Estable)
56 /* Si la mujer no está soltera */
57 if ((*iM)->estado != Persona::SOLTERO)
59 /* Me fijo si me prefiere más que al que tiene ahora */
60 Estable = (std::find((*iM)->prefs.begin(),(*iM)->prefs.end(),*Hombre) > std::find((*iM)->prefs.begin(),(*iM)->prefs.end(),(*iM)->pareja));
66 /* Calculo dónde está el hombre actual en la lista de preferencias de la mujer */
67 personas_type::iterator iHombre = std::find((*iM)->prefs.begin(),(*iM)->prefs.end(),*Hombre);
69 /* Tomo el primer hombre de la lista de preferencias de la mujer */
70 personas_type::iterator iH = (*Mujer)->prefs.begin();
72 /* Mientras no encuentre a la mujer actual (o sea, voy viendo a las que prefiero más que a la candidata) */
73 while((iH<iHombre) && Estable)
75 /* Si el hombre no está soltero */
76 if ((*iH)->estado != Persona::SOLTERO)
78 /* Me fijo si me prefiere más que a la que tiene ahora */
79 Estable = (std::find((*iH)->prefs.begin(),(*iH)->prefs.end(),*Mujer) > std::find((*iH)->prefs.begin(),(*iH)->prefs.end(),(*iH)->pareja));
88 void BackTracking::casamentear()
90 /* Entrada a la llamada recursiva con el primer hombre de la lista */
91 Ensayar(hombres.begin());