最有效的座位安排

时间:2015-12-09 23:16:24

标签: algorithm dynamic-programming mathematical-optimization greedy

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

我想的方法是将每个小组分成三三两两的大小并尝试解决这个问题,但是有很多种方法可以将数字n分成三三两组而不是全部它们可能是最佳的。

3 个答案:

答案 0 :(得分:2)

混合整数编程模型是否计数?

enter image description here

关于这个表述的一些注释:

  • 我使用随机数据组成小组。
  • x(i,j)是坐在桌子j的第i组人数。
  • 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个表)。
  • 请注意,这肯定不是背包问题(如另一个答案所示 - 背包问题只有一个约束条件)但它类似于装箱问题。

答案 1 :(得分:1)

与NP完成的背包问题相同(参见https://en.wikipedia.org/wiki/Bin_packing_problem)。因此找到最佳解决方案非常困难。

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

  1. 根据尺寸减小对组进行排序。

  2. 对于每个组,将其放在占空间最小的表中,但仍可以容纳此组。

答案 2 :(得分:0)

您的方法是可行的。如果对于给定数量的表存在解决方案,则存在一种解决方案,其中您将每个组拆分为若干个二进制数和一些数量的三个。首先,将每组奇数的三个分开。你留下了一堆规模均匀的群体。接下来,将每个大小不能被6整除的组分开两次。忘记它是一个更大的群体;把它分成几组六个。

此时,您已将所有群组分成两个数量,一些数量的三个,以及一些数量的六个。给每个奇数大小的表一个三,根据需要拆分六个;现在所有表都有均匀的大小。所有剩下的六个人现在可以分成两个人并随意坐着。