类似于切割库存但不完全

时间:2018-05-02 14:20:07

标签: python algorithm dynamic-programming knapsack-problem bin-packing

我已经阅读过关于减少库存问题,但这有点不同。请你指点我一些资源。有箱包装,切割库存...

我们有不同型号的订单,以及生产它的最大尺寸的机器。

变体是X,S,XL,L和有序数量,100,40,40,80

X> 100

S> 40

XL> 40

L> 80

说,机器宽度为6

这意味着,我们可以将6种不同的变体组合在一起并生成它。

我们可以放2 X,1 S,1 XL,2 L,这意味着如果我们生产50次,输出是:

X> 100(0浪费)

S> 50(10浪费)

XL> 50(10浪费)

L> 100(20浪费)

生产的300个废物共计40个。

减少浪费的另一个方法是创造两种不同的变化。 我们可以放4 X,2 S并生产25次,浪费10次 并进行另一次设置并放入2个XL,4 L并生产20次,无浪费。 我们总共有10个废物,我们在2个设置中处理了这个生产。

由于设置有价格,我们希望首先设置,或者根据数量,我们可能会选择第二个。

我已经阅读了关于切割库存的信息,看起来与此类似,但能够在不同设置之间划分数量,这有更大的优化潜力,因此更复杂。

我已经考虑过了,并没有一个可靠的解决方案,如果这个问题在文献中有任何地方,你能否至少告诉我关键词以便我可以搜索它?

感谢。

注意:我知道基础数学和优秀的python编程语言。

1 个答案:

答案 0 :(得分:0)

我建议用A *搜索解决这个问题,以便以最快和最低成本的方式获得0。

对您来说可能是新的数据结构是一个优先级队列,您可以使用https://docs.python.org/3/library/heapq.html,访问节点的字典以及一些逻辑来获取。诀窍在于您可以随意提供可能的部分解决方案,它们将以最低成本的顺序出现,然后进行最远的。

这是主要逻辑部分的未经测试的代码。

# There should be 84
configs = generate_list_of_machine_configurations(variants)
# Our priority queue
upcoming = [(0, sum(quantities), quantities, None]
seen = set()
while (len(upcoming)):
    (waste, _, quantities, path) = heapq.heappop(upcoming)
    if tuple(quantities) not in seen:
        if all_zeros(quantities):
            return path # ANSWER IS FOUND HERE

        seen.add(tuple(quantities))
        for config in configs:
            for count in range(max(quantities)):
               (new_quantities, wasted) = apply(quantities, config, count)
               new_path = [(config, count), path]
               if all_zeros(new_quantities):
                   heapq.heappush(upcoming, (
                       waste + wasted, 0, new_quantities, new_path))
               else:
                   heapq.heappush(upcoming, (
                       waste + wasted + cost_of_config_switch,
                       sum(new_quantities), new_quantities, new_path))