搜索和匹配算法

时间:2010-03-12 18:21:02

标签: algorithm constraints scheduling

我正在尝试使用算法来执行以下操作:

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

举个例子,让我在飞机上说明这一点。所以你有3行,每行有4列,你有窗口/过道座位。每排都有一个靠窗的座位,过道座位,过道座位和靠窗座位(| WA AW |就像飞机上的座位布置一样)。在每次迭代(不同的乘客组),将有一些乘客(1到12之间),我需要将它们最靠近在一起(座位在一起)。我为下一组(每次迭代)执行此操作,直到程序停止(当我完成每个组时它将停止)。

例如,我有3名乘客(A,B和C),而A想要坐在窗口,B想要坐在Aisle,C想要坐在Window。假设所有座位(全部12个)都可用,我可以将它们放置为| A#BC |或者| CB #A |并标记座位脏(所以我不会为下一位乘客再次选择相同的座位)。我为下一组(迭代)做这个。 我不确定这个论坛是否正确,但如果有人能告诉我应该如何完成,我将非常感激 感谢。

3 个答案:

答案 0 :(得分:2)

如果输入有序,并且假设座位数始终为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)

如果它真的只有12个单元格,而且组的大小是事先知道的,那么动态编程很可能是合适的。计算每组占用座位(2 ^ 12)和每个k(0 <= k <= 12)是否可以适当地放置第一组k以准确占据该组座位。 (作为优化,k由集合的大小决定。)最后,向后工作:如果我将最后一组放在这里,我可以将剩余的座位中的其他组合作吗?等等。

答案 2 :(得分:1)

这是Knapsack problem类型的一个实例,其中包含以前已知的解决方案。