包装问题

时间:2011-03-04 15:57:41

标签: algorithm packing

我有以下问题:

  1. 我有一定数量的具有不同颜色的相同形状的项目(我知道每种颜色有多少)
  2. 我将这些物品打包成可以容纳每个物品的给定数量(n)的盒子,以便我使用最少的盒子数:round_up(total_nr_of_items / n)
  3. 有些颜色我不允许放在一个盒子里,除非我不能有理想的盒子数量。
  4. 每个颜色(每种颜色不同)的项目数量最少,我可以放在一个盒子里。那是我可以决定放0个。一种颜色的盒子或最少的k个。或以上。如果无法使用最小数量的方框进行打包,也可以打破此约束(尽可能少)。
  5. 我想找到一个解决方案,尽可能少的颜色在盒子之间分开。
  6. 我认为这是一种包装问题,但我不知道是哪一种。

    请建议将上述转换成哪个包装问题和/或我可以用来解决此问题的算法。

2 个答案:

答案 0 :(得分:3)

看起来像NP-Hard 约束满足问题。你会有这样的硬约束和软约束。

内置约束:

  • 我有一定数量的具有不同颜色的相同形状的项目(我知道每种颜色有多少)

硬约束:

  • 有些颜色我不允许放在一个盒子里。

  • 每个颜色(每种颜色不同)的项目数量最少,我可以放在一个盒子里。那是我可以决定放0个。一种颜色的盒子或最少的k个。或以上。

软约束:

  • 我将这些物品打包成可以容纳每个物品的给定数量(n)的盒子,以便我使用最少的盒子数:round_up(total_nr_of_items / n)

更柔和的约束(或非常轻的软约束):

  • 我想找到一个解决方案,尽可能少的颜色在盒子之间分开。

要解决此问题的算法,请查看模拟退火禁忌搜索分支和绑定,...

对于实现此类算法和支持约束的软件,请查看Drools Planner(java,开源)。

答案 1 :(得分:1)

这可能是NP-Hard。

分区问题(正整数)似乎减少了。

给定一个正整数数组A [1,... n]我们需要找到一些子集与它的补码具有相同的和。

将您的颜色视为1到n。你有两个盒子。一个盒子可以容纳颜色的最小值是A [i],你有完全A [i]颜色的项目i。

每个框可容纳的最大项目数为(A [1] + .. + A [n])/ 2.