计划以优化成本

时间:2012-04-19 07:51:05

标签: optimization mathematical-optimization discrete-mathematics

这是我为我的一个CS课程设置的问题,我有点卡住了。以下是问题的摘要。

Create a program that will:
1) take a list of grocery stores and its available items and prices
2) take a list of required items that you need to buy
3) output a supermarket where you can get all your items with the cheapest price

input: supermarkets.list, [tomato, orange, turnip]
output: supermarket_1

The list looks something like
supermarket_1
$2.00 tomato
$3.00 orange
$4.00 tomato, orange, turnip

supermarket_2
$3.00 tomato
$2.00 orange
$3.00 turnip
$15.00 tomato, orange, turnip

If we want to buy tomato and orange, then the optimal solution would be buying 
from supermarket_1 $4.00. Note that it is possible for an item to be bough 
twice. So if wanted to buy 2 tomatoes, buying from supermarket_1 would be the 
optimal solution.

到目前为止,我已经能够将数据集放入数据结构中,希望能够让我轻松地对其进行操作。我基本上有一个超市字典,价值指向另一个字典,其中包含从每个条目到其价格的映射。

supermarket_1 --> [turnip --> $2.00]
                  [orange --> $1.50] 

一种方法是使用蛮力,获得所有组合并找到满足解决方案的任何一个并找到最小的那个。到目前为止,这是我能想到的。 没有假设两个项目组合的价格低于单独购买的价格。

欢迎任何建议提示

3 个答案:

答案 0 :(得分:2)

为特定超市寻找最佳解决方案是set cover problem的概括,这是NP完全的。减少如下: 给定集合覆盖问题的实例,只需定义为每个组合分配1的成本函数,应用解决问题的算法,并获得集合覆盖实例的最优解。 (因此找到最小价格对应于找到覆盖集的最小数量。)因此,您的问题是NP-hard,并且您不能期望找到在多项式时间内运行的解决方案。

你真的应该实施你提到的蛮力方法。作为第一步,我也建议你这样做。如果性能不够,可以尝试一下 使用MIP配方和像CPLEX这样的求解器,或者你必须开发一种启发式方法。

对于单个超市,找到mixed integer program (MIP)是相当简单的。让x_i为整数,解决方案中包含产品组合i的频率,c_i成本和w_ij产品j的包含频率i在产品组合 sum_i x_i * c_i 中。然后,你正在最小化


sum_i x_i * w_ij >= r_j,

之类的条件限制
r_j

其中j是产品{{1}}需要的频率。

答案 1 :(得分:1)

嗯,你有一个方法,所以现在就实现它,这样你就可以提交一些东西。一个暴力解决方案不需要很长时间来编写代码,然后您可以获得一些性能数据,您可以更深入地思考问题。猜测一个大城市合理购物范围内超市的数量。创建许多超市记录并将它们链接到具有随机价格的产品表(这比解决方案更多的工作)。

运行你的暴力解决方案。它有用吗?如果它输出一个解决方案,“手动”将价格加起来并将其列在随机拍摄的其他三个“超市”记录中(只需选择一个数字),表明总数小于或等于。修改列表中项目的价格,使解决方案不再便宜并重新运行,以便您获得不同的解决方案。

它是否如此之快以至于没有进一步的工作是合理的?如果是这样,请在报告的结论部分说明,并将该批次发布给您的教授/助教。你理解了这个任务,想到了它,提出了一个解决方案,实现了它,用一个有代表性的数据集对它进行了测试,结果表明功能可以证明并且性能足够 - 你的任务结束了,去吧,想想下一个一个啤酒。

答案 2 :(得分:0)

我不确定你的“蛮力”解决方案是什么意思。 为什么不直接计算每个超市中物品清单的成本,然后选择最小值?复杂性将在O(#items x #supermarkets)中,这很好。

关于您的数据结构,您还可以简单地使用矩阵(2维数组)价格[超级] [商品],并为您的超市/商品使用ID。