⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 form4.frm

📁 集装箱的装箱问题 给定一个集装箱
💻 FRM
📖 第 1 页 / 共 4 页
字号:
            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 + -