鉴于数据文件包含商店ID,成本,商品,我应该使用什么算法从单个商店获取所有要求的备件,以获得最低奖金。如果找不到单一商店,则“无”#39;应该打印。此外,在最低奖金范围内购买额外备件也没有任何害处。
Shop ID, Cost($), Items List
1, 4.00, E
1, 8.00, F
2, 5.00, E
2, 6.50, F
5, 4.00, A
5, 8.00, D
6, 5.00, D
6, 6.00, A, B, C ; Here in 6$ three items can be obtained
7, 2.20, B
7, 3.00, B,C
7, 2.00, B
7, 2.50, C
a) Spare Parts : A,D
Output:
Shop ID-6
Cost - 11.0$
b) Spare Parts : E,F
Output:
Shop ID-2
Cost - 11.5$
我的方法(不起作用):
a)首先获取常见的商店ID以获取给定的输入
shop_id_list=[]
for items in input_list:
shop_id_list = getCommonShopIds(items.strip(), shop_id_list )
all_items.append( items )
b)每个all_items
获得所有shop_id_list
中该项目的最低费用,(如果项目已包含在上次迭代中,则为0)
res = [0 for x in range(len(shop_id_list)) ]
for items in all_items:
all_cost = getMinShopCost( shop_id_list, items )
res= map(operator.add, all_cost, res ) # Add those list
c)在res中找到最小元素索引(比如i
)并打印相应的shop_id_list[i]
和res[i]
我的逻辑不适用于以下情况:
输入:B C
它打印7 4.5 $
预计应为7 3.00 $
这是任何标准问题,还是任何图论问题的变异等?
我无法找出任何优化方法,我们将不胜感激。
PS:Python只被标记,因为问题有python代码片段,我只对方法感兴趣。此外,这不是网上竞赛的任何问题,也不是我所知道的。
答案 0 :(得分:1)
这里有2个步骤。
第一步:您首先需要找到哪些地方可以满足库存中所有必需零件的约束。调用满足此约束集S的位置集。如果S为空,则返回none。如果S不为空并且有多个位置,那么您将进入第二步。
第二步:Y必须计算从S中每个位置获取零件的成本。计算单个位置的成本是约束满足问题。 http://en.wikipedia.org/wiki/Constraint_satisfaction_problem。您可以通过几种方式解决此问题。一种方法是使用基于混合整数LP的方法,具有以下公式:
Let X be the item groups bought
let y_1, .. y_n be the items you require
min F(X) = \sum cost(X)
subject to:
y_i \in X, for i \in {1,..,n}
基本上你有一些二元约束。有可能更好的方法来制定这个,但这有希望给你一般的想法。 你可以用一些像单纯形法的LP求解器来解决这个问题。
如果您使用的是Python,请查看这些求解器库: http://www.scipy.org/ https://software.sandia.gov//trac/coopr https://code.google.com/p/pulp-or/
计算成本后,您将返回S
中地点成本最低的地方答案 1 :(得分:0)
如果问题很小,那么简单的回溯就会: -
- 为每个商店做
- 选择尚未选中的商品,并且至少包含未购买商品的子集。
- 将商品选为商品,并将商品所涵盖的所有商品标记为已选中。
- 递归选择,直到所有项目都耗尽或没有可行的报价。
- 记录所有可能购买的最低成本。
醇>
此外,如果费用已超过当前最低费用,您还可以阻止递归。
如果报价数量很少,那么也可以使用暴力: -
- 选择要约的子集并标记其涵盖的所有项目。
- 从中生成一个位数。
- 放入哈希图n =>最低成本。
醇>
如果您有多个订单,这非常有效,因为您只需要通过输入n位数来在hashmap中查找。
您还可以尝试分支和约束技术,例如单独拍摄的项目总和