如何使用背包

时间:2019-07-12 05:39:59

标签: java algorithm math linear-programming

我正在努力最大程度地减少用于铝质推拉窗制造商的铝挤压切割的浪费,而且我无法找出解决该问题应该使用的算法/数据结构。

我已经进行了基础研究,发现问题出在切割料问题(也称为一维切割问题),线性规划问题,贪婪算法。但是我无法决定应该选择哪一个,以及如何开始。

有关此问题的简要说明:

基本上,窗户制造商要购买 3种尺寸的材料选项。

12 | 15 | 16 (IN FT)

现在输入的将是Window的大小。

宽度x高度(英寸)

1)6 x 8-10 Windows

2)9 x 3-20 Windows

计算公式为(2 x宽度)+(2 x高度)。因此,从上述大小的窗口中,它们需要按以下步骤进行挤出。

1)6'(FT)大小的棋子-> 2 x 10 = 20

2)8'(FT)尺寸--2 x 10 = 20

3)9'(FT)大小的棋子-> 2 x 20 = 40

4)3'(FT)大小的棋子-> 2 x 20 = 40

使用背包,我们可以找到组合,但它只能将尺寸限制为1,而在我的情况下,我有3种不同的尺寸可供选择,我想针对切削物料问题生成最佳的最佳组合

在使用Java或任何其他语言的数据结构和算法方面,如何解决上述问题,我将需要帮助。我对数学的了解还不够专业,这就是为什么我在实施项目逻辑时遇到问题,并且希望从社区中获得一些帮助。

3 个答案:

答案 0 :(得分:3)

除了蛮力检查所有可能的组合之外,没有算法可以保证您获得最佳解决方案。显然,这不是一个好的算法,至少在您拥有大量数据集的情况下如此。

您应该看一下Simulated AnnealingMCTS之类的启发式搜索算法。找到启发式搜索引擎的现有实现,让您可以向他们提供

,这应该没问题
  • 输入集(材料上的碎片的随机分布)
  • 转换函数(在材料之间移动零件)
  • 和评估功能(废物量)

并为您计算出接近最佳的解决方案。

答案 1 :(得分:1)

我会回应其他答案的观点:虽然对于这个问题可能有“最正确”的解决方案,但您真正要寻找的是“足够正确”的解决方案。

也就是说,我写了这个小附录来帮助理解您引用的项目中的代码:cutlist generator design notes

改写为:

  

每次迭代都从创建一个新的最长库存实例开始,并在其中放入尽可能多的零件。然后将库存减少到所有选定零件仍可容纳的最小库存。重复所有这些操作,直到没有残片为止。

另一个建议:请确保清楚地确定您要在算法中构建的所有假设。 Mine认为,较长的库存单价更便宜,并且始终是首选,但是我一直被要求进行变型以优化最少数量的切割(成束切割),或者跟踪并优先使用先前运行的切屑。

一如既往:在设定假设之前,非常清楚地了解客户的流程。

答案 2 :(得分:0)

您是否考虑过单纯形算法? 您有一个最小化问题,可以将其转化为一个最大化问题,然后通过算法进行求解,或者通过对偶单纯形法进行求解。 您会在Google上找到实现。