假设我的冰箱里有一张很快就要坏掉的食材清单,还有一张用完各种原料的食谱。(其中一些我目前还没有。)
是否有一种算法可以产生最优的循环集,其中最优集最大限度地使用了我冰箱中的食材,并且最小化了我必须从商店购买的食材数量?
(备选方案:在纸牌游戏中,我可以根据不同的规则组合一些卡片;我也可以以不同的方式获得新卡。我如何找到一套最好的规则来使用我拥有的最多的卡,以使我在获得新卡方面的最小努力?)
发布于 2014-04-16 16:12:05
这是精确覆盖问题,卡普在1972年的经典论文中证明NP是完整的21个问题之一,这篇论文确立了NP-完备的重要性。
维基百科的描述是:
给定一个集合X子集的集合S,一个精确的覆盖是一个子集合S*,使得X中的每一个元素都包含在两个子集*中。
最基本的问题是,在S和X的情况下,S是否包含X的确切覆盖?
这里X是你冰箱里的一套,S是菜谱的集合。任务是找到食谱的一个子集S*,这样X中的每个成分都被一个食谱所用。
确切的封面是已知的保持NP-完整,即使每个食谱不需要超过3种成分。如果每个菜谱有2个或更少的成分,则在二分图中找到一个最大匹配的多项式时间算法。
类似的问题,是否有覆盖S*,至少覆盖X的n个元素,也是NP-完全的。类似地,我们可以将其改写为一个优化问题:找到覆盖最大可能数量的元素的子集S*。求解这一优化问题的有效方法是求解NP-完全决策问题,至少与决策问题一样困难。
与NP-完全问题一样,可以这样说:
维基百科还提到了唐纳德·算法,它通过将菜谱表示为矩阵的行,有效地执行了对解决方案空间(可能非常大)的彻底搜索。
发布于 2014-04-16 15:52:22
听起来像是路径查找问题,您从节点X
开始,希望以最少的成本移动几个步骤。
当你买东西的时候,成本就会增加,当你不买东西的时候,成本就会保持不变。
我建议在你找到冰箱空空如也的节点之前,给你一个充满洪水或极小最大的阿尔法贝塔。(在此之后,你无论如何都需要购买)
发布于 2014-04-16 17:04:19
我要采取的方法是误差最小的方法。
1)创建一组符号来代表每一种食物。
2)用一串符号来表示冰箱里的东西。字符串被排序,多个项表示为多个符号。液体等应以多杯分数(即6x1/4杯牛奶)表示。
3)用相同的方式表示每个菜谱。
现在,做一个最小的错误模式匹配每个食谱字符串与冰箱字符串。
很久以前,我有过早期识别器的经验。我不知道这是否有帮助。
https://softwareengineering.stackexchange.com/questions/236124
复制相似问题