Un amico mi ha fatto una domanda oggi su un problema di assegnazione. Ho trovato una soluzione abbastanza semplice, ma sento che può essere reso più semplice e veloce. Il tuo aiuto sarebbe apprezzato.Assegnare le persone agli edifici rispettando le preferenze?
Il problema: Supponendo che ho N persone, ho bisogno di assegnarle in M edifici, ogni edificio può ospitare K persone. Non tutte le persone sono disposte a vivere l'una con l'altra, quindi ho una matrice di celle N * N e una 1 che segna le persone che sono disposte a vivere l'una con l'altra. Se una cella contiene 1 significa che io e J possiamo vivere insieme. Ovviamente la matrice è simmetrica attorno alla diagonale principale.
La mia soluzione è la seguente (pseudo codice):
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;
}
Ho appena coprono tutte le modalità possibili utilizzando la ricorsione. Sento che questo potrebbe essere ottimizzato molto, e non sto parlando di euristica, ma di una soluzione con una complessità molto minore.
- C'è un problema formale ben noto che è simile a questo?
- C'è un algoritmo migliore?
Penso che questo potrebbe essere correlato allo stable marriage problem, anche se non ne sono sicuro.
Non penso che il problema del matrimonio stabile si applichi qui; ciò è correlato al problema di corrispondenza bipartito e questo problema non è un abbinamento. – templatetypedef
@templatetypedef puoi spiegarmi cosa c'è di sbagliato nel nome? è un discreto "Something Problem" è un nome da libro di testo ... –
La parola "problema" è spesso usata in titoli come "Problema con C++" o "Problema con HTML" che in realtà non descrivono quale sia il problema. Sono d'accordo con te sul fatto che sia un po 'strano vietare il nome poiché può portare a falsi positivi come questo. – templatetypedef