Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何以最低成本获得车辆备件?_Python_Algorithm - Fatal编程技术网

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

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,

如果一个数据文件包含车间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,       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,很高兴这有帮助。我这样做了好几年了。我想尝试解决这个问题会有一篇很棒的博客文章,所以如果我有时间,我会这么做。