📄 form4.frm
字号:
W_Z_CON = Int(Can_Count / W_Y_N)
End If
S_Start_X1 = Start_X
S_Start_X2 = Start_X
S_Start_X3 = Start_X
If (Can_Count Mod W_Y_N) = 0 Then '无剩余空间2
Re_X1 = Bales_X
Re_X2 = 0
Re_X3 = Bales_X
Re_Y1 = W_Y_N * Bales_Y
Re_Y2 = 0
Re_Y3 = WFace_Y - Bales_Y * W_Y_N
Re_Z1 = WFace_Z - Bales_Z * W_Z_CON
Re_Z2 = 0
Re_Z3 = WFace_Z
S_Start_Y1 = Start_Y
S_Start_Y2 = Start_Y + W_Y_N * Bales_Y
S_Start_Y3 = Start_Y + W_Y_N * Bales_Y
S_Start_Z1 = Start_Z + Bales_Z * W_Z_CON
S_Start_Z2 = Start_Z
S_Start_Z3 = Start_Z
Else
If W_Z_CON > 1 Then
Re_X1 = Bales_X
Re_X2 = Bales_X
Re_X3 = Bales_X
Re_Y1 = (Can_Count Mod W_Y_N) * Bales_Y
Re_Y2 = (W_Y_N - (Can_Count Mod W_Y_N)) * Bales_Y
Re_Y3 = WFace_Y - Bales_Y * W_Y_N
Re_Z1 = WFace_Z - Bales_Z * W_Z_CON
Re_Z2 = WFace_Z - Bales_Z * (W_Z_CON - 1)
Re_Z3 = WFace_Z
S_Start_Y1 = Start_Y
S_Start_Y2 = Start_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Y3 = Start_Y + Bales_Y * W_Y_N
S_Start_Z1 = Start_Z + Bales_Z * W_Z_CON
S_Start_Z2 = Start_Z + Bales_Z * (W_Z_CON - 1)
S_Start_Z3 = Start_Z
Else '无剩余空间3
Re_X1 = Bales_X
Re_X2 = Bales_X
RZ_X3 = 0
Re_Y1 = (Can_Count Mod W_Y_N) * Bales_Y
Re_Y2 = WFace_Y - (Can_Count Mod W_Y_N) * Bales_Y
Re_Y3 = 0
Re_Z1 = WFace_Z - Bales_Z * W_Z_CON
Re_Z2 = WFace_Z
Re_Z3 = 0
S_Start_Y1 = Start_Y
S_Start_Y2 = Start_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Y3 = Start_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Z1 = Start_Z + Bales_Z * W_Z_CON
S_Start_Z2 = Start_Z
S_Start_Z3 = Start_Z
End If
End If
'debugstr = "CON:" + CStr(CON_N) + " WF:" + CStr(SNum) + vbCrLf
'debugstr = debugstr + "RX1:" + CStr(Re_X1) + " RX2:" + CStr(Re_X2) + " RX3:" + CStr(Re_X3) + vbCrLf
'debugstr = debugstr + "RY1:" + CStr(Re_Y1) + " RY2:" + CStr(Re_Y2) + " RY3:" + CStr(Re_Y3) + vbCrLf
'debugstr = debugstr + "RZ1:" + CStr(Re_Z1) + " RZ2:" + CStr(Re_Z2) + " RZ3:" + CStr(Re_Z3) + vbCrLf
'debugstr = debugstr + "SX1:" + CStr(S_Start_X1) + " SX2:" + CStr(S_Start_X2) + " SX3:" + CStr(S_Start_X3) + vbCrLf
'debugstr = debugstr + "SY1:" + CStr(S_Start_Y1) + " SY2:" + CStr(S_Start_Y2) + " SY3:" + CStr(S_Start_Y3) + vbCrLf
'debugstr = debugstr + "SZ1:" + CStr(S_Start_Z1) + " SZ2:" + CStr(S_Start_Z2) + " SZ3:" + CStr(S_Start_Z3) + vbCrLf
'debugstr = debugstr + "WY:" + CStr(W_Y_N) + " WZ:" + CStr(W_Z_N) + " WC:" + CStr(Can_Count) + vbCrLf
'Print #2, debugstr
bales(TempIndex, 0) = "1"
bales(TempIndex, 7) = CStr(CInt(bales(TempIndex, 7)) - Can_Count)
SMax_X = SMax_X - Bales_X '剩余长度方向可用尺寸
'计算装箱图
'第N个容器|容器在LISTVIEW中索引|工作面编号|子工作面编号|货物再LISTVIEW中索引
'|货物名称|装载的货物数量|X方向可装载的数量|Y方向可装载的数量|Z方向可装载的数量
'|起点X坐标|起点Y坐标|起点Z坐标|是否水平旋转
tempsstr = CStr(CON_N) + "|" + Con_Index_Num + "|" + CStr(SNum) + "|" + CStr("0") + "|" + Bales_Index + "|" + CStr(bales(TempIndex, 1)) + "|" + CStr(Can_Count) + "|"
tempsstr = tempsstr + CStr(1) + "|" + CStr(W_Y_N) + "|" + CStr(W_Z_N) + "|" + CStr(Start_X) + "|" + CStr(Start_Y) + "|" + CStr(Start_Z) + "|" + CStr(Bales_Whirl)
Print #1, tempsstr 'Debug.Print "中间参数 " + CStr(snum) + " " + CStr(S_type)
'Debug.Print "浅度搜索 打印工作面装箱列表"
'剩余空间充填
If S_type = 0 Then '采用深度搜索
'Debug.Print "浅度搜索 剩余深度搜索"
Respace2 Con_Index_Num, CON_N, S_type, Re_X1, Re_Y1, Re_Z1, SNum, 1, S_Start_X1, S_Start_Y1, S_Start_Z1
Respace2 Con_Index_Num, CON_N, S_type, Re_X2, Re_Y2, Re_Z2, SNum, 2, S_Start_X2, S_Start_Y2, S_Start_Z2
Respace2 Con_Index_Num, CON_N, S_type, Re_X3, Re_Y3, Re_Z3, SNum, 3, S_Start_X3, S_Start_Y3, S_Start_Z3
Else '采用浅度搜索
'Debug.Print "浅度搜索 剩余浅度搜索"
Respace Con_Index_Num, CON_N, S_type, Re_X1, Re_Y1, Re_Z1, SNum, 1, S_Start_X1, S_Start_Y1, S_Start_Z1
Respace Con_Index_Num, CON_N, S_type, Re_X2, Re_Y2, Re_Z2, SNum, 2, S_Start_X2, S_Start_Y2, S_Start_Z2
Respace Con_Index_Num, CON_N, S_type, Re_X3, Re_Y3, Re_Z3, SNum, 3, S_Start_X3, S_Start_Y3, S_Start_Z3
End If
'下一工作面起点坐标
Start_X = Start_X + Bales_X
Start_Y = 0
Start_Z = 0
DoEvents
Loop
If T_Flag_Ok = 1 Then
CON_V = CON_V + (containers(C_index, 2) - SMax_X) * containers(C_index, 3) * containers(C_index, 4)
Exit Do
Else
CON_N = CON_N + 1
If dt_x = False Then
CON_V = CON_V + containers(C_index, 2) * containers(C_index, 3) * containers(C_index, 4)
Else
CON_V = CON_V + (containers(C_index, 2) + 100) * containers(C_index, 3) * containers(C_index, 4) '利用了缓冲器后的容器体积
End If
End If
Loop
'计算效率
CON_EFF = Bales_V / CON_V
Print #1, "PRO_EFF=|" + CStr(CON_EFF) + "| CON_N=" + CStr(CON_N)
End Function
'大工作面
Private Function Tests2(ByVal S_type As Integer, ByVal C_index As Integer) As Boolean
'S_type 剩余空间搜索策略, C_index 容器在容器数组中的索引
'================定义变量===================
Dim Max_X, Max_Y, Max_Z, WFace_X, WFace_Y, WFace_Z, CON_V, Bales_V, CON_EFF As Double
Dim Bales_X, Bales_Y, Bales_Z As Double '货物的尺寸
Dim CON_N, T_Flag_Ok, SNum, TempIndex, TempsIndexs, Bales_N, Bales_Whirl As Integer
Dim Con_Index_Num, Bales_Index As String
Dim I As Integer
Dim Start_X, Start_Y, Start_Z, SMax_X As Double
'工作面起点坐标
Dim Re_X1, Re_Y1, Re_Z1, Re_X2, Re_Y2, Re_Z2, Re_X3, Re_Y3, Re_Z3, Re_X4, Re_Y4, Re_Z4 As Double '当前工作面剩余空间的尺寸
Dim S_Start_X1, S_Start_Y1, S_Start_Z1, S_Start_X2, S_Start_Y2, S_Start_Z2, S_Start_X3, S_Start_Y3, S_Start_Z3, S_Start_X4, S_Start_Y4, S_Start_Z4 As Double '剩余空间起点坐标
Dim W_Z_N, W_Y_N, W_X_N, W_X_CON, Can_Count As Integer
'===========================================
'================初始化参数=================
'读容器尺寸
Max_X = CDbl(containers(C_index, 2))
Max_Y = CDbl(containers(C_index, 3))
Max_Z = CDbl(containers(C_index, 4))
Con_Index_Num = containers(C_index, 7) '容器在LISTVIEW2中的LISTITEM编号
CON_V = 0 '容器总体积
CON_N = 1 '使用的容器数量
T_Flag_Ok = 0 '装载完毕标志 0 未完成 1完成
Bales_V = 0 '货物总体积
'读取货物总体积
For I = 1 To UBound(bales, 1)
Bales_V = Bales_V + CDbl(bales(I, 5)) * CInt(bales(I, 7))
Next I
'===========================================
'================开始装箱计算===============
Do '容器循环
SNum = 0 '工作面编号
'当前工作面起点坐标
Start_X = 0
Start_Y = 0
Start_Z = 0
dt_x = False
'设置工作空间最大尺寸等于容器尺寸
WFace_X = Max_X
WFace_Y = Max_Y
WFace_Z = Max_Z
SMax_X = Max_X ' X方向上可用的最大尺寸
'工作面循环开始
Do
'设置参数
TempIndex = 0 '选择的货物在货物数组中的索引
'设置当前工作面可用空间尺寸
WFace_Y = Max_Y
WFace_Z = Max_Z
WFace_X = SMax_X
'选择箱子先进行装载
For I = 1 To UBound(bales, 1) '遍历货物数组搜寻可以放入工作面空间的货物
If CInt(bales(I, 7)) > 0 And CDbl(bales(I, 3)) < WFace_Y And CDbl(bales(I, 4)) < WFace_Z Then '是否可装载,并且剩余数量大于0
'选中进行装箱的货物的尺寸
Bales_X = CDbl(bales(I, 2))
Bales_Y = CDbl(bales(I, 3))
Bales_Z = CDbl(bales(I, 4))
'选中进行装箱的货物数量
Bales_N = CInt(bales(I, 7))
Bales_Index = bales(I, 8) '选中的货物在LISTVIEW3中的LISTITEM编号
Bales_Whirl = 0 '设置货物是否水平旋转标志 0 未旋转 1 旋转90度 Bales_X、Bales_Y互换
'缓冲器调节长度
'如果货物长度大于工作面可用长度但小于工作面可用长度加缓冲器的长度
If Bales_X > WFace_X And Bales_X < WFace_X + 100 And dt_x = False And hc Then 'New Code
dt_x = True '缓冲器已使用
WFace_X = WFace_X + 100 '设置工作面可用长度等于工作面可用长度加缓冲器长度
TempIndex = I '设置货物在货物数组中的索引编号
Exit For '退出选择货物循环
ElseIf Bales_X < WFace_X Then '货物长度小于工作面可用长度
TempIndex = I
Exit For
End If
End If
Next I
'如果没有合适装载尺寸的货物,货物水平旋转
If TempIndex = 0 Then
For I = 1 To UBound(bales, 1)
If CInt(bales(I, 7)) > 0 And CDbl(bales(I, 2)) < WFace_Y And CDbl(bales(I, 4)) < WFace_Z Then '是否未装载,并且剩余数量大于0 Bales(i, 0) = 0 And
Bales_Y = CDbl(bales(I, 2))
Bales_X = CDbl(bales(I, 3))
Bales_Z = CDbl(bales(I, 4))
Bales_N = CInt(bales(I, 7))
Bales_Index = bales(I, 8)
Bales_Whirl = 1
'缓冲器调节长度
If Bales_X > WFace_X And Bales_X < WFace_X + 100 And dt_x = False And hc Then 'New Code
dt_x = True
WFace_X = WFace_X + 100
TempIndex = I
Exit For
ElseIf Bales_X < WFace_X Then
TempIndex = I
Exit For
End If
End If
Next I
End If
'如果还没有可装载的货物
If TempIndex = 0 Then
'判断是否装箱完成
TempsIndexs = 0
For I = 1 To UBound(bales, 1)
If CInt(bales(I, 7)) > 0 Then '是否未装载,并且剩余数量大于0 Bales(i, 0) = 0 And
TempsIndexs = I
Exit For
End If
Next I
If TempsIndexs = 0 Then
Tests2 = True '装箱成功
T_Flag_Ok = 1
Exit Do '装箱成功
Else
'当前容器剩余空间无法放下合适的箱子,使用下一个容器
Exit Do '退出工作面循环
End If
End If
SNum = SNum + 1 '设置工作面编号
'宽度方向上可装入的数量
W_Y_N = Int(WFace_Y / Bales_Y)
'垂直方向上可装入的数量
W_Z_N = Int(WFace_Z / Bales_Z)
'长度方向上可装入的数量
W_X_N = Int(WFace_X / Bales_X)
'工作面可装入箱子的数量是否小于箱子总数
If W_Y_N * W_Z_N * W_X_N > Bales_N Then
Can_Count = Bales_N
Else
Can_Count = W_Y_N * W_Z_N * W_X_N
End If
'情况1
If (Can_Count Mod (W_Y_N * W_Z_N)) = 0 Then
W_X_CON = Can_Count / (W_Y_N * W_Z_N)
Re_X1 = Bales_X * W_X_CON
Re_X2 = Bales_X * W_X_CON
Re_X3 = 0
Re_X4 = 0
Re_Y1 = Bales_Y * W_Y_N
Re_Y2 = WFace_Y - Bales_Y * W_Y_N
Re_Y3 = 0
Re_Y4 = 0
Re_Z1 = WFace_Z - Bales_Z * W_Z_N
Re_Z2 = WFace_Z
Re_Z3 = 0
Re_Z4 = 0
S_Start_X1 = Start_X
S_Start_X2 = Start_X
S_Start_X3 = 0
S_Start_X4 = 0
S_Start_Y1 = Start_Y
S_Start_Y2 = Start_Y + Bales_Y * W_Y_N
S_Start_Y3 = 0
S_Start_Y4 = 0
S_Start_Z1 = Start_Z + Bales_Z * W_Z_N
S_Start_Z2 = Start_Z
S_Start_Z3 = 0
S_Start_Z4 = 0
Else
W_X_CON = Int(Can_Count / (W_Y_N * W_Z_N)) + 1
Re_X1 = Bales_X * (W_X_CON - 1)
Re_X2 = Bales_X * W_X_CON
Re_Y1 = Bales_Y * W_Y_N
Re_Y2 = WFace_Y - Bales_Y * W_Y_N
Re_Z1 = WFace_Z - Bales_Z * W_Z_N
Re_Z2 = WFace_Z
'剩余空间起点坐标
S_Start_X1 = Start_X
S_Start_X2 = Start_X
S_Start_Y1 = Start_Y
S_Start_Y2 = Start_Y + Bales_Y * W_Y_N
S_Start_Z1 = Start_Z + Bales_Z * W_Z_N
S_Start_Z2 = Start_Z
If ((Can_Count Mod (W_Y_N * W_Z_N)) Mod W_Y_N) > 0 Then
Re_X3 = Bales_X
Re_X4 = Bales_X
Re_Y3 = Bales_Y * ((Can_Count Mod (W_Y_N * W_Z_N)) Mod W_Y_N)
Re_Y4 = Bales_Y * (W_Y_N - ((Can_Count Mod (W_Y_N * W_Z_N)) Mod W_Y_N))
Re_Z3 = WFace_Z - Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N) + 1)
Re_Z4 = WFace_Z - Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N))
S_Start_X3 = Start_X + Bales_X * (W_X_CON - 1)
S_Start_X4 = Start_X + Bales_X * (W_X_CON - 1)
S_Start_Y3 = Start_Y
S_Start_Y4 = Start_Y + Bales_Y * ((Can_Count Mod (W_Y_N * W_Z_N)) Mod W_Y_N)
S_Start_Z3 = Start_Z + Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N) + 1)
S_Start_Z4 = Start_Z + Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N))
Else
Re_X3 = Bales_X
Re_X4 = 0
Re_Y3 = Bales_Y * W_Y_N
Re_Y4 = 0
Re_Z3 = WFace_Z - Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N))
Re_Z4 = 0
S_Start_X3 = Start_X + Bales_X * (W_X_CON - 1)
S_Start_X4 = 0
S_Start_Y3 = Start_Y
S_Start_Y4 = 0
S_Start_Z3 = Start_Z + Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N))
S_Start_Z4 = 0
End If
End If
bales(TempIndex, 0) = "1"
bales(TempIndex, 7) = CStr(CInt(bales(TempIndex, 7)) - Can_Count)
SMax_X = SMax_X - Bales_X * W_X_CON '剩余长度方向可用尺寸
tempsstr = CStr(CON_N) + "|" + Con_Index_Num + "|" + CStr(SNum) + "|" + CStr("0") + "|" + Bales_Index + "|" + CStr(bales(TempIndex, 1)) + "|" + CStr(Can_Count) + "|"
tempsstr = tempsstr + CStr(W_X_CON) + "|" + CStr(W_Y_N) + "|" + CStr(W_Z_N) + "|" + CStr(Start_X) + "|" + CStr(Start_Y) + "|" + CStr(Start_Z) + "|" + CStr(Bales_Whirl)
Print #1, tempsstr
'剩余空间充填
If S_type = 0 Then '采用深度搜索
Respace2 Con_Index_Num, CON_N, S_type, Re_X1, Re_Y1, Re_Z1, SNum, 1, S_Start_X1, S_Start_Y1, S_Start_Z1
Respace2 Con_Index_Num, CON_N, S_type, Re_X2, Re_Y2, Re_Z2, SNum, 2, S_Start_X2, S_Start_Y2, S_Start_Z2
Respace2 Con_Index_Num, CON_N, S_type, Re_X3, Re_Y3, Re_Z3, SNum, 3, S_Start_X3, S_Start_Y3, S_Start_Z3
Respace2 Con_Index_Num, CON_N, S_type, Re_X4, Re_Y4, Re_Z4, SNum, 4, S_Start_X4, S_Start_Y4, S_Start_Z4
Else '采用浅度搜索
Respace Con_Index_Num, CON_N, S_type, Re_X1, Re_Y1, Re_Z1, SNum, 1, S_Start_X1, S_Start_Y1, S_Start_Z1
Respace Con_Index_Num, CON_N, S_type, Re_X2, Re_Y2, Re_Z2, SNum, 2, S_Start_X2, S_Start_Y2, S_Start_Z2
Respace Con_Index_Num, CON_N, S_type, Re_X3, Re_Y3, Re_Z3, SNum, 3, S_Start_X3, S_Start_Y3, S_Start_Z3
Respace Con_Index_Num, CON_N, S_type, Re_X4, Re_Y4, Re_Z4, SNum, 4, S_Start_X4, S_Start_Y4, S_Start_Z4
End If
'下一工作面起点坐标
Start_X = Start_X + Bales_X * W_X_CON
Start_Y = 0
Start_Z = 0
DoEvents
Loop
'Print #2, "TEMP 1"
If T_Flag_Ok = 1 Then
CON_V = CON_V + (containers(C_index, 2) - SMax_X) * containers(C_index, 3) * containers(C_index, 4)
Exit Do
Else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -