【问题标题】:Most efficient seating arrangement最有效的座位安排
【发布时间】:2016-03-15 10:29:28
【问题描述】:

n (n < 1000) 个朋友组,组的大小由数组A[] (2 <= A[i] < 1000) 表征。表格的存在使得它们一次可以容纳r(r>2) 人。每个人就座所需的最少桌子数量是多少,受制于每个人都应该有他/她的小组中的另一个人坐在他/她的桌子旁。

我想的方法是将每个组分成三三两两的大小并尝试解决这个问题,但是有很多方法可以将数字n分成三三两的组,并不是所有的都可以是最优的。

【问题讨论】:

  • 嗯。我对此思考得越多,我想到的边缘案例就越有趣。即,r=3(总是可解的边缘情况)和 r=2(仅有时可解)。话虽如此,我认为这仍然不是非常困难。
  • @MooingDuck 进行编辑,r 总是大于 2。
  • @SHB 这个问题等同于“在最小的桌子排列中必须有多少个空座位?”那一个可能更容易考虑,因为有很多方法可以安排人们在桌子上,但很少有人强迫自己有很多空位的桌子。
  • @btilly:如果r 很大,那就是真的。对于像r==3 这样的边缘情况,它们非常不同。
  • @MooingDuck,对于 r==3,每张桌子要么有 0 个空椅子,要么有 1 个空椅子。但我不确定将小组分成三三两两的大小是否是最好的主意。

标签: algorithm dynamic-programming mathematical-optimization greedy


【解决方案1】:

混合整数编程模型算数吗?

关于这个公式的一些注释:

  • 我使用随机数据来分组。
  • x(i,j) 是第 i 组坐在 j 桌旁的人数。
  • x(i,j) 是一个半整数变量,即:它是一个整数变量,其值为零或介于 LO 和 UP 之间。并非所有 MIP 求解器都提供半连续和半整数变量,但它可能会派上用场。在这里,我使用它来强制要求至少有来自同一组的 2 人需要坐在一张桌子旁。如果求解器不提供这些类型的变量,我们也可以使用其他二元变量来制定此构造。
  • y(j) 是一个二进制变量(0 或 1),指示是否使用表。
  • 容量方程有点聪明:如果不使用表 (y(j)=0),它的容量会减少到零。
  • 选项 optcr=0 表示我们希望求解到最优。对于大而困难的问题,我们可能希望将其限制在 5%。
  • 顺序方程确保我们从表 1 开始填充表格。这也降低了问题的对称性并可能加快求解时间。
  • 上述模型(包含 200 个组和 200 个可能使用的表)生成一个包含 600 个方程(行)和 40k 个变量(列)的 MIP 问题。有 37k 个整数变量。借助出色的 MIP 求解器,我们可以在不到一分钟的时间内找到经过验证的最优解(使用 150 个表)。
  • 请注意,这肯定不是背包问题(正如另一个答案中所建议的那样——背包问题只有一个约束),但它类似于装箱问题。

【讨论】:

  • 我对整数编程不太熟悉,因此无法准确评论这是否可行。根据我的说法,该问题的预期解决方案不会使用整数编程。
  • 上面的公式很接近,但不能解决您的确切问题,@SHB。不过,我很确定您将不得不求助于整数编程,因为您专门要求受一些约束的“最小表数”。很难确定一个可以为您提供好的答案的确定性算法,更不用说最佳答案了。
  • @KoenPeters 我在公式中遗漏了什么?
  • 糟糕,当我第一次查看您的公式时,我没有意识到您使用的是 semi-整数变量。
  • @KoenPeters 我在此添加了一些句子。有点深奥的变量类型。
【解决方案2】:

这与NP完全的背包问题相同(参见https://en.wikipedia.org/wiki/Bin_packing_problem)。所以找到最优解是相当困难的。

大部分时间都有效的启发式方法:

  1. 按大小递减对组进行排序。

  2. 对于每个组,将其放在空间最少但仍能容纳该组的表中。

【讨论】:

  • 在一些欧洲 ICPC 地区提出了这个问题,所以我很确定在给定的限制条件下应该有一个确定性的解决方案。
  • 我没有立即看出这是一个背包问题。
  • @ErwinKalvelagen 见装箱问题en.wikipedia.org/wiki/Bin_packing_problem
  • 如果我们只有一张桌子,那将是一个背包问题。但在这里,我们希望尽量减少容纳所有人所需的桌子数量。
  • @ErwinKalvelagen 让我给你一个简单的问题实例。假设您有 n 个小组,共有 200 万人,每张桌子的容量为 m。询问您是否可以将它们放在两个表中(这是 NP 完整的),与询问最小表数是多少相同。如果我们可以在多项式时间内解决原始问题,我们可以在多项式时间内解决后一个问题,这意味着我们可以在多项式时间内解决NP完全问题,这是不可能的。
【解决方案3】:

你的方法是可行的。如果给定数量的表存在解决方案,则存在将每个组分成若干个二和若干个三的解决方案。首先,将每组奇数大小的三个分开。你留下了一堆大小相同的组。接下来,从每个大小不能被六整除的组中拆分出两个。忘记这是一个更大的群体;将它分成一组六人一组。

此时,您已将所有组分成若干个二、若干个三和若干个六。给每张奇数大小的桌子一个三,必要时分成六;现在所有的桌子都有大小。剩下的所有六人现在可以分成二人并任意坐下。

【讨论】:

  • 这是处理配对约束的好方法,但没有考虑到 OP 正在寻找一种方法来获得 minimal 数量的表。
  • @KoenPeters:哎呀。我显然没有仔细阅读声明。我将其视为分区问题,而不是打包问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2021-01-06
  • 2023-01-08
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多