背包问题的可能组合和?

时间:2009-04-23 16:11:48

标签: c# java complexity-theory scale knapsack-problem

好的快速概述

我已经研究了背包问题

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

我知道这是我的项目所需要的,但我项目的复杂部分是我需要在主袋内多次麻袋。

装有所有“袋子”的大背包只能携带x个“袋子”(举例来说就是9个)。每个包都有不同的值;

  • 重量
  • 费用
  • 尺寸
  • 容量

等等,所有这些值都是整数。让我们假设0-100。

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

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


实施例

外袋:

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

内袋:

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

程序将输入多个包,然后必须计算出更小的包的组合进入更大的包,根据输入将有多种解决方案,程序将为我输出最佳解决方案

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

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

感谢您提供任何帮助

-Zack

2 个答案:

答案 0 :(得分:2)

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

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

并且运行时间将是指数级的。但是,听起来,您可以使用dynamic programming获得近乎解决方案。

答案 1 :(得分:0)

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

希望这会有所帮助。干杯!

链接到P#