类似于切割库存但不完全
Posted
技术标签:
【中文标题】类似于切割库存但不完全【英文标题】:Similar to cutting stock but not quite 【发布时间】:2018-05-02 14:20:06 【问题描述】:我已经阅读了有关切割库存问题的信息,但这有点不同。请你指导我一些资源。有装箱、切料...
我们有不同型号的订单,以及生产它的最大尺寸机器。
变体为 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 个废物。
另一种减少浪费的方法是创建 2 种不同的变体。 我们可以放 4 X,2 S 生产 25 次,浪费 10 并进行另一个设置并放入 2 XL,4 L 并生产 20 次,没有浪费。 总共有 10 个废物,我们在 2 个设置中处理了这个生产。
由于设置有价格,我们更喜欢第一个设置,或者根据数量,我们可以选择第二个。
我读过关于切割库存的文章,它看起来与这篇类似,但能够在不同设置之间分配数量,这具有更大的优化潜力,因此更复杂。
我想了想,也没有可靠的解决方案,如果这个问题在文学中有任何位置,你能不能至少告诉我关键词,以便我搜索它?
谢谢。
注意:我知道基本的数学和良好的 python 编程语言。
【问题讨论】:
很有趣,但听起来很棘手。对于 SO 来说,目前的状态太宽泛了,我们的重点更多地放在特定的编码问题上。您也许可以在 Software Engineering 网站上获得这方面的帮助,但请先阅读他们的帮助,然后再在那里发布问题。 对我来说似乎并不太宽泛。您需要做的就是指定有多少浪费正在停止和重新配置机器,并且它是准确指定的。什么样的配置或一组配置可以最大限度地减少浪费? 在这种情况下,实际最好的是 X、S、XL、L、L 产生 40 次,然后是 X、X、X、X、X、X 产生 10 次。零浪费! 你想最小化什么?浪费还是成本?因为如果你先做所有 X,然后是所有 S,然后是所有 XL,然后是所有 L,那么你有 4 个设置,所有之间的最大浪费为 30 @juvian 成本。浪费是有成本的,重新配置也是如此。 【参考方案1】:我建议通过 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))
【讨论】:
感谢您的建议,堆队列将是我的兴趣,但这可以成为解决问题的工具。我的问题是似乎有无穷无尽的可能性,我需要一种方法来减少它并找到解决方案。 @durdenk 问题是 np-complete。我给出的方法是伪多项式时间。在实践中,它可能相当有效。以上是关于类似于切割库存但不完全的主要内容,如果未能解决你的问题,请参考以下文章
部分视图部分适用于 JQuery,但不完全适用于 C# ASP.Net MVC 5
Laravel - 正则表达式路由匹配所有内容,但不完全匹配一个或多个单词