以最低成本为特定功能集选择产品的算法?

时间:2014-01-22 12:02:55

标签: javascript algorithm set mathematical-optimization integer-programming

我有一份产品清单和一系列功能。每种产品都有自己的成本,并提供自己的功能子集。

我想要一个算法,我告诉它我需要哪些功能,它会告诉我需要购买的产品组,以便以最低的总组合成本获得所有这些功能。

有没有人有这样做的食谱?我想在JavaScript中使用它。

1 个答案:

答案 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。解决最优性的最佳搜索策略是深度优先搜索,具有最佳优先回溯。最终产品将是几百行相当复杂的代码。