【问题标题】:Search and Matching algorithm搜索和匹配算法
【发布时间】:2010-03-12 18:21:01
【问题描述】:

我正在尝试提出一种算法来执行以下操作:

在程序停止之前,我总共需要填充 12 个单元格。我有 3 行,每行有 4 列。

作为一个例子,让我用飞机来说明这一点。所以你有 3 排,每排有 4 列,你有靠窗/过道的座位。每排将有一个靠窗座位、靠过道座位、靠过道座位和靠窗座位(|WA AW| 就像飞机上的座位安排一样)。在每次迭代(不同的乘客组)中,会有一定数量的乘客(1 到 12 人之间),我需要让他们尽可能靠近(坐在一起)。我为下一组(每次迭代)执行此操作,直到程序停止(当我完成每个组时它会停止)。

例如,我有 3 位乘客(A、B 和 C),A 想坐在靠窗的位置,B 想坐在靠过道的位置,而 C 想坐在靠窗的位置。假设所有座位(全部 12 个)都可用,我可以将它们放置为 |A# BC|或 |CB #A|并将座位标记为脏(所以我不会再为下一位乘客选择相同的座位)。我为下一组(迭代)执行此操作。 我不确定这个论坛是否正确,但如果有人可以建议我应该如何完成,我将不胜感激。
谢谢。

【问题讨论】:

  • 要是我不上班就好了。这听起来像是一个有趣的问题。乘客落座后可以移动吗?
  • @mmyers - 我正在做同样的编辑。 :)
  • @ChaosPandion:你的手指要快。
  • 二维数组是否重要?左侧窗户上的两个座位(一个接一个)是否比两侧窗户上的座位更近?
  • 当座位被占用时,我不会说座位“脏”。

标签: algorithm constraints scheduling


【解决方案1】:

如果输入是按顺序输入的,并且假设座位数始终达到12,则在每个州(乘客组)只有2^12 可以占用座位的方式。您可以使用它来减少蛮力/记忆解决方案的状态数。

伪代码:

IsSeatingPossible( mask, passengers ) =
    if ( no more passengers ) return true
    return IsSeatingPossible =
        new_mask = mask + brute force on passenger constraints
        if any IsSeatingPossible( new_mask, 
                      passengers - just processed passengers )

更多解释:

掩码基本上是一个由 12 个布尔值组成的数组,说明是否为每个 i 采用 seat_i(您可以轻松转换 2D (x,y) -> 1D (x))。然后你迭代的可能性。如果对于这个乘客组(A_1, A_2, .., A_k),每个人都有一个座位,而其余乘客都有座位,那么一个完整的座位是可能的。

所以传入的面具,用英语,是被占用的座位。所以假设你坐在(A_1, A_2, .., A_k) 的座位上(x_1, x_2, .., x_k)。有许多乘客可以坐在其中的子集 - 以N choose k 为界,在这种情况下很小。这是你蛮力的部分。给定一个特定的(x_1, x_2, .., x_k),如果(x_1, x_2, .., x_k) 与当前的掩码没有重叠(基本上没有冲突的座位),那么这个座位是可能的,并且考虑到新的掩码,可以处理其余的乘客请求,这只是当前掩码和(x_1, x_2, .., x_k) 的集合添加。 (新的座位被占用了。)

这可能足够快,也可能不够快。整洁的事情是注意到除了注意到哪些座位被占用,以及处理了哪些乘客之外,对于某个子问题的解决方案是相同的。因此,您可以使用memoization 来加快速度。这会产生一个O(N 2^N) 空间解决方案。

掩码最好使用位掩码实现,尤其是N = 12,因此得名。对于乘客请求列表,您可能只需要跟踪哪个索引。

【讨论】:

  • 嗨拉里,所以,蛮力算法基本上是你从基地(1 名乘客)开始,看看是否有可能让 1 名乘客坐下,然后再增加 1 名乘客,看看 2 是否有可能让 2 名乘客坐下,依此类推,直到组中的总乘客 x 已就座。我在这里没有真正关注的是 new_maks,mask,为什么要在乘客约束上添加 mask + 蛮力?感谢您的宝贵时间。
  • 我把解释画了一点,如果你需要更多,请告诉我。
【解决方案2】:

如果它真的只有 12 个单元,并且组大小是预先知道的,那么动态编程可能是一个很好的选择。计算每组占用座位 (2^12) 和每个 k (0

【讨论】:

    【解决方案3】:

    这是Knapsack problem 类型的一个实例,具有以前已知的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 2015-11-27
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多