微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否有适用于此处的 Bin 打包算法的变体?

如何解决是否有适用于此处的 Bin 打包算法的变体?

假设您将一个装有物品的板条箱堆叠在一起,其中板条箱中的每件物品的尺寸都相同,物品不能倾斜,因此所有物品都是直立的,物品位于单层中。

现在我的目标是拥有一个板条箱选择器,用户可以在其中输入采购订单中的物品和物品数量,然后收到一个报告,告诉用户选择哪个板条箱来包装物品。

例如

Input: 
    24 x Item 199111
Output:
    Option 1: 2 x crate #1 with 12 item 199111 per crate
    Option 2: 1 x Crate #3 with 24 item 199111 per crate 

我目前已经用这些表创建了一个 Microsoft Access 数据库

  • tblCrateInfo(包含可用板条箱的板条箱尺寸)
  • tblItemInfo(包含可供用户选择的要包装的物品尺寸和重量)

我还有一个表单,用户可以在创建新项目时添加它们。 我们只有 30 种规格的板条箱和 200 种物品可供挑选。

我的问题是我可以使用哪些访问工具来实现这一目标,或者我可以阅读任何书籍来找出答案。我的主要困难是检查每个板条箱中可以装多少件物品。

解决方法

我将使用基于公共函数计算字段的查询。访问查询设计器可以使用公开可用的函数。因此,我们可以创建函数来处理关于我们需要多少创建以及每个组合项目数量、包装安排和板条箱类型的这些板条箱的总成本的数学计算。

enter image description here

计算的变量细节和公共函数的调用位置

CratesNeeded: CratesNeededforOrder([tblItemInfo]![ItemLength],[tblItemInfo]![ItemWidth],[tblCrateInfo]![CrateLength],[tblCrateInfo]![CrateWidth],[tblOrderInfo]![ItemQuantity])

Cost: Cost([ItemLength],[ItemWidth],[CrateLength],[CrateWidth],[ItemQuantity],[CrateCost])

注意行中的计算字段 CratesNeeded 可以访问该行的 ItemLength 值。

要添加数据库的公共功能,请转到功能区的设计选项卡并添加代码模块,通常在最右侧。然后在代码模块中添加公共函数:

'assume all items have an approximating rectangle and all items packed with the same orientation so crate length is divided by either item length or item width giving us only two packing arrangements
Public Function AtLeast1ItemFitsintoCrate(itemlength As Double,itemwidth As Double,cratelength As Double,cratewidth As Double) As Boolean
Dim temp As Double 'make sure length is equal or larger than width
If itemwidth > itemlength Then
temp = itemlength
itemlength = itemwidth
itemwidth = temp
End If
If cratewidth > cratelength Then
temp = cratelength
cratelength = cratewidth
cratewidth = temp
End If
If (itemlength <= cratelength) And (itemwidth <= cratewidth) Then
AtLeast1ItemFitsintoCrate = True
Else
AtLeast1ItemFitsintoCrate = False
End If
End Function
Public Function HowManyitemsWillFitinCrate(itemlength As Double,cratewidth As Double) As Integer
Dim itemsinpackingarrangement1 As Integer
Dim itemsinpackingarrangement2 As Integer
itemsinpackingarrangement1 = CInt(cratelength / itemlength) * CInt(cratewidth / itemwidth)
itemsinpackingarrangement2 = CInt(cratelength / itemwidth) * CInt(cratewidth / itemlength)
If itemsinpackingarrangement1 > itemsinpackingarrangement2 Then
HowManyitemsWillFitinCrate = itemsinpackingarrangement1
Else
HowManyitemsWillFitinCrate = itemsinpackingarrangement2
End If
End Function
Public Function CratesNeededforOrder(itemlength As Double,cratewidth As Double,itemquantity As Integer) As Integer
Dim itemspercrate As Integer
itemspercrate = HowManyitemsWillFitinCrate(itemlength,itemwidth,cratelength,cratewidth)
CratesNeededforOrder = Ceiling(itemquantity / itemspercrate)
End Function
Public Function Cost(itemlength As Double,itemquantity As Integer,cratecost As Currency) As Currency
'found technical annoyance that functions used in queries must avoid passing calculated fields as parameters,cratequantity must be calculated here when used for queries
Dim cratequantity As Integer
cratequantity = CratesNeededforOrder(itemlength,cratewidth,itemquantity)
Cost = cratequantity * cratecost
End Function
Public Function Ceiling(number As Double) As Integer
Ceiling = -Int(-number)
End Function

我忘记通过 AtLeast1ItemFitsintoCrate 过滤查询,所以我把它留作练习。当您获得更好的打包模型时,您可以修改支持成本函数的函数。通过枚举所有可能的情况并按成本排序来处理最小化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。