具有多种约束的多维背包

时间:2012-11-22 16:42:01

标签: algorithm greedy knapsack-problem

我不确定我是否已正确识别问题,但阅读背包问题似乎最接近我想要解决的问题:

厨师有几种不同数量的成分。例如:

8个鸡蛋 3根香肠 500毫升牛奶 12个草莓

有一个有限的食谱清单,每个食谱包含不同数量的不同成分。成分的范围是有限的,所有食谱中每种成分的数量都是有限的。

每种食谱可能包含也可能不包含厨师的任何成分。

厨师希望尽可能多地消耗掉所有食材,以尽量减少1食谱的浪费。

有一种情况,厨师想要在2或3种不同的食谱上使用他的所有食材,剩余的食物很少。

他的优化解决方案是什么?

编辑:我的问题是以下背包问题的更复杂版本 http://www.g12.cs.mu.oz.au/wiki/doku.php?id=simple_knapsack

2 个答案:

答案 0 :(得分:1)

如果我在你的Q中没有遗漏任何东西,这听起来不像背包问题。 进入每个配方的每种成分的量是已知的 所以您的插槽大小不是变量。

如果我正确地读了你的Q,你需要做的就是运行 成分通过每个食谱,看看数量是否足够, 如果是这样,计算成分的价值 被遗漏在那一个。配方最少 这样的正面价值观是你的答案。取\ theta(m * n) 直接进入配料清单的时间 - m&数字 成分和食谱。

答案 1 :(得分:0)

让我重写你的Q,看看我是否理解正确: 你有一套食谱S,每个食谱都含有一份成分要求清单。厨师有一套成分,其中一些成分可能甚至为零。你想确定一个S的子集,这样S中的每个食谱都可以通过厨师的成分来满足,同时最大限度地减少所谓的剩余食物。

说你有1个鸡蛋,5个香肠;两个食谱:A。香肠蛋1E1S; B. Jumbo Sausage-0E5S。所以可能的解决方案是{A}。{B},{A,B}。用{A},留下4根香肠;与{B},留下1个鸡蛋,{A,B},实际上是非法或不可行的解决方案。

我的问题是:你如何评价剩下的?如果禽流感开启,鸡蛋可能价格过高,{B}可能是首选。所以也许通过定价每种成分来定义一些有意义的和函数,比如 f

如果您使用有意义的总和,则可以将其视为多维KP。这些项目是那些收据,包含多个"指标"例如#of成分1(或说长度),#成分2(或称宽度)......并且它们被装入一个恰好具有多维度(长度,宽度......)的袋子中,因此可行的包装必须满足其对每个维度的约束,即成分 k 的总用量必须小于厨师的总成分。 obj是最小化 f (权重)或max f (用完的成分数量的价格) - 互联网的总价格,或者仅仅是第一部分。

据我所知,只要维数(在你的情况下,成分)不高,这个问题就可以解决了。这有点像切割库存。