背包问题的可能组合和?

好快速概述

我调查了背包问题

http://en.wikipedia.org/wiki/Knapsack_problem

我知道这是我的项目所需要的,但我项目的复杂部分是我需要在一个主要的麻袋里放多个麻袋。

拿着所有“袋子”的大背包只能携带x个“袋”(例如,为了举例说明9个)。 每个包都有不同的价值;

  • 重量
  • 成本
  • 尺寸
  • 容量

依此类推,所有这些值都是整数。 让我们假设0-100。

内袋也将被分配一种类型,并且在外袋中只能有一种类型,尽管程序输入将被赋予多个相同类型。

我需要指定主包可以容纳的最大重量,小包的所有其他属性需要按加权值分组。


外袋:

  • 可容纳9个小包
  • 重量不超过98 [任何一方给予或取5]
  • 必须保持每种类型中的一种,一次只能容纳一种类型。

内袋:

  • 成本,加权100%
  • 尺寸,加权为67%
  • 容量,加权44%

该程序将提供多个袋子的输入,然后必须计算出更小的袋子的组合进入更大的袋子,根据输入将有多种解决方案,并且程序将为我输出最佳解决方案。

我想知道你们认为对我来说最好的办法是什么。

我将用Java或C#编程。 我很乐意用PHP编程,但我担心这种算法对于Web服务器效率非常低。

谢谢你提供的所有帮助

-Zack

好吧,背包是NP难的,所以我很确定这也是NP难度的(如果不是你可以通过只用一个外袋来解决背包。)所以对于一个完全最优的解决方案,你可能不会比搜索所有组合更好。 所以你想要的程序大纲就像

for each possible combination do if current combination is better than best previous save current combination as best so far fi od 

并且运行时间将呈指数级。 听起来,就像你可能能够通过动态编程获得近乎解决方案 。

考虑使用Prolog进行逻辑编程。 它有多种实现,包括单声道(.NET)上的P# 。 这是一个学习曲线,但是一旦你习惯了它,它就可以解决这类问题了。

希望这可以帮助。 干杯!

链接到P#