让我们说我有一个食物数据库,每个都含有一定量的脂肪,碳水化合物和蛋白质。例如,让我们说我有这个数据库:
Item Fat Carbs Protein ================================================ Milk 12 36 8 Chicken 1 12 18 Juice 0 50 2 Bacon 9 1 4
什么是有效的算法,看看这些食物的哪些组合适合一定范围的所需脂肪,碳水化合物和蛋白质,每个项目可以多次使用?
如果我想要一个在脂肪范围内的组合:20-30,碳水化合物:170-190,蛋白质:100-110,那么2个牛奶,5个鸡,1个果汁和0个培根将是一种可能解决方案,0 Milks,5 Chickens,2 Juices和2 Bacons。
如果算法一旦点击可能的解决方案就停止了也没关系,但我希望它不是一个确定性算法,所以下次运行时有可能将找到一个不同的解决方案。
这个问题听起来像NP难问题,如子集和问题或背包问题,我已经研究了那些算法,但我不理解多约束问题的算法。背包问题也在优化,而这里没有优化。
如果解决方案不限于整数(如0.2 Milks),我认为如果数据库中有更多项目,并且更容易(找到符合约束条件的单个解决方案),这个问题会更加困难。
我打算在Python中加入这样的东西,所以感谢Python解决方案。
答案 0 :(得分:1)
如果数学编程目前太难了,也许从stochastic hill climber开始。
您描述的这个问题让人联想到混合问题。 Here's我发现了MiniZinc的解决方案(玩具示例)。
答案 1 :(得分:1)
即使您只需要一种营养素(例如蛋白质),您的问题至少与允许重复的子集总和一样困难,因为无论您想要什么范围,您都可以将目标总和乘以正数整数倍,然后定义范围以上升到下一个减去1,并类似地将所有集合的数字乘以相同的正整数并加1,如果可以解决问题,你可以得到你可以解决的子集和一个特定的范围。
您可以使用整数线性编程来解决您的问题,让变量Xi表示您将包含多少项目,然后使用约束
Fmin <= F1*X1 + F2*X2 + ... + Fn*Xn <= Fmax
其中Fi是item1中的脂肪量,[Fmin,Fmax]是您允许的脂肪范围。你还需要每个Xi> = 0的约束。整数线性规划为Xi找到一个有效的解,使得线性函数
C1*X1 + C2*X2 + ... + Cn*Xn
被最小化或最大化,其中Ci是常数。您可以通过更改Ci来获得不同的有效解决方案。获得所有有效的解决方案,甚至更弱,计算有效解决方案的数量,是一个更难的问题。