今天有个朋友问我一个关于作业问题的问题。我找到了一个非常简单的解决方案,但我觉得它可以变得更简单和更快。您的帮助将不胜感激。
问题:假设我有N个人,我需要将他们分配到M个建筑物中,每个建筑物可以容纳K个人。不是所有的人都愿意住在一起,所以我有一个 N*N 单元格的矩阵和一个 1 来标记愿意住在一起的人。如果一个单元格包含 1,则意味着 I 和 J 可以住在一起。显然,矩阵围绕主对角线对称。
我的解决方案如下(伪代码):
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;
}
我只是使用递归涵盖了所有可能的安排。我觉得这可以大大优化,我不是在谈论启发式方法,而是一种复杂性要低得多的解决方案。
- 是否存在与此类似的正式众所周知的问题?
- 有更好的算法吗?
我认为这可能与稳定的婚姻问题有关,但我不确定。