Python 如何以最低成本获得车辆备件?
如果一个数据文件包含车间id、成本、项目,我应该使用什么算法从单个车间获得所有要求的备件,以获得最低奖励。如果找不到单个店铺,则应打印“无”。此外,在最低奖金范围内购买额外备件也没有坏处Python 如何以最低成本获得车辆备件?,python,algorithm,Python,Algorithm,如果一个数据文件包含车间id、成本、项目,我应该使用什么算法从单个车间获得所有要求的备件,以获得最低奖励。如果找不到单个店铺,则应打印“无”。此外,在最低奖金范围内购买额外备件也没有坏处 Shop ID, Cost($), Items List 1, 4.00, E 1, 8.00, F 2, 5.00, E 2, 6.50, F 5, 4.00,
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$
我的方法不起作用:
对于给定的输入,首先获取公共店铺ID
shop_id_list=[]
for items in input_list:
shop_id_list = getCommonShopIds(items.strip(), shop_id_list )
all_items.append( items )
b对于每个所有项目,在所有车间id列表中获得该项目的最低成本,如果项目已包含在上一次迭代中,则为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 say i中找到最小元素索引,并打印相应的shop_id_list[i]和res[i]
我的逻辑不适用于以下情况:
输入:B C
它打印7.4.5$
预计应为7.3.00$
这是一个标准问题,还是图论问题的变体,等等
我无法找出任何优化的方法,任何帮助都将不胜感激
PS:Python只是被标记了,因为问题中有Python代码片段,我只是对这种方法感兴趣。另外,这不是在线比赛的任何问题,我也不知道。这里有两个步骤
第一步:您首先需要找到哪些地方可以满足所有必需零件的库存约束。调用满足此约束集S的位置集。如果S为空,则返回none。如果S不是空的,并且有多个位置,则转到第二步
第二步:Y必须计算从美国每个地方获得零件的成本。计算单个地方的成本是一个约束满足问题。有几种方法可以解决这个问题。一种方法是使用基于混合整数的方法,公式如下:
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,请查看以下解算器库:
计算成本后,返回S中成本最低的地点如果问题很小,则简单回溯即可:- 为每家商店做些什么 选择尚未选择且至少包含未采购项目子集的报价。 将报价设为选中,并将其涵盖的所有项目标记为选中。 递归选择,直到所有项目用尽或不存在可行的报价。 记录所有可能采购的最低成本。 此外,如果成本已经超过当前最小成本,还可以防止递归 如果报价数量较少,则使用暴力:- 选择优惠的子集并标记其涵盖的所有项目。 从中生成一个n位数字。 放入一个hashmap n=>mincost。 如果您有多个订单,那么这是非常有效的,因为您只需在hashmap中查找订单的n位编号即可
您还可以尝试使用分支绑定技术,使用类似于单独获取的项目总和的估计值这里有两个步骤。首先需要找到哪些位置可以满足约束。调用此集合S。如果S为空,则返回none。如果S不是空的,则计算从S中每个位置获取的成本。返回S中成本最低的位置。如果可以从多个位置获取零件,则问题要困难得多。大致有多少不同的零件?@j_random_hacker,未指定/未知,我问,数据应该是从csv文件输入的,因为有一个简单的DP算法,不同产品的数量是指数级的,所以如果少于20个,这将是理想的,但是如果大于30,则完全没有用。另外:你怎么可能不知道可能有多少不同的部分?这件事你不是可以问问别人吗?否则这听起来像是一个在线竞赛问题…+1谢谢你的方法,我正在努力理解,这可能需要一些时间来解决me@P0W,很高兴这有帮助。我这样做了好几年了。我想尝试解决这个问题会有一篇很棒的博客文章,所以如果我有时间,我会这么做。