一维装箱工具近期变化(截至 2021 年 3 月 21 日)

1. 变更概要

博客上写的一维装箱工具的描述是截至2017-11-19写的。

装箱结果示例

相关文章: 使用一维装箱算法的工作分配优化_1.概述 – 生产力技能 (prodskill.com)

2021年3月21日进行K公司项目时有改进,故单独组织。

  • 将项目大小从整数(长整型)更改为实数(双精度)(更改变量名称前缀)
  • BinItem 名称区分大小写(从 Collection 更改为 Dictionary)
      – 类名更改(CBinItemCollection -> CBinItemDic)
  • 按奇数组和偶数组对分布结果进行排序
  • 改进的 BinItem 加载代码(使用偏移量循环 –> 从范围获取 Variant 数组)
  • 如果 Bin Item Name 中有重复项,则会通过重复列表消息框进行通知,并停止执行。

更改后的版本可以从下面的 github 存储库下载。

https://github.com/DAToolset/1D-bin-packing

2. 变更详情

2.1 将项目大小从整数(长整型)更改为实数(双精度)(更改变量名称前缀)

在之前的版本中,如果输入0.1或21.8等真实大小值,则会转换为整数类型,并且小数点以下的值会被截断,存在无法准确分配的问题。这主要是当使用KB、MB、GB、TB等单位而不是字节数来使用大小值时出现的问题。

将 CBinItem 类的“Public m_lSize As Long”成员变量声明更改为“Public m_dSize As Double”。

2.2 BinItem名称区分大小写(从Collection改为Dictionary)

作为现有 CBinItemCollection 类的成员变量,每个项目都在 Collection 中存储和管理。搜索item时,以item名称为key找到了item实例,但Collection的item key具有不区分大小写字母的特性。

从区分大小写的数据库中提取的表名和列名更改为不区分大小写的Collection的项目键,并且重复。

在区分大小写的数据库中,您可以分别创建并使用表名称“T1”和“t1”。不建议这样做,因为它可能会导致混乱,但它需要改进,因为必须以不同的方式标识已创建的对象。

使用字典重写了该类,以便项目键区分大小写,并且类名也从“CBinItemCollection”更改为“CBinItemDic”。

2.3 按奇偶组分布结果排序

在 BinPacking 结果中,每个 bin 的项目大小排序如下。

  • 如果选择“项目尺寸降序”选项:从较大项目到较小项目按相反顺序排序
  • 如果未选择“商品尺寸降序”选项:输入顺序

假设执行装箱的结果被分配到4个bin中。如果按原样复制 Bin Item 列表,创建任务组并执行每个任务组,可能会出现以下现象。

  • Bin Item按大小倒序排序时的执行现象
    • 一组 4 个并发运行的任务从一开始就运行最大尺寸的任务。
    • 服务器资源(CPU、内存、I/O)竞争加剧,当资源不足时,部分任务失败或等待时间增加。
    • 随着大型任务的执行完毕,资源争用逐渐得到解决,小型任务的执行也逐渐跟进。
  • Bin Items按输入顺序排序时的执行现象
    • 服务器资源争用加剧并解决,然后重复。

这种现象可能会造成资源无法有效利用的问题,导致服务器负载过大或难以预测执行完成点。

如果使同时执行的任务的大小总和几乎均匀,则可能不会出现此问题,但由于 bin 项目的大小不均匀,因此几乎不可能使其接近相同的大小。

为了尽量减少这种现象,每个 bin 中的项目按大小排序,但添加了颠倒 bin 顺序中偶数和奇数排序顺序的选项。

应用此选项会产生以下分布:

Bin1: 2, 5, 3, 1
Bin2: 3, 6, 1, 2

变成:

Bin1: 5, 3, 2, 1 # Decending order
Bin2: 1, 2, 3, 6 # Ascending order

2.4.改进的 BinItem 加载代码

通过使用变体数组改进了读取“Run”表上的输入 Bin Item 列表并将其加载到内存中的代码。

关于如何使用Variant数组,请参考这篇文章。

VBA 编码模式:范围循环读取

2.5.如果 Bin Item Name 中有重复项,则会通过重复列表消息框进行通知,并停止执行。

在之前的版本中,如果Bin Item Name有重复,则会被忽略并继续。在这个版本中,改为区分大小写字母,并改为检查输入数据是否有重复,通知内容,然后停止执行。您可以删除重复项或更改它们,以便它们不再重复并再次运行。


Bin Packing 工具使用频率不高,但似乎每年至少使用 4-5 次。有时它对我有很大的帮助。如果您有任何疑问,请在评论中留下。


<< 相关文章列表 >>

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文