实现在桌席分配客人的算法

时间:2011-05-02 13:33:35

标签: algorithm math optimization

  

可能重复:
  Seat guests based on prioritized parameters

我一直在努力解决这个问题。我只是无法绕过它。如果有更聪明或有更多算法和/或数学洞察力的人可以向我解释我应该如何继续,那将非常感激。

客户正在安排坐在各种活动中,从餐馆到大型竞技场。我客户软件的目标是为客人提供短信/电子邮件/纸质机票,说明客人在抵达活动时应该坐在哪里。座位(客人应该坐在哪里)必须手动控制,一些表格是“VIP”等。我正在研究一种算法,可以帮助用户让他确定一些参数,例如客人所属的公司和客人可以说哪种语言。今天,座位过程是在大型白板上手工制作(如果事件是1k +客人,则一次一个部分)。

我的工作是自动化这一点,不完全,但“足够好”。我已经构建了一个可以直观呈现桌子,椅子(座位)和客人的应用程序。但是,最重要的功能仍然缺失;能够根据用户选择的参数将客人分配到现有的桌子和座位。

参数是每位客人的任意数据,例如:“39岁,男性,Redwine Corp,CTO,英语和意大利语”。用户将这些(所有客户具有相同的数据字段)并按重要性排序。每个参数也必须设置为“旁边”或“除了”。例如,用户可以控制说同一种语言的客人应该坐在一起,但在同一家公司工作的客户应该彼此分开坐着。

鉴于此,我即将实现的函数定义将是这样的:function getGuestSeatings(tables, seats, guests, parameters)并返回一个数组,其中的客人应该坐在哪个座位上。参数tablesseatsguests包含您选择的信息,但最重要的可能是主席的 X,Y 。结合椅子所连接的桌子上的信息,应该足以计算出“足够好”的客座配置。当然,parameters变量包含有关参数优先级的信息,如果它是“seat-next-to” - 或“seat-apart-from”参数。

我问的问题是:可以使用什么算法来提供解决方案,以及如何实现它?数学答案可能没有用,所以为了安全起见,我建议使用代码(JS / C / C#)或伪代码。

我会给你一些更多信息,可能会或可能不会填补解决方案的任何空白(我会在这里补充你的评论反馈):

  • 表格可以是椭圆形或矩形
  • 如果没有符合条件的座位配置(优先参数),那么我仍然需要一个“足够好”的解决方案,即使它不是最好的
  • 我明白调查所有可能性可能会耗尽记忆
  • 也许某种懒惰的基于点的树系统就足够了?只是调查看起来很有希望的路径并忽略其他路径......?

这是一个模型,可以让您了解软件背后的想法:mockup

2 个答案:

答案 0 :(得分:1)

Simulated Annealing.

这个想法是你有一个人到座位的初始任务,你有一个“善”功能。 你想要最大化善良功能。 粗略地说,你这样做的方法是随机切换人的座位,如果这导致了更高的功能值,你可以从那里开始再做。 如果开关导致goodness函数的值较低,您可能仍然会随机接受它,这可以帮助您避免局部最大值。 这称为Metropolis-Hastings

你让它运行数千次,看看你得到了什么。

答案 1 :(得分:0)

我会将第一个人放在第一个表,然后从那里根据参数和优先级计算每个客人每个表的分数。与该表中其他人的语言匹配是正分,是分数优先级的倍数(更大数字优先级是更高优先级),如果他们来自同一公司或不同语言或其他因素以将其分散,则使其成为负分。如果在得分之后客人没有足够高的分数(或正分数),那么请转到下一个表并再次与那里的客人一起尝试,如果没有客人在那里然后把这个客人放在那里或者为了这个客人的间距几张桌子。为每位客人重复一遍。替代方案可能是针对每个访客,计算已分配的访客的每个表的分数,无论该访客在分配给该表时获得最高分数。如果所有分数都是负数,那么如果可能与其他表格均匀分开,则将它们移动到新表格。

只是一个想法,祝​​你好运。