算法 – 在座位图中分配连续座位

我必须在座位图中编写一个分配连续座位的算法.例如:在体育场内分配座位.座位图可以被视为N行和M列的2d阵列.系统必须为一起制作的预订分配连续的席位.由于没有向用户呈现座位图,系统应自动分配与每次购买相对应的可用座位.除此之外,它应该以这样的方式进行,使得座椅中的孔/间隙最小化. 最佳答案 找到一个完美的解决方案是
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)

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

点赞