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; }
//---------------------------------------------------------------------------- // 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); }
/// <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; } } } } } }
///---------------------------------------------------------------------------- /// 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); }