我正在建立一个程序,允许用户优化他们的杂货店购物,以便他们可以使用最少的成分制作最多的食谱。
这个程序的一个功能是我称之为“NEXT BEST INGREDIENT”或NBI的功能。例如,如果您已经有盐,油和迷迭香,那么NBI将解锁最多的食谱?
让我们说答案是牛肉。如果您购买牛肉,您将能够创建比购买任何其他成分更多的新配方。
购买牛肉后,应该添加的NEXT BEST INGREDIENT是什么?等等。
该功能允许用户输入任意数量的起始成分(包括零)。所以有人可以从0,3甚至50种成分开始。他们接下来应该添加什么?
我正在使用食谱数据库(总共大约500K食谱)来编译结果。
我可以找出编写特定算法的个别步骤。但我需要帮助编写更通用的算法。
这是一个特定的算法:
用户输入3种成分A,B和C
分离使用A + B + C + BLANK的所有4种成分配方。请注意频率最高的BLANK。
隔离所有使用A + B + BLANK ... A + C + BLANK ... B + C + BLANK的3成分配方。请注意频率最高的BLANK。
隔离所有使用A + BLANK ... ... B + BLANK ... C + BLANK的双成分配方。请注意频率最高的BLANK。
隔离所有仅使用BLANK的1成分配方。请注意频率最高的BLANK。
计算具有最高TOTAL频率的BLANK。这是NEXT BEST INGREDIENT。
但是我需要一种方法来编写一个更通用的算法,当用户输入N个成分(从0个成分到100个)时。
我可以用简单的英语写出规则 - 但我的程序员需要一种使用编码逻辑编写通用规则的方法。
这是用简单的英语。
当用户搜索N种成分(包括零)时,立即忽略任何需要N + 2成分或更多成分的配方。然后隔离使用ALL,SOME或NONE这些成分的所有剩余配方,以便有一个(并且只有1个)空槽用于“未搜索”成分。
统计所有“未研究”成分的频率。无论哪种“未被搜索”的成分具有最高频率成为下一个最佳成分。
目标是使此搜索功能准确(或与我的数据库一样准确)并且快速。一些成分很容易。但是当看到10多种成分时,它可能会减慢一些。
有什么想法吗?
答案 0 :(得分:0)
你有 set 的成分,每个食谱都有 set 成分。循环获取设置差异,并查看哪些差异恰好包含一个成分。
一些伪代码:
initialize counts
for each recipe
ingredients = set_difference(recipe_ingredients, my_ingredients)
if length(ingredients) == 1
increment counts[ingredient]
maximum(counts) == next_best_ingredient
获得next_best_ingredients
(复数)比较棘手,因为例如可能有来自上面的#2和#3成分产生比#1和#2组合更多的匹配。我不知道如何解决这个问题,但是你可以用前10个左右重复上一个循环并称之为好。
答案 1 :(得分:0)
我不确定,这是否会带来最有效的实施,但我会尝试以下方法:
- 对于每个剩余的配方(最多含有N + 1种成分,已经煮熟),建立N成分和配方成分的结合。
- 如果结果集中有超过N + 1个成分,则丢弃该配方。否则,取新配料并增加其计数器变量或为该配料添加新的计数器变量。
如果可以,您应该确保每个食谱的成分列表都存储在数据库中。这样,集合生成/检测到多个不匹配应该非常快。