根据优先参数为客人提供座位

时间:2011-03-28 15:23:42

标签: javascript algorithm

以下数据模型表示在允许用户使用HTML5直观地创建表格和席位的应用程序中具有席位和访客的表格。

// The data model
var data = {
    guests: [], // id, name, tags
    tables: [], // id, seats
    seats: [], // id, guest
    tags: [] // id, name
};

客人有附加标签(类别类别)。可以对这些标记进行优先级排序,并将其设置为“分组”或“取消分组”参数。然后用户点击“座位”,客人就座(看似随机),同时尊重优先参数。

成熟的例子:http://jsfiddle.net/kBp49/2/(在JS面板中寻找“解决方案”)

问题是:如何实现将客人安排到桌子上的功能,同时考虑到有些客人应该坐在彼此旁边而其他人应该坐在一起其他为了创造最好的海水配置之一?客人数量可超过1000但不能超过2000。

现实生活中的例子,澄清问题

假设我们有3张桌子。他们每人有4个座位。我们还说我们有9位客人填写这些表格。它们如下:

  1. 嘉宾1,犹太人,来自美国
  2. 来自英国的来自犹太人的客人2
  3. 嘉宾3,Christian,来自美国
  4. 来自英国的Christian 4,来自
  5. 嘉宾5,Christian,来自瑞典
  6. 来自英国的Atheist来宾6,
  7. 来自瑞典的Atheist嘉宾7
  8. 来自沙特阿拉伯的穆斯林来宾8
  9. Guest 9,来自英国的穆斯林
  10. 现在,用户优先考虑这样的参数。首先是最重要的。

    1. 我希望那些具有相同宗教信仰的人能够彼此分开
    2. 我希望那些地理位置相同的人能够坐在一起
    3. 没关系:

      1. 表1:嘉宾:1,3,7,8
      2. 表2:嘉宾:2,4,6,9
      3. 表3:嘉宾:5
      4. 更新 一种解决方案可以是Minimax算法。它将计算每种可能性的分数,并提供最佳找到的解决方案(在计算后10秒计算)。算法是我需要帮助的,实现本身当然只需要我能做出的决定。

1 个答案:

答案 0 :(得分:0)

这个问题没有最好的答案,因为没有最好的座位安排 - 实际上我会说你说的安排可能很糟糕 - 如果你被迫使用三张桌子,你可以每张桌子最多可以坐4个座位,你应该在每张桌子上坐三个座位,这样就不会有人独自坐着。然而,这是挑选,并避免了问题的基础。

我可以设想一些算法。

首先,您可以将每个“标签”视为N维空间中的维度(这听起来比它复杂得多)。例如,在区域维度中,您可以为每个国家/地区分配一个整数值,区域空间的维度将每个整数都作为潜在值。然后,将每个客人作为这个N维空间中的一个点,并为每个表选择那些在该空间中最接近的客人。您可以通过在构建空间时忽略某些功能来支持优先级 - 即,如果您不希望按宗教进行分组,在构建空间时不包括宗教,或者如果您主动希望在具有'喜欢'宗教的人之间分离,则可以修改距离计算以使该维度具有反比关系。该算法可以具有良好的性能,具体取决于特征的数量(即维度)和点数 - 这实质上就是它们创建推荐引擎的方式。

如果你想要一些简单而又缓慢的东西,你可以使用强力算法:即对于每个客人,查看每个拥有成员的表,如果这些成员根据您的优先级而不合适,请坐在新桌旁。如果不存在新表,请选择包含最不受欢迎成员的表。这可能就像你可以去的那样简单!

最后,您可以预先处理您的客人,并计算:有多少来自x区,有多少来自宗教y,...然后,一旦掌握了这些统计数据,就可以创建表格(取决于优先级)如:加拿大桌,英国桌,......,然后在任何符合其描述的桌子上安排客人。天气这是可行的取决于输入集。

我希望这会有所帮助,并为您提供有关如何解决此问题的一些想法:)