我有一份产品清单和一系列功能。每种产品都有自己的成本,并提供自己的功能子集。
我想要一个算法,我告诉它我需要哪些功能,它会告诉我需要购买的产品组,以便以最低的总组合成本获得所有这些功能。
有没有人有这样做的食谱?我想在JavaScript中使用它。
答案 0 :(得分:4)
这是(加权)set cover problem。优化无法强制实例的最简单,最有效的方法是运行整数程序求解器。例如,Iain Dunning在JavaScript中编写了一个名为SimplexJS的文件。 (基本功能似乎就在那里,但没有多余的装饰(例如,预定器,切割平面或稀疏线性代数),明显缺乏许可证或文档可能不符合您的喜好。我确信那里是替代品。)
上面的维基百科链接提供了集合封面的抽象表述。更具体地说,让我们假设有产品A,B,C,D,其中相关的功能集和价格是
A: {1, 2, 3}, 9.99
B: {2, 4}, 7.99
C: {3, 4}, 6.99
D: {4, 5}, 8.99 .
我们为每个产品制作二进制变量xA,xB,xC,xD。如果我们买A,变量xA是1,如果不买,则变量0。我们的目标是
minimize 9.99 xA + 7.99 xB + 6.99 xC + 8.99 xD .
对于每个功能,我们都有一个限制要求我们购买具有该功能的产品。
1: xA >= 1
2: xA + xB >= 1
3: xA + xC >= 1
4: xB + xC + xD >= 1
5: xD >= 1
给定一个合适的库,您只需编写代码将实例转换为这样的程序并调用求解器。
如果您因任何原因需要推出自己的图书馆,那么您将需要了解branch and bound和(双重)simplex method。解决最优性的最佳搜索策略是深度优先搜索,具有最佳优先回溯。最终产品将是几百行相当复杂的代码。