背包问题的可能组合和?
好快速概述
我调查了背包问题
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#