我目前正在开发预订系统,并且需要根据某些条件和预定义值将公司参与者分配给座位的算法。
条件是:
预定义值为:
实体的定义:
表格: ID(Int,PK), 描述(字符串), 数字(Int),
TableSeat: ID(Int,PK), 数字(Int), 表ID(FK), CustomerID(Nullable Int,FK)
公司: ID(PK) 名称(字符串) DefaultNumberOfParticipants(Int) 竞争对手(FK)
Competior: ID(PK) CompanyID(FK) 公司ID2(FK)
因此,例如,如果我定义了以下预设:
表:
公司/参加者:
我需要自动分配9个参与者,共有4个公司,总共19个席位。根据条件,公司2和公司3的参与者不能坐在同一张桌子上。此外,当参与者坐在桌子旁时,他应该由公司参与者陪同(如果可能的话)。
非常感谢任何针对合适算法的想法或指示。感谢。
答案 0 :(得分:0)
我认为这个问题可以简化为图形的顶点着色。竞争对手公司的参与者在图表中连接。颜色数等于表的数量。还有一个附加约束,即每个颜色/表具有与之关联的最大节点数。
至于问题的方面,同一公司的至少2个人需要坐在同一张桌子上,无论何时为新节点着色,忍受同一公司的另一个节点都有相同的颜色,否则尝试着色另一个具有相同颜色的同一公司的节点。
答案 1 :(得分:0)
您可以对此算法尝试以下变体:Distributing players to tables
总的想法是依次处理每张桌子上的每个座位,在其上放置一个随机的剩余和有效的人。如果没有这样的人可用,则算法终止而没有结果(使其成为所谓的Las Vegas算法)。
根据有多少有效解决方案,您可能需要在找到解决方案之前运行该算法几次,但这是好的,因为单次运行如此之快:我估计,对于示例你给了,你应该在不到一秒的时间内找到一个结果,至少比通过所有可能的排列进行详尽的搜索快得多。
在同一桌上不允许2名参赛者被允许的条件可以很容易地实施:选择时 下一个坐在桌旁的人,只是排除已经坐在那桌旁的所有人的竞争对手。
另一个条件是,一个人最好与至少一位同事坐在一起,这样做更难。它仍然可以作为一个硬约束来实现,但我怀疑可能会有很多情况不会产生任何结果。
因此,我建议通过最初完全忽略这个条件来使这个条件成为一个软约束,但之后通过为每个不与同事坐着的人颁发一个惩罚点来评估每个结果。
这保证即使在不是每个人都可以和同事坐在一起的情况下,你仍然可以获得一些可接受的座位。
然后算法变为:
//Place everyone at a table while avoiding seating competitors together
for each table T:
UP = a randomly shuffled list of unseated people
for each person X from UP
While there still is at least one seat available at T AND
X is not a competitor of anyone already seated at T
seat X at T
if T still has one or more seats available
abort; //With the decisions taken so far, noone can be seated at T. This run has no result.
//Complete seat configuration found. Award a penalty point for evey person not seated with a colleague.
penaltyPoints = 0
for each table T:
for each person X seated at T
If there is no other person at T that is from X's company
Add a penalty point.
运行此算法几次(百?000?)次,并以最少的罚分数保持结果 分。