示例#1
0
        private void Initialize()
        {
            total_box_volume = 0;
            foreach (BoxInfo bi in boxList)
            {
                total_box_volume += bi.Vol;
            }

            scrapfirst           = new Scrappad();
            best_solution_volume = 0;
            number_of_iterations = 0;
        }
示例#2
0
        //----------------------------------------------------------------------------
        // FINDS THE FIRST TO BE PACKED GAP IN THE LAYER EDGE
        //----------------------------------------------------------------------------
        private Scrappad Find_smallest_z()
        {
            Scrappad scrapmemb = scrapfirst;
            Scrappad sz        = scrapfirst;

            while (null != scrapmemb.next)
            {
                if (scrapmemb.next.Cumz < sz.Cumz)
                {
                    sz = scrapmemb.next;
                }
                scrapmemb = scrapmemb.next;
            }
            return(sz);
        }
示例#3
0
 /// <summary>
 /// AFTER FINDING EACH BOX, THE CANDIDATE BOXES AND THE CONDITION OF THE LAYER
 /// ARE EXAMINED
 /// </summary>
 private void CheckFound(
     ref int cboxi, ref int cboxx, ref int cboxy, ref int cboxz
     , int boxi, int boxx, int boxy, int boxz
     , int bboxi, int bboxx, int bboxy, int bboxz)
 {
     evened = false;
     if (boxi > 0)
     {
         cboxi = boxi;
         cboxx = boxx;
         cboxy = boxy;
         cboxz = boxz;
     }
     else
     {
         if ((bboxi > 0) && (layerinlayer > 0 || (null == smallestz.prev && null == smallestz.next)))
         {
             if (layerinlayer == 0.0)
             {
                 prelayer = layerThickness;
                 lilz     = smallestz.Cumz;
             }
             cboxi          = bboxi;
             cboxx          = bboxx;
             cboxy          = bboxy;
             cboxz          = bboxz;
             layerinlayer   = layerinlayer + bboxy - layerThickness;
             layerThickness = bboxy;
         }
         else
         {
             if (null == smallestz.prev && null == smallestz.next)
             {
                 layerdone = true;
             }
             else
             {
                 evened = true;
                 if (null == smallestz.prev)
                 {
                     trash          = smallestz.next;
                     smallestz.Cumx = smallestz.next.Cumx;
                     smallestz.Cumz = smallestz.next.Cumz;
                     smallestz.next = smallestz.next.next;
                     if (null != smallestz.next)
                     {
                         smallestz.next.prev = smallestz;
                     }
                     trash = null;
                 }
                 else if (null == smallestz.next)
                 {
                     smallestz.prev.next = null;
                     smallestz.prev.Cumx = smallestz.Cumx;
                     smallestz           = null;
                 }
                 else
                 {
                     if (smallestz.prev.Cumz == smallestz.next.Cumz)
                     {
                         smallestz.prev.next = smallestz.next.next;
                         if (null != smallestz.next.next)
                         {
                             smallestz.next.next.prev = smallestz.prev;
                         }
                         smallestz.prev.Cumx = smallestz.next.Cumx;
                         smallestz.next      = null;
                         smallestz           = null;
                     }
                     else
                     {
                         smallestz.prev.next = smallestz.next;
                         smallestz.next.prev = smallestz.prev;
                         if (smallestz.prev.Cumz < smallestz.next.Cumz)
                         {
                             smallestz.prev.Cumx = smallestz.Cumx;
                         }
                         smallestz = null;
                     }
                 }
             }
         }
     }
 }
