This question already has an answer here:

Seat guests based on prioritized parameters
(1个答案)
可能重复:
Seat guests based on prioritized parameters
我已经为这个问题挣扎了一段时间了。我就是不能把我的头裹住如果一个更聪明或者有更多算法和/或数学见解的人能向我解释我应该如何进行,我将非常感激。
客户正在安排各种活动,从餐厅到大型竞技场都有。我的客户软件的目标是向客人提供一张短信/电子邮件/纸质机票,上面写着客人到达活动现场时应该坐在哪里。座位(哪位客人应该坐在哪里)必须手动控制,有些桌子是“VIP”等。我正在研究一种算法,可以帮助用户确定一些参数,例如客人属于哪家公司,客人可以说哪种语言。今天,在大型白板上手工制作座位流程(如果活动是1K+位客人,则一次一个区域)。
我的工作是把它自动化一点,不是完全自动化,而是“足够好”。我已经构建了一个应用程序,可以直观地呈现桌子、椅子(座位)和客人。然而,最重要的功能仍然是缺失的;能够根据用户选择的参数将客人分配到现有的表格和座位。
参数是每个客人的任意数量的数据,例如:“39岁,男性,红酒公司,首席技术官,英语和意大利语”。用户获取这些(所有来宾都有相同的数据字段)并按重要性排序每个参数还必须设置为“next to”或“after from”。例如,用户可以控制说同一种语言的客人应该坐在一起,而在同一家公司工作的客人应该坐在一起。
鉴于此,我将要实现的函数定义如下:function getGuestSeatings(tables, seats, guests, parameters)并返回一个数组,其中来宾应该坐在哪个座位上。参数tablesseatsguests包含您选择的信息,但最重要的可能是椅子的x、y。再加上椅子连接到什么桌子上的信息,应该足以计算出“足够好”的客人坐姿配置。当然,parameters变量包含关于参数优先级的信息,以及它是“seat next to”还是“seat after from”参数。
我要问的问题是:什么算法可以用来提供解决方案,我如何实现它?一个数学答案可能没有用,所以为了安全起见,我建议使用代码(js/c/c)或psuedo代码。
我将为您提供更多信息,这些信息可能会或可能不会填补解决方案的任何空白(我将在此处补充您的评论反馈):
表格可以是椭圆形的,也可以是矩形的
如果没有符合标准(优先参数)的座位配置,那么我仍然想要一个“足够好”的解决方案,即使它不是最好的
我知道调查所有的可能性可能会占用记忆
也许一个延迟加载的基于点的树系统就足够了只是调查那些看起来很有前途的道路而忽略了其他的道路…?
下面是一个模型,它为您提供了一个软件背后的想法:

最佳答案

Simulated Annealing.
这个想法是你有一个初始的座位分配,你有一个“善”的功能。
你想要最大化善函数。
简而言之,你的方法是随机地改变人们的座位,如果这导致了更高的功能值,你可以从那里开始重新做。
如果开关导致良函数的较低值,您可能仍然随机接受它,这可以帮助您避免局部极大值。
这叫做Metropolis-Hastings
你让它跑了几千次,看看你得到了什么。

关于algorithm - 实现一种在餐 table 座位上分配客人的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5857791/

10-10 06:44