Javascript 选择具有目标金额的项目的最佳组合

Javascript 选择具有目标金额的项目的最佳组合,javascript,arrays,recursion,Javascript,Arrays,Recursion,我正在创建一个膳食计划生成器(NodeJS/Javascript和MongoDB),其中还包含一个随机化函数。我有一个MongoDB 400k配方对象 配方对象样本: {"name": "Roasted Beef", "calories": 450, "carbs":10 , "fats": 20.2 , "proteins": 55.4} (这是一个50条记录的食谱样本:) (这里是一个真正的JSON转储,用于存储超过40万个菜谱:您可以忽略“\u id”和“\u v”字段) 假设用户需要生

我正在创建一个膳食计划生成器(NodeJS/Javascript和MongoDB),其中还包含一个随机化函数。我有一个MongoDB 400k配方对象

配方对象样本:

{"name": "Roasted Beef", "calories": 450, "carbs":10 , "fats": 20.2 , "proteins": 55.4}
这是一个50条记录的食谱样本:)

(这里是一个真正的JSON转储,用于存储超过40万个菜谱:您可以忽略“\u id”和“\u v”字段)

假设用户需要生成膳食计划(最少3个和最多6个配方对象的组合),以使以下总数(其所有对象中所有值的总和)大致在目标范围内。但您也可以更改每个配方的上菜量,这是其所有值的乘数,可以是以下任意值:1、1.5、2、2.5、3、3.5或4。这个乘数是必要的,因为我们找不到在添加时总是符合目标的食物,所以我们需要改变服务量以达到目标

示例:生成包含以下内容的用餐计划:

Total calories: 2,000
carbs: [20-50]
fats: [40-70]
proteins: [40-90]
因此,假设我们做3份食谱,2.5份另一份,1份第三份,以达到目标

我想到了一个解决方案,迭代一组随机选择的1000个食谱,然后尝试所有的组合,每个组合都有不同的服务大小,以匹配目标。或者是一个递归函数,它会随机挑选一顿饭,然后尝试寻找另一顿饭,并尝试更改它的份量,等等,直到我们达到目标

用餐计划应该尽可能地随机,所以这里的目标不仅仅是优化目标,还要尽可能地保持事情的随机性

这类问题有什么已知的解决方案吗?只是为了避免重新发明轮子,如果已知任何算法可以解决这个问题


谢谢你的帮助

嗯,我不知道一个好的算法。但这只是对递归方法的一个警告,对于简单的约束,它应该工作得相当好。但是,当选择极端约束条件时(假设我们在列表中选择一个配方,它是帕累托最小值,将值乘以3并将其设置为最大值,那么3倍的配方可能是唯一的解决方案),仅尝试随机组合就可以通过极端数量的组合


您应该尽量限制选项,而不排除任何可行的组合(如果您希望保留最大的随机性)。如果你能使它有可能有一个可行的结果,它可以减少食谱,必须进行测试(或如果条件足够彻底,以确保它,你可以避免完全回溯)。就像单参数一样,这很简单:如果参数a有k max,并且从参数中有m的配方开始,那么min(参数a)*2+mSo您自己尝试过什么?卡路里是否总是固定的,或者它也可能被表示为范围限制?@ScottSauyetI试图选择所有在期望范围+/-8%内的配方作为保证金,虽然有效,但选项非常有限,并且大部分时间都在重复。这就是为什么我决定,我将需要计算总目标(以克为单位),然后开始在随机膳食上迭代,并调整每个膳食的份量,以达到目标。@ScottSauyet卡路里总是固定的,但可能有一个误差幅度没有问题。然后我会像其他人一样表达它,比如说
[1840-2160]
并将所有误差范围嵌入这些固定值中。否则,算法将变得不必要的复杂。谢谢你的想法!我们将对此进行更多的研究。