示例#4
0
        ///----------------------------------------------------------------------------
        /// PACKS THE BOXES FOUND AND ARRANGES ALL VARIABLES AND RECORDS PROPERLY
        ///----------------------------------------------------------------------------
        private bool Pack_layer(bool packingbest, ref bool hundredpercent)
        {
            if (0 == layerThickness)
            {
                packing = false;
                return(false);
            }

            scrapfirst = new Scrappad()
            {
                Cumx = pallet.Pallet_x,
                Cumz = 0
            };
            int cboxi = 0, cboxx = 0, cboxy = 0, cboxz = 0;

            while (true)
            {
                smallestz = Find_smallest_z();

                if (null == smallestz.prev && null == smallestz.next)
                {
                    //*** SITUATION-1: NO BOXES ON THE RIGHT AND LEFT SIDES ***
                    int lenx = smallestz.Cumx;
                    int lpz  = remainpz - smallestz.Cumz;
                    Find_box(lenx, layerThickness, remainpy, lpz, lpz,
                             ref cboxi, ref cboxx, ref cboxy, ref cboxz);

                    if (layerdone)
                    {
                        break;
                    }
                    if (evened)
                    {
                        continue;
                    }

                    BoxInfo bi = boxList[cboxi];
                    boxList[cboxi].Cox = 0;
                    boxList[cboxi].Coy = packedy;
                    boxList[cboxi].Coz = smallestz.Cumz;
                    if (cboxx == smallestz.Cumx)
                    {
                        smallestz.Cumz = smallestz.Cumz + cboxz;
                    }
                    else
                    {
                        smallestz.next      = new Scrappad();
                        smallestz.next.prev = smallestz;
                        smallestz.next.Cumx = smallestz.Cumx;
                        smallestz.next.Cumz = smallestz.Cumz;
                        smallestz.Cumx      = cboxx;
                        smallestz.Cumz      = smallestz.Cumz + cboxz;
                    }
                    VolumeCheck(cboxi, cboxx, cboxy, cboxz, packingbest, ref hundredpercent);
                }
                else if (null == smallestz.prev)
                {
                    //*** SITUATION-2: NO BOXES ON THE LEFT SIDE ***
                    int lenx = smallestz.Cumx;
                    int lenz = smallestz.next.Cumz - smallestz.Cumz;
                    int lpz  = remainpz - smallestz.Cumz;
                    Find_box(lenx, layerThickness, remainpy, lenz, lpz
                             , ref cboxi, ref cboxx, ref cboxy, ref cboxz);

                    if (layerdone)
                    {
                        break;
                    }
                    if (evened)
                    {
                        continue;
                    }

                    BoxInfo bi = boxList[cboxi];
                    bi.Coy = packedy;
                    bi.Coz = smallestz.Cumz;
                    if (cboxx == smallestz.Cumx)
                    {
                        bi.Cox = 0;
                        if (smallestz.Cumz + cboxz == smallestz.next.Cumz)
                        {
                            smallestz.Cumz = smallestz.next.Cumz;
                            smallestz.Cumx = smallestz.next.Cumx;
                            trash          = smallestz.next;
                            smallestz.next = smallestz.next.next;
                            if (null != smallestz.next)
                            {
                                smallestz.next.prev = smallestz;
                            }
                        }
                        else
                        {
                            smallestz.Cumz = smallestz.Cumz + cboxz;
                        }
                    }
                    else
                    {
                        bi     = boxList[cboxi];
                        bi.Cox = smallestz.Cumx - cboxx;
                        if (smallestz.Cumz + cboxz == smallestz.next.Cumz)
                        {
                            smallestz.Cumx = smallestz.Cumx - cboxx;
                        }
                        else
                        {
                            smallestz.next.prev      = new Scrappad();
                            smallestz.next.prev.next = smallestz.next;
                            smallestz.next.prev.prev = smallestz;
                            smallestz.next           = smallestz.next.prev;
                            smallestz.next.Cumx      = smallestz.Cumx;
                            smallestz.Cumx           = smallestz.Cumx - cboxx;
                            smallestz.next.Cumz      = smallestz.Cumz + cboxz;
                        }
                    }
                    VolumeCheck(cboxi, cboxx, cboxy, cboxz, packingbest, ref hundredpercent);
                }
                else if (null == smallestz.next)
                {
                    //*** SITUATION-3: NO BOXES ON THE RIGHT SIDE ***
                    int lenx = smallestz.Cumx - smallestz.prev.Cumx;
                    int lenz = smallestz.prev.Cumz - smallestz.Cumz;
                    int lpz  = remainpz - smallestz.Cumz;
                    Find_box(lenx, layerThickness, remainpy, lenz, lpz
                             , ref cboxi, ref cboxx, ref cboxy, ref cboxz);

                    if (layerdone)
                    {
                        break;
                    }
                    if (evened)
                    {
                        continue;
                    }

                    BoxInfo bi = boxList[cboxi];
                    bi.Coy = packedy;
                    bi.Coz = smallestz.Cumz;
                    bi.Cox = smallestz.prev.Cumx;

                    if (cboxx == smallestz.Cumx - smallestz.prev.Cumx)
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.Cumx;
                            smallestz.prev.next = null;
                        }
                        else
                        {
                            smallestz.Cumz = smallestz.Cumz + cboxz;
                        }
                    }
                    else
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.prev.Cumx + cboxx;
                        }
                        else
                        {
                            smallestz.prev.next      = new Scrappad();
                            smallestz.prev.next.prev = smallestz.prev;
                            smallestz.prev.next.next = smallestz;
                            smallestz.prev           = smallestz.prev.next;
                            smallestz.prev.Cumx      = smallestz.prev.prev.Cumx + cboxx;
                            smallestz.prev.Cumz      = smallestz.Cumz + cboxz;
                        }
                    }
                    VolumeCheck(cboxi, cboxx, cboxy, cboxz, packingbest, ref hundredpercent);
                }
                else if (smallestz.prev.Cumz == smallestz.next.Cumz)
                {
                    //*** SITUATION-4: THERE ARE BOXES ON BOTH OF THE SIDES ***
                    //*** SUBSITUATION-4A: SIDES ARE EQUAL TO EACH OTHER ***
                    int lenx = smallestz.Cumx - smallestz.prev.Cumx;
                    int lenz = smallestz.prev.Cumz - smallestz.Cumz;
                    int lpz  = remainpz - smallestz.Cumz;
                    Find_box(lenx, layerThickness, remainpy, lenz, lpz
                             , ref cboxi, ref cboxx, ref cboxy, ref cboxz);

                    if (layerdone)
                    {
                        break;
                    }
                    if (evened)
                    {
                        continue;
                    }

                    boxList[cboxi].Coy = packedy;
                    boxList[cboxi].Coz = smallestz.Cumz;
                    if (cboxx == smallestz.Cumx - smallestz.prev.Cumx)
                    {
                        boxList[cboxi].Cox = smallestz.prev.Cumx;
                        if (smallestz.Cumz + cboxz == smallestz.next.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.next.Cumx;
                            if (null != smallestz.next.next)
                            {
                                smallestz.prev.next      = smallestz.next.next;
                                smallestz.next.next.prev = smallestz.prev;
                            }
                            else
                            {
                                smallestz.prev.next = null;
                            }
                        }
                        else
                        {
                            smallestz.Cumz = smallestz.Cumz + cboxz;
                        }
                    }
                    else if (smallestz.prev.Cumx < pallet.Pallet_x - smallestz.Cumx)
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.Cumx     = smallestz.Cumx - cboxx;
                            boxList[cboxi].Cox = smallestz.Cumx - cboxx;
                        }
                        else
                        {
                            boxList[cboxi].Cox       = smallestz.prev.Cumx;
                            smallestz.prev.next      = new Scrappad();
                            smallestz.prev.next.prev = smallestz.prev;
                            smallestz.prev.next.next = smallestz;
                            smallestz.prev           = smallestz.prev.next;
                            smallestz.prev.Cumx      = smallestz.prev.prev.Cumx + cboxx;
                            smallestz.prev.Cumz      = smallestz.Cumz + cboxz;
                        }
                    }
                    else
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.prev.Cumx + cboxx;
                            boxList[cboxi].Cox  = smallestz.prev.Cumx;
                        }
                        else
                        {
                            boxList[cboxi].Cox       = smallestz.Cumx - cboxx;
                            smallestz.next.prev      = new Scrappad();
                            smallestz.next.prev.next = smallestz.next;
                            smallestz.next.prev.prev = smallestz;
                            smallestz.next           = smallestz.next.prev;
                            smallestz.next.Cumx      = smallestz.Cumx;
                            smallestz.next.Cumz      = smallestz.Cumz + cboxz;
                            smallestz.Cumx           = smallestz.Cumx - cboxx;
                        }
                    }
                    VolumeCheck(cboxi, cboxx, cboxy, cboxz, packingbest, ref hundredpercent);
                }
                else
                {
                    //*** SUBSITUATION-4B: SIDES ARE NOT EQUAL TO EACH OTHER ***
                    //*** SUBSITUATION-4B: SIDES ARE NOT EQUAL TO EACH OTHER ***
                    int lenx = smallestz.Cumx - smallestz.prev.Cumx;
                    int lenz = smallestz.prev.Cumz - smallestz.Cumz;
                    int lpz  = remainpz - smallestz.Cumz;
                    Find_box(lenx, layerThickness, remainpy, lenz, lpz
                             , ref cboxi, ref cboxx, ref cboxy, ref cboxz);

                    if (layerdone)
                    {
                        break;
                    }
                    if (evened)
                    {
                        continue;
                    }

                    boxList[cboxi].Coy = packedy;
                    boxList[cboxi].Coz = smallestz.Cumz;
                    boxList[cboxi].Cox = smallestz.prev.Cumx;
                    if (cboxx == smallestz.Cumx - smallestz.prev.Cumx)
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.Cumx;
                            smallestz.prev.next = smallestz.next;
                            smallestz.next.prev = smallestz.prev;
                        }
                        else
                        {
                            smallestz.Cumz = smallestz.Cumz + cboxz;
                        }
                    }
                    else
                    {
                        if (smallestz.Cumz + cboxz == smallestz.prev.Cumz)
                        {
                            smallestz.prev.Cumx = smallestz.prev.Cumx + cboxx;
                        }
                        else if (smallestz.Cumz + cboxz == smallestz.next.Cumz)
                        {
                            boxList[cboxi].Cox = smallestz.Cumx - cboxx;
                            smallestz.Cumx     = smallestz.Cumx - cboxx;
                        }
                        else
                        {
                            smallestz.prev.next      = new Scrappad();
                            smallestz.prev.next.prev = smallestz.prev;
                            smallestz.prev.next.next = smallestz;
                            smallestz.prev           = smallestz.prev.next;
                            smallestz.prev.Cumx      = smallestz.prev.prev.Cumx + cboxx;
                            smallestz.prev.Cumz      = smallestz.Cumz + cboxz;
                        }
                    }
                    VolumeCheck(cboxi, cboxx, cboxy, cboxz, packingbest, ref hundredpercent);
                }
            }
            return(true);
        }