|
@@ -144,7 +144,7 @@ discard block |
|
|
block discarded – undo |
|
144
|
144
|
//Find best box of iteration, and remove packed items from unpacked list |
|
145
|
145
|
$bestBox = $packedBoxesIteration->top(); |
|
146
|
146
|
$unPackedItems = $this->items->asArray(); |
|
147
|
|
- foreach(clone $bestBox->getItems() as $packedItem) { |
|
|
147
|
+ foreach (clone $bestBox->getItems() as $packedItem) { |
|
148
|
148
|
foreach ($unPackedItems as $unpackedKey => $unpackedItem) { |
|
149
|
149
|
if ($packedItem === $unpackedItem) { |
|
150
|
150
|
unset($unPackedItems[$unpackedKey]); |
|
@@ -173,7 +173,7 @@ discard block |
|
|
block discarded – undo |
|
173
|
173
|
public function redistributeWeight(PackedBoxList $aPackedBoxes) { |
|
174
|
174
|
|
|
175
|
175
|
$targetWeight = $aPackedBoxes->getMeanWeight(); |
|
176
|
|
- $this->logger->log(LogLevel::DEBUG, "repacking for weight distribution, weight variance {$aPackedBoxes->getWeightVariance()}, target weight {$targetWeight}"); |
|
|
176
|
+ $this->logger->log(LogLevel::DEBUG, "repacking for weight distribution, weight variance {$aPackedBoxes->getWeightVariance()}, target weight {$targetWeight}"); |
|
177
|
177
|
|
|
178
|
178
|
$packedBoxes = new PackedBoxList; |
|
179
|
179
|
|
|
@@ -194,19 +194,19 @@ discard block |
|
|
block discarded – undo |
|
194
|
194
|
|
|
195
|
195
|
do { //Keep moving items from most overweight box to most underweight box |
|
196
|
196
|
$tryRepack = false; |
|
197
|
|
- $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: ' . count($underWeightBoxes) . '/' . count($overWeightBoxes)); |
|
|
197
|
+ $this->logger->log(LogLevel::DEBUG, 'boxes under/over target: ' . count($underWeightBoxes) . '/' . count($overWeightBoxes)); |
|
198
|
198
|
|
|
199
|
199
|
foreach ($underWeightBoxes as $u => $underWeightBox) { |
|
200
|
|
- $this->logger->log(LogLevel::DEBUG, 'Underweight Box ' . $u); |
|
|
200
|
+ $this->logger->log(LogLevel::DEBUG, 'Underweight Box ' . $u); |
|
201
|
201
|
foreach ($overWeightBoxes as $o => $overWeightBox) { |
|
202
|
|
- $this->logger->log(LogLevel::DEBUG, 'Overweight Box ' . $o); |
|
|
202
|
+ $this->logger->log(LogLevel::DEBUG, 'Overweight Box ' . $o); |
|
203
|
203
|
$overWeightBoxItems = $overWeightBox->getItems()->asArray(); |
|
204
|
204
|
|
|
205
|
205
|
//For each item in the heavier box, try and move it to the lighter one |
|
206
|
206
|
foreach ($overWeightBoxItems as $oi => $overWeightBoxItem) { |
|
207
|
|
- $this->logger->log(LogLevel::DEBUG, 'Overweight Item ' . $oi); |
|
|
207
|
+ $this->logger->log(LogLevel::DEBUG, 'Overweight Item ' . $oi); |
|
208
|
208
|
if ($underWeightBox->getWeight() + $overWeightBoxItem->getWeight() > $targetWeight) { |
|
209
|
|
- $this->logger->log(LogLevel::DEBUG, 'Skipping item for hindering weight distribution'); |
|
|
209
|
+ $this->logger->log(LogLevel::DEBUG, 'Skipping item for hindering weight distribution'); |
|
210
|
210
|
continue; //skip if moving this item would hinder rather than help weight distribution |
|
211
|
211
|
} |
|
212
|
212
|
|
|
@@ -216,21 +216,21 @@ discard block |
|
|
block discarded – undo |
|
216
|
216
|
$newLighterBoxPacker = new Packer(); //we may need a bigger box |
|
217
|
217
|
$newLighterBoxPacker->setBoxes($this->boxes); |
|
218
|
218
|
$newLighterBoxPacker->setItems($newItemsForLighterBox); |
|
219
|
|
- $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK LIGHTER BOX]"); |
|
|
219
|
+ $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK LIGHTER BOX]"); |
|
220
|
220
|
$newLighterBox = $newLighterBoxPacker->doVolumePacking()->extract(); |
|
221
|
221
|
|
|
222
|
222
|
if ($newLighterBox->getItems()->count() === $newItemsForLighterBox->count()) { //new item fits |
|
223
|
|
- $this->logger->log(LogLevel::DEBUG, 'New item fits'); |
|
|
223
|
+ $this->logger->log(LogLevel::DEBUG, 'New item fits'); |
|
224
|
224
|
unset($overWeightBoxItems[$oi]); //now packed in different box |
|
225
|
225
|
|
|
226
|
226
|
$newHeavierBoxPacker = new Packer(); //we may be able to use a smaller box |
|
227
|
227
|
$newHeavierBoxPacker->setBoxes($this->boxes); |
|
228
|
228
|
$newHeavierBoxPacker->setItems($overWeightBoxItems); |
|
229
|
229
|
|
|
230
|
|
- $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK HEAVIER BOX]"); |
|
|
230
|
+ $this->logger->log(LogLevel::INFO, "[ATTEMPTING TO PACK HEAVIER BOX]"); |
|
231
|
231
|
$newHeavierBoxes = $newHeavierBoxPacker->doVolumePacking(); |
|
232
|
232
|
if (count($newHeavierBoxes) > 1) { //found an edge case in packing algorithm that *increased* box count |
|
233
|
|
- $this->logger->log(LogLevel::INFO, "[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original"); |
|
|
233
|
+ $this->logger->log(LogLevel::INFO, "[REDISTRIBUTING WEIGHT] Abandoning redistribution, because new packing is less efficient than original"); |
|
234
|
234
|
return $aPackedBoxes; |
|
235
|
235
|
} |
|
236
|
236
|
|
|
@@ -262,7 +262,7 @@ discard block |
|
|
block discarded – undo |
|
262
|
262
|
* @return PackedBox packed box |
|
263
|
263
|
*/ |
|
264
|
264
|
public function packIntoBox(Box $aBox, ItemList $aItems) { |
|
265
|
|
- $this->logger->log(LogLevel::DEBUG, "[EVALUATING BOX] {$aBox->getReference()}"); |
|
|
265
|
+ $this->logger->log(LogLevel::DEBUG, "[EVALUATING BOX] {$aBox->getReference()}"); |
|
266
|
266
|
|
|
267
|
267
|
$packedItems = new ItemList; |
|
268
|
268
|
$remainingDepth = $aBox->getInnerDepth(); |
|
@@ -271,7 +271,7 @@ discard block |
|
|
block discarded – undo |
|
271
|
271
|
$remainingLength = $aBox->getInnerLength(); |
|
272
|
272
|
|
|
273
|
273
|
$layerWidth = $layerLength = $layerDepth = 0; |
|
274
|
|
- while(!$aItems->isEmpty()) { |
|
|
274
|
+ while (!$aItems->isEmpty()) { |
|
275
|
275
|
|
|
276
|
276
|
$itemToPack = $aItems->top(); |
|
277
|
277
|
|
|
@@ -280,9 +280,9 @@ discard block |
|
|
block discarded – undo |
|
280
|
280
|
continue; |
|
281
|
281
|
} |
|
282
|
282
|
|
|
283
|
|
- $this->logger->log(LogLevel::DEBUG, "evaluating item {$itemToPack->getDescription()}"); |
|
284
|
|
- $this->logger->log(LogLevel::DEBUG, "remaining width: {$remainingWidth}, length: {$remainingLength}, depth: {$remainingDepth}"); |
|
285
|
|
- $this->logger->log(LogLevel::DEBUG, "layerWidth: {$layerWidth}, layerLength: {$layerLength}, layerDepth: {$layerDepth}"); |
|
|
283
|
+ $this->logger->log(LogLevel::DEBUG, "evaluating item {$itemToPack->getDescription()}"); |
|
|
284
|
+ $this->logger->log(LogLevel::DEBUG, "remaining width: {$remainingWidth}, length: {$remainingLength}, depth: {$remainingDepth}"); |
|
|
285
|
+ $this->logger->log(LogLevel::DEBUG, "layerWidth: {$layerWidth}, layerLength: {$layerLength}, layerDepth: {$layerDepth}"); |
|
286
|
286
|
|
|
287
|
287
|
$itemWidth = $itemToPack->getWidth(); |
|
288
|
288
|
$itemLength = $itemToPack->getLength(); |
|
@@ -298,13 +298,13 @@ discard block |
|
|
block discarded – undo |
|
298
|
298
|
if ($fitsRotatedGap < 0 || |
|
299
|
299
|
($fitsSameGap >= 0 && $fitsSameGap <= $fitsRotatedGap) || |
|
300
|
300
|
($itemWidth <= $remainingWidth && !$aItems->isEmpty() && $aItems->top() == $itemToPack && $remainingLength >= 2 * $itemLength)) { |
|
301
|
|
- $this->logger->log(LogLevel::DEBUG, "fits (better) unrotated"); |
|
|
301
|
+ $this->logger->log(LogLevel::DEBUG, "fits (better) unrotated"); |
|
302
|
302
|
$remainingLength -= $itemLength; |
|
303
|
303
|
$layerLength += $itemLength; |
|
304
|
304
|
$layerWidth = max($itemWidth, $layerWidth); |
|
305
|
305
|
} |
|
306
|
306
|
else { |
|
307
|
|
- $this->logger->log(LogLevel::DEBUG, "fits (better) rotated"); |
|
|
307
|
+ $this->logger->log(LogLevel::DEBUG, "fits (better) rotated"); |
|
308
|
308
|
$remainingLength -= $itemWidth; |
|
309
|
309
|
$layerLength += $itemWidth; |
|
310
|
310
|
$layerWidth = max($itemLength, $layerWidth); |
|
@@ -313,7 +313,7 @@ discard block |
|
|
block discarded – undo |
|
313
|
313
|
|
|
314
|
314
|
//allow items to be stacked in place within the same footprint up to current layerdepth |
|
315
|
315
|
$maxStackDepth = $layerDepth - $itemToPack->getDepth(); |
|
316
|
|
- while(!$aItems->isEmpty()) { |
|
|
316
|
+ while (!$aItems->isEmpty()) { |
|
317
|
317
|
$potentialStackItem = $aItems->top(); |
|
318
|
318
|
if ($potentialStackItem->getDepth() <= $maxStackDepth && |
|
319
|
319
|
$potentialStackItem->getWeight() <= $remainingWeight && |
|
@@ -330,7 +330,7 @@ discard block |
|
|
block discarded – undo |
|
330
|
330
|
} |
|
331
|
331
|
else { |
|
332
|
332
|
if ($remainingWidth >= min($itemWidth, $itemLength) && $layerDepth > 0 && $layerWidth > 0 && $layerLength > 0) { |
|
333
|
|
- $this->logger->log(LogLevel::DEBUG, "No more fit in lengthwise, resetting for new row"); |
|
|
333
|
+ $this->logger->log(LogLevel::DEBUG, "No more fit in lengthwise, resetting for new row"); |
|
334
|
334
|
$remainingLength += $layerLength; |
|
335
|
335
|
$remainingWidth -= $layerWidth; |
|
336
|
336
|
$layerWidth = $layerLength = 0; |
|
@@ -338,7 +338,7 @@ discard block |
|
|
block discarded – undo |
|
338
|
338
|
} |
|
339
|
339
|
|
|
340
|
340
|
if ($remainingLength < min($itemWidth, $itemLength) || $layerDepth == 0) { |
|
341
|
|
- $this->logger->log(LogLevel::DEBUG, "doesn't fit on layer even when empty"); |
|
|
341
|
+ $this->logger->log(LogLevel::DEBUG, "doesn't fit on layer even when empty"); |
|
342
|
342
|
$aItems->extract(); |
|
343
|
343
|
continue; |
|
344
|
344
|
} |
|
@@ -348,10 +348,10 @@ discard block |
|
|
block discarded – undo |
|
348
|
348
|
$remainingDepth -= $layerDepth; |
|
349
|
349
|
|
|
350
|
350
|
$layerWidth = $layerLength = $layerDepth = 0; |
|
351
|
|
- $this->logger->log(LogLevel::DEBUG, "doesn't fit, so starting next vertical layer"); |
|
|
351
|
+ $this->logger->log(LogLevel::DEBUG, "doesn't fit, so starting next vertical layer"); |
|
352
|
352
|
} |
|
353
|
353
|
} |
|
354
|
|
- $this->logger->log(LogLevel::DEBUG, "done with this box"); |
|
|
354
|
+ $this->logger->log(LogLevel::DEBUG, "done with this box"); |
|
355
|
355
|
return new PackedBox($aBox, $packedItems, $remainingWidth, $remainingLength, $remainingDepth, $remainingWeight); |
|
356
|
356
|
} |
|
357
|
357
|
|