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

📄 form4.frm

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