我知道这个问题是几年前提出的,但仍然是针对那些遇到类似问题的人。
问题的定义
我的问题是类似的:考虑到一些偏好,在婚礼上让人们坐在哪里?和初始问题不完全一样,但是正确设置偏好,就可以制定初始问题。
我没有读过那些复杂的问题和解决方法。我只是想到了另一种方法。我确信这不是解决问题的最佳方式,但它有效且易于实施。
方法
我选择了一个模型,在该模型中,一个人可以表达自己想坐在或不坐在另一个人的同一张桌子上的愿望。我们称它们为权重。因此,Sara 可以通过引入重量(例如从 -5 到 5)来表达她的愿望,即坐在(5)或不坐在(-5)迈克尔的同一张桌子上。也许她不在乎(0),或者迈克尔很帅但有点小(2)或者他很好但闻起来很奇怪(-3)。
让 w_ij 是与我想和 j 坐在同一张桌子上的人的愿望相关联的权重。请注意,w_ij 不一定等于 w_ji(Sara 可能喜欢 Michael,但可能 Michael 讨厌 Sara)。那么,我们来定义一个表的评分如下:
rating_table = 1/N * sum_i sum_j w_ij
其中 N 是餐桌上的人数。请注意,权重的总和是 Nx(N-1)/2 项(包括 0 项)的总和。想象一下 3 个人在 1 张桌子上,然后有 6 个砝码,而不是 9 个(一个人不能希望和自己坐在同一张桌子上......)。
然后,平均评分是每个 rating_table 的总和除以表的数量。该平均评分是我打算最大化的评分。
算法的思路如下。想象一下,您有一个初始解决方案(例如,人们随机坐在桌子旁)。那么,如果将一张桌子的一个人 i 与另一张桌子的一个人 j 互换会发生什么?两个表的评级都会改变。我们将这些潜在的变化保存在有序向量中。最后,我们将有一个结构向量,每个结构包含当人 i 与人 j 切换时的评分变化(两个表的评分变化之和)。当您拥有所有潜在的变化时,我们会迭代向量,从评分的最大变化开始,然后
换人。下面详细介绍了要采取的步骤。
算法
1) 计算结构向量,其中包含对被切换人员的引用、他们来自的表格以及在切换期间每个表格将经历的评分差异的总和。我们称之为整体评分变化。
2) 迭代结构向量:如果整体评分变化为正,则将人员 i 与 j 切换。假设人 i 来自 A 桌,而人 j 来自 B 桌。由于 A 桌和 B 桌的设置发生了变化,我们无法在这些桌子之间切换更多人。因此,如果向量包含与其中一个表相关的另一个开关,我们必须跳过它。循环结束后,我们可以重新开始。因此,在 1 个循环中每个表最多 1 个开关。
3) 继续切换,只要额定值的变化是正的并且在切换期间还没有使用表 A 和 B。请注意,一张表可能会增加 2,而第二张表可能会减少 1。总体变化仍然是积极的。
4) 回到步骤 1。现在我们可以在所有表之间再次切换。同样,我们只能在 1 个循环期间从表 A 和 B 切换人员一次。
5) 继续此操作,直到所有整体评分变化均为负数或 0。
因此,您智能且有选择地分别从表 A 和 B 中选择人员 i 和 j,这样会出现最佳的总体评分变化,然后您继续直到没有更好的解决方案存在。
该算法的缺点是第 1 步:您需要计算所有整体评分变化。但是对于一个有 1000 张桌子的活动来说,这应该不是问题。
独特的解决方案?
很多时候,您可以找到解决此问题的多种解决方案。想象一下,您使用上述算法找到了一种解决方案。然后,2 个人之间的任何切换都会产生 0 的整体变化是另一种解决方案。因此,找到 1 个解决方案后,很容易找到所有解决方案。
如果您找到了 1 个解决方案,并且您找到了一个总评级变化为 0 的开关,因此找到了一个新解决方案,您可以使用该新解决方案来寻找另一个解决方案,依此类推。假设每个人都设置相同的权重(或者例如,没有人关心并且所有权重都是 0),那么任何设置都是一种解决方案。
我希望这会有所帮助。我知道这是一个很长的解释,我希望它足够清楚。如果您想了解更多详情,请告诉我。