📄 form4.frm
字号:
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
DoEvents
Loop
'计算效率
CON_EFF = Bales_V / CON_V
Print #1, "PRO_EFF=|" + CStr(CON_EFF) + "| CON_N=" + CStr(CON_N)
End Function
'充填剩余空间
Private Sub Respace(ByVal CON_I_N As String, ByVal CON_NS As Integer, ByVal S_type As Integer, x_max, y_max, z_max, snums, Index, SStart_X, SStart_Y, SStart_Z)
'================定义变量===================
Dim WFace_X, WFace_Y, WFace_Z As Double
Dim Bales_X, Bales_Y, Bales_Z As Double '货物的尺寸
Dim TempIndex, Bales_N, Bales_Whirl As Integer
Dim Bales_Index As String
Dim I As Integer
'工作面起点坐标
Dim Re_X1, Re_Y1, Re_Z1, Re_X2, Re_Y2, Re_Z2, Re_X3, Re_Y3, Re_Z3 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 As Double '剩余空间起点坐标
Dim W_Z_N, W_Y_N, W_Z_CON, Can_Count As Integer
'===========================================
TempIndex = 0
WFace_Y = y_max
WFace_Z = z_max
WFace_X = x_max
'选择箱子先进行装载
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(i, 0) = 0 And
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)
Bales_Whirl = 0
'缓冲器调节长度
'If Bales_X > WFace_X And Bales_X < WFace_X + 100 And dt_x = False Then
' dt_x = True
' WFace_X = WFace_X + 100
' TempIndex = I
' Exit For
'Else
If 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 Then
' dt_x = True
' WFace_X = WFace_X + 100
' TempIndex = I
' Exit For
'Else
If Bales_X < WFace_X Then
TempIndex = I
Exit For
End If
End If
Next I
End If
If TempIndex = 0 Then Exit Sub
'宽度方向上可装入的数量
W_Y_N = Int(WFace_Y / Bales_Y)
'垂直方向上可装入的数量
W_Z_N = Int(WFace_Z / Bales_Z)
'工作面可装入箱子的数量是否小于箱子总数
If W_Y_N * W_Z_N > Bales_N Then
Can_Count = Bales_N '已装载的箱子数
Else
Can_Count = W_Y_N * W_Z_N
End If
If (Can_Count Mod W_Y_N) > 0 Then '在Z方向需装载的行数
If Can_Count < W_Y_N Then
W_Z_CON = 1
Else
W_Z_CON = Int(Can_Count / W_Y_N) + 1
End If
Else
W_Z_CON = Int(Can_Count / W_Y_N)
End If
S_Start_X1 = SStart_X
S_Start_X2 = SStart_X
S_Start_X3 = SStart_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 = SStart_Y
S_Start_Y2 = SStart_Y + W_Y_N * Bales_Y
S_Start_Y3 = SStart_Y + W_Y_N * Bales_Y
S_Start_Z1 = SStart_Z + Bales_Z * W_Z_CON
S_Start_Z2 = SStart_Z
S_Start_Z3 = SStart_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 = SStart_Y
S_Start_Y2 = SStart_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Y3 = SStart_Y + Bales_Y * W_Y_N
S_Start_Z1 = SStart_Z + Bales_Z * W_Z_CON
S_Start_Z2 = SStart_Z + Bales_Z * (W_Z_CON - 1)
S_Start_Z3 = SStart_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 = SStart_Y
S_Start_Y2 = SStart_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Y3 = SStart_Y + (Can_Count Mod W_Y_N) * Bales_Y
S_Start_Z1 = SStart_Z + Bales_Z * W_Z_CON
S_Start_Z2 = SStart_Z
S_Start_Z3 = SStart_Z
End If
End If
'debugstr = "CON:" + CStr(CON_NS) + " SWF:" + CStr(Snums) + 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)
'计算装箱图
tempsstr = CStr(CON_NS) + "|" + CON_I_N + "|" + CStr(snums) + "|" + CStr(Index) + "|" + Bales_Index + "|" + CStr(bales(TempIndex, 1)) + "|" + CStr(Can_Count) + "|"
tempsstr = tempsstr + CStr(1) + "|" + CStr(W_Y_N) + "|" + CStr(W_Z_N) + "|" + CStr(SStart_X) + "|" + CStr(SStart_Y) + "|" + CStr(SStart_Z) + "|" + CStr(Bales_Whirl)
Print #1, tempsstr
'剩余空间充填
If S_type = 0 Then '采用深度搜索
Respace2 CON_I_N, CON_NS, S_type, Re_X1, Re_Y1, Re_Z1, snums, CStr(Index) + "1", S_Start_X1, S_Start_Y1, S_Start_Z1
Respace2 CON_I_N, CON_NS, S_type, Re_X2, Re_Y2, Re_Z2, snums, CStr(Index) + "2", S_Start_X2, S_Start_Y2, S_Start_Z2
Respace2 CON_I_N, CON_NS, S_type, Re_X3, Re_Y3, Re_Z3, snums, CStr(Index) + "3", S_Start_X3, S_Start_Y3, S_Start_Z3
Else '采用浅度搜索
Respace CON_I_N, CON_NS, S_type, Re_X1, Re_Y1, Re_Z1, snums, CStr(Index) + "1", S_Start_X1, S_Start_Y1, S_Start_Z1
Respace CON_I_N, CON_NS, S_type, Re_X2, Re_Y2, Re_Z2, snums, CStr(Index) + "2", S_Start_X2, S_Start_Y2, S_Start_Z2
Respace CON_I_N, CON_NS, S_type, Re_X3, Re_Y3, Re_Z3, snums, CStr(Index) + "3", S_Start_X3, S_Start_Y3, S_Start_Z3
End If
End Sub
Private Sub Respace2(ByVal CON_I_N As String, ByVal CON_NS As Integer, ByVal S_type As Integer, x_max, y_max, z_max, snums, Index, SStart_X, SStart_Y, SStart_Z)
'================定义变量===================
Dim WFace_X, WFace_Y, WFace_Z As Double
Dim Bales_X, Bales_Y, Bales_Z As Double '货物的尺寸
Dim TempIndex, Bales_N, Bales_Whirl As Integer
Dim Bales_Index As String
Dim I As Integer
'工作面起点坐标
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
'===========================================
TempIndex = 0
WFace_Y = y_max
WFace_Z = z_max
WFace_X = x_max
'选择箱子先进行装载
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(i, 0) = 0 And
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)
Bales_Whirl = 0
'缓冲器调节长度
'If Bales_X > WFace_X And Bales_X < WFace_X + 100 And dt_x = False Then
' dt_x = True
' WFace_X = WFace_X + 100
' TempIndex = I
' Exit For
'Else
If 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 Then
' dt_x = True
' WFace_X = WFace_X + 100
' TempIndex = I
' Exit For
'Else
If Bales_X < WFace_X Then
TempIndex = I
Exit For
End If
End If
Next I
End If
If TempIndex = 0 Then Exit Sub
'宽度方向上可装入的数量
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
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 = SStart_X
S_Start_X2 = SStart_X
S_Start_X3 = 0
S_Start_X4 = 0
S_Start_Y1 = SStart_Y
S_Start_Y2 = SStart_Y + Bales_Y * W_Y_N
S_Start_Y3 = 0
S_Start_Y4 = 0
S_Start_Z1 = SStart_Z + Bales_Z * W_Z_N
S_Start_Z2 = SStart_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 = SStart_X
S_Start_X2 = SStart_X
S_Start_Y1 = SStart_Y
S_Start_Y2 = SStart_Y + Bales_Y * W_Y_N
S_Start_Z1 = SStart_Z + Bales_Z * W_Z_N
S_Start_Z2 = SStart_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 = SStart_X + Bales_X * (W_X_CON - 1)
S_Start_X4 = SStart_X + Bales_X * (W_X_CON - 1)
S_Start_Y3 = SStart_Y
S_Start_Y4 = SStart_Y + Bales_Y * ((Can_Count Mod (W_Y_N * W_Z_N)) Mod W_Y_N)
S_Start_Z3 = SStart_Z + Bales_Z * (Int((Can_Count Mod (W_Y_N * W_Z_N)) / W_Y_N) + 1)
S_Start_Z4 = SStart_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 = SStart_X + Bales_X * (W_X_CON - 1)
S_Start_X4 = 0
S_Start_Y3 = SStart_Y
S_Start_Y4 = 0
S_Start_Z3 = SStart_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)
tempsstr = CStr(CON_NS) + "|" + CON_I_N + "|" + CStr(snums) + "|" + CStr(Index) + "|" + Bales_Index + "|" + CStr(bales(TempIndex, 1)) + "|" + CStr(Can_Count) + "|"
tempsstr = tempsstr + CStr(W_X_CON) + "|" + CStr(W_Y_N) + "|" + CStr(W_Z_N) + "|" + CStr(SStart_X) + "|" + CStr(SStart_Y) + "|" + CStr(SStart_Z) + "|" + CStr(Bales_Whirl)
Print #1, tempsstr
'剩余空间充填
If S_type = 0 Then '采用深度搜索
Respace2 CON_I_N, CON_NS, S_type, Re_X1, Re_Y1, Re_Z1, snums, CStr(Index) + "1", S_Start_X1, S_Start_Y1, S_Start_Z1
Respace2 CON_I_N, CON_NS, S_type, Re_X2, Re_Y2, Re_Z2, snums, CStr(Index) + "2", S_Start_X2, S_Start_Y2, S_Start_Z2
Respace2 CON_I_N, CON_NS, S_type, Re_X3, Re_Y3, Re_Z3, snums, CStr(Index) + "3", S_Start_X3, S_Start_Y3, S_Start_Z3
Respace2 CON_I_N, CON_NS, S_type, Re_X4, Re_Y4, Re_Z4, snums, CStr(Index) + "4", S_Start_X4, S_Start_Y4, S_Start_Z4
Else '采用浅度搜索
Respace CON_I_N, CON_NS, S_type, Re_X1, Re_Y1, Re_Z1, snums, CStr(Index) + "1", S_Start_X1, S_Start_Y1, S_Start_Z1
Respace CON_I_N, CON_NS, S_type, Re_X2, Re_Y2, Re_Z2, snums, CStr(Index) + "2", S_Start_X2, S_Start_Y2, S_Start_Z2
Respace CON_I_N, CON_NS, S_type, Re_X3, Re_Y3, Re_Z3, snums, CStr(Index) + "3", S_Start_X3, S_Start_Y3, S_Start_Z3
Respace CON_I_N, CON_NS, S_type, Re_X4, Re_Y4, Re_Z4, snums, CStr(Index) + "4", S_Start_X4, S_Start_Y4, S_Start_Z4
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -