寻找这个小调度问题的数学解决方案

时间:2010-08-03 19:26:28

标签: ruby optimization math

假设我们有一个房间列表及其容纳人数和会议人数列表。我们希望通过以下方式将每个会议与一个会议室匹配:

  1. 会议只能在容量等于或大于出席率的会议室安排。
  2. 如果有剩余房间,应安排会议,以便尽可能留出最大的房间。
  3. 出席人数较多的会议不应安排在较小的会议室内,而应安排在出席人数较少的会议上。
  4. 显然我们应该知道是否不可能在给定的房间安排特定的会议。
  5. 我们能否有效地达到时间表?一次通过会很好,有些回溯是可以的,但是我可以开始工作的唯一选择(粗略的算法加上动态地违反规则3)会比我想要的慢。

    这个问题并不像看起来那么简单!天真的线性方法至少失败了一个标准:

    1. 我们可以从高到低排序每个列表并开始将最大的房间配对到最大的会话,我们会在任何可能的时间提出解决方案,但我们会留下尽可能小的房间而不是最大的。 (考虑在200人,30人和20人的会议室安排10人和15人的会议。)

    2. 我们可以将会议列表从高到低排序,然后向下走,试图找到足够大的空间来容纳这个会议。但有时这会导致为更小的会议安排更大的空间。 (考虑在40人和80人的房间安排40人和30人的会议。)

    3. 但肯定有更好的方法来解决这个相对简单的问题。

1 个答案:

答案 0 :(得分:4)

难道你不能只将两个列表从低到高排序,然后将每个会议放在第一个(即最小的)足够容纳它的房间吗?

据我所知,符合您的所有标准:

  1. 检查
  2. 这应该直接来自我们总是选择最小的房间
  3. 这一事实
  4. 由于我们将会议从低出勤率排到高出席率,我们绝不会在较小的会议室举行更大型的会议。
  5. 如果我们在到达会议结束列表之前到达会议室列表的末尾,则无法找到时间表。
  6. 根据您的评论进行修改:

    我们两次通过。第一个是上面的。在此之后,如果还有任何会议,请按以下步骤操作:

    浏览房间列表和从最高到最低的未安排会议列表。

    如果当前会议适合当前会议室:将其放入该会议室(将之前在该会议室中的会议添加到未安排的会议列表中(在最低位置,以便维护排序顺序))。移至列表中的下一个会议和会议室。

    如果当前会议不适合当前会议室:此会议无法安排。从列表中删除会议并尝试下一次会议(使用同一个会议室)。

    重复直到未安排的会议列表为空。