下面的数据模型在一个允许用户使用HTML5可视化地创建表和座位的应用程序中表示带有座位和来宾的表。
// The data model
var data = {
guests: [], // id, name, tags
tables: [], // id, seats
seats: [], // id, guest
tags: [] // id, name
};
客人身上有标签(分类)。这些标记可以按优先级排列,并设置为作为“分组”或“取消分组”参数使用。然后,用户单击“seat”,客人就座(看起来是随机的),而优先参数得到尊重。
全面的例子:http://jsfiddle.net/kBp49/2/(在js面板中查找“solution goes here”)
问题是:我如何实现让客人坐到桌子上的功能,同时考虑到一些客人应该坐在彼此旁边,而其他人应该彼此分开坐,以便创建一个最佳的座位配置客人人数可以超过1000人,但不能超过2000人。
以现实生活为例,澄清问题
假设我们有三张桌子。他们每人有4个座位我们还有9位客人要摆满这些桌子具体如下:
客人1,犹太人,来自我们
客人2,犹太人,来自英国
客人3,克里斯蒂安,来自我们
客人4,克里斯蒂安,来自英国
客人5,克里斯蒂安,瑞典人
客人6,无神论者,来自英国
客人7,无神论者,来自瑞典
客人8,穆斯林,来自沙特阿拉伯
客人9,穆斯林,来自英国
现在,用户按如下顺序排列参数的优先级。首先是最重要的。
我希望那些信仰相同的人彼此分开
我要那些地理位置相同的人坐在一起
这没关系:
表1:客人:1、3、7、8
表2:客人:2、4、6、9
表3:客人:5人
更新
一个解决方案可能是Minimax算法它将为每种可能性计算一个分数,并给出找到的最佳解决方案(在计算10秒后找到)。算法是我需要帮助的,实现本身当然需要只有我才能做出的决定。
最佳答案
这个问题没有最好的答案,因为没有最好的座位安排——事实上,我认为你所说的安排是可以的——可能相当糟糕——如果你被迫使用三张桌子,并且每张桌子最多可以坐4张,那么你可能应该在每张桌子上坐三张,这样就不会有人单独坐下来。不过,这是吹毛求疵,回避了问题的基础。
我可以设想一些算法。
首先,可以将每个“标记”视为n维空间中的一个维度(这听起来比实际情况更复杂)。例如,在区域维度中,可以为每个国家指定一个整数值,区域空间的维度将这些整数中的每一个作为潜在值。然后,将每个客人作为一个点放置在这个N维空间中,并为每个桌子选择在该空间中最接近的客人您可以通过在构建空间时忽略某些功能来支持优先级,例如,如果您不希望按宗教分组,则在构建空间时不要包含宗教,或者如果您积极希望在具有“相似”宗教的人之间进行分隔,则可以修改距离计算,使其在该维度中具有相反的关系。根据特征的数量(即维度)和点数,该算法可能具有良好的性能——这本质上就是它们创建推荐引擎的方式。
如果你想要简单而缓慢的东西,你可以使用蛮力算法:即对于每一位客人,看看每一张桌子上都有成员,如果考虑到你的优先顺序,这些成员不可取,就坐在一张新桌子上。如果没有新的表存在,则选择表中最不希望的成员。这可能是最简单的你可以去!
最后,您可能可以预先处理您的客人,并计数:多少来自x地区,多少来自y宗教然后,一旦有了这些统计数据,就可以创建如下表(取决于优先级):Canada表、UK表,…,然后让客人坐在与其描述匹配的任何表上。这是否可行取决于输入集。
我希望这能有所帮助,并给你一些解决问题的方法:)