【问题标题】:An algorithm for sorting & grouping a list of weighted objects一种用于对加权对象列表进行排序和分组的算法
【发布时间】:2010-06-04 22:42:59
【问题描述】:

我有很多数据块。

为了争论,我们会说它们是

File 1 - 150Kb
File 2 -  50Kb
File 3 -  70Kb
File 4 -  60Kb
File 5 -  70Kb
File 6 - 100Kb
File 7 -  90Kb

为了传输,我可以将它们打包成最大 300Kb 的有效载荷。

如果你只是按顺序遍历它们,你会得到

TRANS1: 150Kb + 50Kb + 70Kb = 270Kb - the next file puts you over the limit of 300Kb
TRANS2: 60Kb + 70Kb + 100Kb = 230Kb - the next file puts you over the limit of 300Kb
TRANS3: 90Kb

所以三个单独的传输。

但如果你重新组织它们,你可以发送

Files 1,2,6 together = 300Kb
Files 3,4,5,7 together = 290Kb

因此,您减少了单独传输需求的数量。既然有一个 与每次传输相关的货币成本(这些传输实际上是对第 3 方系统的 API 调用,我们按 API 调用收费)我们希望保留该数字 单独的有效载荷发送到最低限度。

有没有围绕这种优化的排序算法, 这将获取加权对象列表,并对它们进行排序/分组,以便结束 组数最少

作为参考,我会在 .NET 中对此进行编码,但如果您可以提供另一种语言或伪代码实现/描述的示例,那也很好。

谢谢, Eoin C

【问题讨论】:

  • 谢谢 Artelius 和 Thariama,这看起来正是我所需要的。非常感激。以前从未听说过“背包问题”这个词。干杯:)
  • 感谢Petar,认为您的装箱问题更适合我正在尝试做的事情。两者都会研究。根据记录,最多只会有 7-8 个块,并且在大多数情况下
  • 如果它只有 7-8 个块,只需暴力破解所有可能的组合,你会做得很好:)
  • 是的,我认为如果没有更多 7 或 8 个元素,最好使用 Petars 方法来创建所有可能的组合

标签: .net algorithm sorting grouping


【解决方案1】:

您的问题正是 Bin packing 问题,不幸的是 NP-Complete:( 如果数据包的数量非常少,您可以暴力破解所有可能的组合。

否则,我提出的动态编程解决方案不会给出最佳答案,因为它会假设您总是对连续的数据包进行分组。但它会执行得很快,并给出接近真相的东西。我使用带有记忆的递归。最好在开始时按升序对数据包进行排序。

const int INF = 1000000;
const int MAXSIZE = 300;
int DP[NumberOfPackets][MaxPayload];

int solve(int packetNum, int sizeUsed)
{
   if (packetNum == NumberOfPackets)
      return 0;

   if (DP[packetNum][sizeUsed] != -1)
      return DP[packetNum][sizeUsed];

   int res = INF;

   //Try to put the packet in the current group
   if (sizeUsed + size[packetNum] <= MAXSIZE) 
      res = min(res, solve(packetNum + 1, sizeUsed + size[packetNum]));

   //Try to start another group with the current packet
   res = min(res, solve(packetNum + 1, size[packetNum]) + 1);

   return DP[packetNum][sizeUsed] = res;
}

int answer = solve(1, size[0]);

【讨论】:

  • 实际上这看起来比背包更适合我正在做的事情。谢谢 Petar。
  • @Eoin:不是“稍微好一点”。装箱是完全​​匹配的。背包和垃圾箱是不一样的! Bin-packing 是强 NP 完全性的,即没有伪多项式时间算法。背包并非如此。
【解决方案2】:

您正在寻找的是背包算法或对它的修改。 问题无法有效解决,但您可以接近完美的解决方案。

您可以使用this google search 来实现。

【讨论】:

  • 添加到哪个,如果实际处理的n只有7个左右,渐近效率不是问题。
【解决方案3】:

这让我想起了Knapsack problem。我没有跟进它,但我记得这是一个 NP 完全问题:阅读“困难”。您基本上需要在“正确”和“快速”之间找到一个折衷方案。

这并不意味着不可能,但这显然是完美的敌人。

我将从“Big Rocks First”方法开始,运行几个模拟。保留最佳解决方案。使用有限的时间来中断搜索并使用目前找到的最佳搜索。

【讨论】:

  • 原来的背包问题可以及时解决NumberOfItems * AvailableCapacity。但他的问题有点不同。我认为要找到最佳解决方案,他必须与背包问题相比,检查所有可能性。
  • 是的,但这在有限的时间内很难做到,这在“现实生活”中总是必要的。这就是为什么你必须快速想出一个合理的解决方案,看看你是否能找到更好的解决方案,并在时间到时使用你找到的最好的解决方案。在实际情况下,商品的数量是合理的,但如果我妻子去购物,您将需要一个 hadoop 集群。
  • 是的,没错。我只是想说他的问题(装箱)比原来的背包问题更难。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多