如何以最低成本获得车辆备件?

时间:2014-07-06 16:08:19

标签: python algorithm

鉴于数据文件包含商店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代码片段,我只对方法感兴趣。此外,这不是网上竞赛的任何问题,也不是我所知道的。

2 个答案:

答案 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)

如果问题很小,那么简单的回溯就会: -

  
      
  1. 为每个商店做
  2.   
  3. 选择尚未选中的商品,并且至少包含未购买商品的子集。
  4.   
  5. 将商品选为商品,并将商品所涵盖的所有商品标记为已选中。
  6.   
  7. 递归选择,直到所有项目都耗尽或没有可行的报价。
  8.   
  9. 记录所有可能购买的最低成本。
  10.   

此外,如果费用已超过当前最低费用,您还可以阻止递归。

如果报价数量很少,那么也可以使用暴力: -

  
      
  1. 选择要约的子集并标记其涵盖的所有项目。
  2.   
  3. 从中生成一个位数。
  4.   
  5. 放入哈希图n =>最低成本。
  6.   

如果您有多个订单,这非常有效,因为您只需要通过输入n位数来在hashmap中查找。

您还可以尝试分支和约束技术,例如单独拍摄的项目总和