Un amigo me hizo una pregunta hoy sobre un problema de asignación. Encontré una solución bastante sencilla, pero creo que se puede simplificar y agilizar. Su ayuda será apreciada.¿Asigna personas a edificios respetando las preferencias?
El problema: Suponiendo que tengo N gente, tengo que asignarlos a M edificios, cada edificio puede albergar K personas. No todas las personas están dispuestas a vivir juntas, así que tengo una matriz de células N * N y un 1 que marca a las personas que están dispuestas a vivir juntas. Si una celda contiene 1, significa que I y J pueden vivir juntos. Obviamente, la matriz es simétrica alrededor de la diagonal principal.
Mi solución es la siguiente (pseudo código):
int[] Match(int[] people, int[][] pairs, int numBuildings, int buildingsSize)
{
int[] freePeople = findFreePeople(people);
if(freePeople) = 0
{
return people;
}
foreach(int person in freePeople)
{
for(int buildingIndex=0 to numBuildings)
{
if(CheckIfPersonFitsInBuilding(...))
{
int[] tempPeople = people.Copy();
tempPeople[person] = buildingIndex;
int[] result = Match(tempPeople,pairs,numBuildings,buildingsSize);
if(result != null)
{
return result;
}
}
}
}
return null;
}
acabo de cubrir todos los posibles arreglos utilizando la recursividad. Siento que esto podría ser optimizado en gran medida, y no estoy hablando de heurística, sino de una solución con mucha menos complejidad.
- ¿Existe algún problema formal conocido que sea similar a esto?
- ¿Hay algún algoritmo mejor?
Creo que esto podría estar relacionado con el stable marriage problem, aunque no estoy seguro.
No creo que el problema del matrimonio estable se aplique aquí; eso está relacionado con el problema de correspondencia bipartita, y este problema no es un emparejamiento. – templatetypedef
@templatetypedef ¿me puede explicar qué le pasó al nombre? es un "Problema Algo" decente es un nombre de libro de texto ... –
La palabra "problema" se usa a menudo en títulos como "Problema con C++" o "Problema con HTML" que en realidad no describen cuál es el problema. Estoy de acuerdo contigo en que es un poco extraño prohibir el nombre, ya que puede dar lugar a falsos positivos como este. – templatetypedef