Algorithm 将x数量的人划分为n个不同大小房间的算法

Algorithm 将x数量的人划分为n个不同大小房间的算法,algorithm,language-agnostic,Algorithm,Language Agnostic,对于一个项目,我必须设计一个算法,将适合一组人进入酒店房间给予他们的喜好。我已经用Python创建了一个字典,其中有一个人作为键,还有一个值,它列出了他们希望与之在一个房间里的所有人 有不同类型的房间可以容纳2-10人。有多少房间是什么类型的由程序的用户指定 我试图通过尝试所有房间组合,然后根据住户的偏好给每个房间打分,并寻找最高分数,来强行解决这个问题。这适用于小规模的团队,但拥有一个200人的团队将得到200!我可怜的电脑在我有生之年无法计算的组合 我想知道是否有一个算法,我一直无法找到解决

对于一个项目,我必须设计一个算法,将适合一组人进入酒店房间给予他们的喜好。我已经用Python创建了一个字典,其中有一个人作为键,还有一个值,它列出了他们希望与之在一个房间里的所有人

有不同类型的房间可以容纳2-10人。有多少房间是什么类型的由程序的用户指定

我试图通过尝试所有房间组合,然后根据住户的偏好给每个房间打分,并寻找最高分数,来强行解决这个问题。这适用于小规模的团队,但拥有一个200人的团队将得到200!我可怜的电脑在我有生之年无法计算的组合

我想知道是否有一个算法,我一直无法找到解决我的问题

提前谢谢!
Thijs

你能做的就是把你的字典想象成一个图表。然后可以创建一个邻接矩阵

例如,假设你有一个由4个人组成的小组,a、B、C和D

  • A:想和B和C在一起吗
  • B:想和一个女人在一起吗
  • C:想和D在一起吗
  • D:想和A和C在一起吗
您的矩阵将如下所示:

//    A  B  C  D
// A  0  1  1  0
// B  1  0  0  0
// C  0  0  0  1
// D  1  0  1  0
for count_down in range(400, -1, -1):
    for i in range(n^2):
        x = floor(random.random(n))
        y = floor(random.random(n))
        if x != y:
            assignment = maybe_swap(assignment, x, y, count_down / 100.0)
我们把这个矩阵称为M。然后你可以计算转置(我们称之为MT)并把M加到MT上。你会得到这样的结果

//    A  B  C  D
// A  0  2  1  1
// B  2  0  0  0
// C  1  0  0  2
// D  1  0  2  0
然后根据其值之和对行(或列)进行排序,因为它是对称的,所以不重要

//    A  B  C  D
// A  0  2  1  1
// C  1  0  0  2
// D  1  0  2  0
// B  2  0  0  0
对列执行相同的操作

//    A  C  D  B
// A  0  1  1  2
// C  1  0  2  0
// D  1  2  0  0
// B  2  0  0  0
从第一行开始,根据该行中的最大值填充房间,并通过删除分配房间的人员来减少矩阵。您应该首先选择最大的房间

例如,如果我们有一个可以有两个人的房间,你会给它分配B和a,因为第一行中的最大值是2,它对应于B

然后,简化后的矩阵为:

//    C  D
// C  0  2
// D  2  0

然后循环直到完成所有操作。

您已经有了一个贪婪的解决方案。因此,我将提出一个模拟退火解决方案

为此,您首先将每个人随机分配到房间。现在你开始考虑随机交换人。你总是接受能提高分数的交换,但也有可能接受糟糕的交换。如果互换真的很糟糕,接受糟糕互换的机会就会下降,而且随着时间的推移也会下降。在你做了足够多的实验之后,你所拥有的一切可能都相当不错

它被称为“模拟退火”,因为它模拟了缓慢冷却的物质形成组织良好的晶体结构的过程。因此,对于温度,通常使用的参数称为
T
。标准功能是:

def maybe_swap(assignment, x, y, T):
    score_now = score(assignment)
    swapped = swap(assignment, x, y)
    score_swapped = score(swapped)
    if random.random() < math.exp( (score_swapped - score_now) / T ):
        return swapped
    else:
        return assignment

(你应该仔细考虑这些参数。)

我不清楚你的算法应该找到什么解决方案。你想要最大化的分数是多少?即使某人不愿意,你也可以让他和他在一起吗?如果你能给我一些就更好了examples@AbdelhakimAKODADI大概他想最大限度地增加“人A和人B在一个房间里,而人A想和人B在一个房间里”的次数我在考虑一个计分系统,如果一个人a想和另一个人B在一个房间里,这个房间就得一分。如果另一个人B也想和另一个人a在一个房间里,这个房间就得两分。谢谢你的快速回复!这有一种NP完全的感觉。你同意近似贪婪的解决方案吗?贪婪的解决方案就可以了,只要没有完全错误的输出(比如说没有人会去的房间),谢谢你的回复!我想知道为什么不总是在高分时交换。我已经实现了该算法,结果的分数相当高,但并非完美无瑕,即使倒计时参数设置为10000@ThijsvandeVijver给它一个不陷入局部最优的机会。