表/席位分配算法

时间:2014-10-30 11:01:58

标签: c# asp.net algorithm

我目前正在开发预订系统,并且需要根据某些条件和预定义值将公司参与者分配给座位的算法。

条件是:

  • 每个不同的公司必须至少有两名参与者放在同一张桌子上。 (鉴于该公司至少有2名参与者)
  • 公司有竞争对手的定义。公司不能与竞争对手坐在同一张桌子上。

预定义值为:

  • 桌子和座位是预定义的。
  • 公司参与者和竞争对手的关系是预定义的。

实体的定义:

表格: 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)

因此,例如,如果我定义了以下预设:

表:

  • 表1有6个席位
  • 表2有4个席位
  • 表3有6个席位
  • 表4有3个席位

公司/参加者:

  • 公司1有3名参赛者,没有参赛者
  • Company2有2名参与者,Company3为竞争对手
  • Company3有4名参与者,Company2有竞争对手

我需要自动分配9个参与者,共有4个公司,总共19个席位。根据条件,公司2和公司3的参与者不能坐在同一张桌子上。此外,当参与者坐在桌子旁时,他应该由公司参与者陪同(如果可能的话)。

非常感谢任何针对合适算法的想法或指示。感谢。

2 个答案:

答案 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?)次,并以最少的罚分数保持结果 分。