algorithm - 在座位图中分配连续的座位

标签 algorithm

我必须编写一个算法来在座位图中分配连续的座位。例如:在体育场中分配座位。座位图可以看作是一个 N 行 M 列的二维数组。系统必须为一起进行的预订分配相邻的座位。由于没有向用户显示座位图,系统应自动分配与每次购买相对应的可用座位。除此之外,它应该以这样的方式执行此操作,以使座椅中的孔/间隙最小化。

最佳答案

找到一个完美的解决方案是NP-hard .看等价的语言问题:
L={((x1,x2,...,xk),n,m)} 其中 xi 是联票数量,n,m 是体育场尺寸。

我们将展示Partition <=(P) L,因此这个问题是 NP-Hard 问题,并且没有已知的多项式解。

证明
S=(x1,x2,..,xk) 为分区问题的输入,并设 sum=x1+...+xk
看看下面的缩减:

Input: S=(x1,...,xk)
Output:((x1,...,xk),sum/2,2)

正确性: 如果 S 有分区,令其为 S1=(x_i1,x_i2,...,x_it),则根据分区的定义,x_i1+...+x_it=sum/2,因此我们可以在第一行插入 x_i1,..,x_it,在第二行插入其余的,所以 ((x1,...,xk) ,sum/2,2) 在 L 中
如果 ((x1,...,xk),sum/2,2) 在 L 中,则根据定义有 t 个预订使得 x_i1,x_i2,. ..,x_it 形成一个完美的第一行,因此 x_i1+x_i2+...+x_it=sum/2,因此它是一个有效的分区,S 在分区问题

结论:
因为L是NP-Hard,而你要找的问题是这个语言的优化问题,所以没有已知的多项式解。对于精确的解决方案,您可以使用 backtracking [检查所有可能性,并选择最好的],但这会花费很多时间,或者您可以尝试启发式解决方案,例如greedy。 , 但它不会被优化。

编辑:回溯解决方案[伪代码]:

solve(X,n,m):
   global bestVal <- infinity
   global bestSol <- null
   solve(X,new Solution(n,m))
solve(X,solution):
   if (X is empty):
       gaps <- solution.numGaps()
       if (gaps < bestVal):
            bestVal <- gaps
            bestSol <- solution
       return
   temp <- X.first
   X.removeFirst()
   for i from 0 to m:
       solution.addToLine(i,temp)
       solve(X,solution)
       solution.removeFromLine(i,temp)
   X.addFirst(temp)

假设 Solution 是一个已实现的类,并且对于非法解决方案 [即一排太多人] numGaps() == infinity

关于algorithm - 在座位图中分配连续的座位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8025931/

相关文章:

java - 使用 Dijkstra 的多条最短路径

algorithm - 按所有元素对元组数组进行排序

algorithm - 计算给出数组中最小标准偏差的子集

algorithm - 通过一组点找到最宽的空直线路径

algorithm - 根据计数均匀分布的颜色范围

algorithm - 多变环境的寻路算法

algorithm - 给定迭代器获取 N 个样本

php - 从类似于树的 mysql 结果集创建 Json

c - 通过向后遍历链表树结构获取路径

algorithm - 二进制字符串转十进制字符串