Расчет размеров коробки для нескольких продуктов для несущего модуля в PrestaShop
В настоящее время я разрабатываю несущий модуль для Kuroneko, который является японской компанией доставки от двери до двери. Эта несущая, вместе с весом, принимает размер коробки в рассмотрение. Но он не использует громкость, это было бы слишком легко. Он использует сумму трех измерений (высота, вес и глубина).
Если у вас есть только один продукт в коробке, это все еще легко, но что происходит, когда вам нужно упаковать 2 продукта? Предположим, у вас есть два произведения размеров (x1, y1, z1) и (x2,y2,z2), как вы вычисляете конечный размер коробки X,Y,Z таким образом, чтобы X+Y+Z были минимальными?
Вот мое предварительное решение, но скажите мне, есть ли лучший способ рассчитать: пусть m1-минимальный размер первого произведения, min(x1,y1,z1) и m2 для второго. Вы должны учитывать вращения продуктов в коробке, чтобы соответствовать им наилучшим образом и,таким образом,определять новые размеры nx, ny, nz для обоих продуктов. Предположим, что в NX = м. Если M = X, то нг = г, НЗ = з, то если M=Y, то, НГ= х, НЗ = з еще если м=з, нг = г, НЗ= х. Таким образом, общий размер коробки становятся 2*ПХ,Макс(ny1,ny2),Макс(nz1,nz2).
Но насколько я вижу, я не думаю, что этот метод будет работать для более чем 2 продуктов. Есть идеи?




Ответы - Расчет размеров коробки для нескольких продуктов для несущего модуля в PrestaShop / Calculating the size of a box for multiple products for carrier module in prestashop

14.02.2014 01:54:22
Логика:
Найти общий объем (w*h*d) [+(w*h*d)..]
Соберите все возможные значения ширины высоты и глубины, отсортируйте каждое от самого низкого до самого высокого
Найдите все возможные перестановки суммы для ширины, затем для высоты, затем для ширины
3a. пример: сумма перестановок для диапазонов ширины 1,2,3 будет равна 1, 2, 3, 4, 5, 6
3b. нам это нужно, потому что ни в коем случае конечное значение ширины не может быть 1,5, например, на основе примера (3a.)
Найти все возможные комбинации ширины, высоты и глубины на основе перестановок, вычисленных по (3.)
Хранить все комбинации, в которых общий объем равен или больше общего объема из (1.)
5a. это происходит потому, что невозможно, чтобы конечный объем был меньше фактического объема (1.)
5б. Для объемов больше, чем (1.) это значит, что это мертвое пространство.
- Сортировка всех комбинаций из (5.) По возрастанию, первым результатом будет самый точный объем
Вполне возможно, что наиболее точный объем все же мог иметь разные размеры
7а. Пример: объем 16 может быть 2x2x4 или 4x4x1 или 2x1x8 или 16x1x1
7Б. Найти сумму З+З+Д для каждого и наименьшую сумму будет даже более точные размеры.
7c. пример из (7a.) 2+2+4 = 8, 4+4+1 = 9, 2+1+8 = 11, 16+1+1 = 18 .... Так что наш скрипт будет выбирать 2 x 2 x 4



14.03.2018 04:25:37
Я искал этот алгоритм, но ссылка не работает, однако я мог бы найти его с помощью wayback machine.
В любом случае, я опубликую его здесь, потому что это может быть полезно для кого-то еще
<?php
$test = '1,2,3|4,2,1|0.1,0.9,0.01';
$dimensions = explode("|", $test);
//1. Find total volume
$volume = 0;
//2. Find WHD ranges
$widthRange = array();
$heightRange = array();
$depthRange = array();
foreach($dimensions as $dimension) {
list($width, $height, $depth) = explode(',', $dimension);
$volume += $width * $height * $depth;
$widthRange[] = $width;
$heightRange[] = $height;
$depthRange[] = $depth;
}
//3. Order the WHD ranges
sort($widthRange);
sort($heightRange);
sort($depthRange);
echo 'Volume: '.$volume.'<br />';
echo 'Width Range: '.implode(', ', $widthRange).'<br />';
echo 'Height Range: '.implode(', ', $heightRange).'<br />';
echo 'Depth Range: '.implode(', ', $depthRange).'<br />';
//4. Figure out every combination with WHD
$widthCombination = array();
$heightCombination = array();
$depthCombination = array();
function combination($list) {
$combination = array();
$total = pow(2, count($list));
for ($i = 0; $i < $total; $i++) {
$set = array();
//For each combination check if each bit is set
for ($j = 0; $j < $total; $j++) {
//Is bit $j set in $i?
if (pow(2, $j) & $i) $set[] = $list[$j];
}
if(empty($set) || in_array(array_sum($set), $combination)) {
continue;
}
$combination[] = array_sum($set);
}
sort($combination);
return $combination;
}
$widthCombination = combination($widthRange);
$heightCombination = combination($heightRange);
$depthCombination = combination($depthRange);
echo 'Width Combination: '.implode(', ', $widthCombination).'<br />';
echo 'Height Combination: '.implode(', ', $heightCombination).'<br />';
echo 'Depth Combination: '.implode(', ', $depthCombination).'<br />';
$stacks = array();
foreach($widthCombination as $width) {
foreach($heightCombination as $height) {
foreach($depthCombination as $depth) {
$v = $width*$height*$depth;
if($v >= $volume) {
$stacks[$v][$width+$height+$depth] = array($width, $height, $depth);
}
}
}
}
ksort($stacks);
foreach($stacks as $i => $dims) {
ksort($stacks[$i]);
foreach($stacks[$i] as $j => $stack) {
rsort($stack);
break;
}
break;
}
echo '<pre>'.print_r($stacks, true).'</pre>';
Вся заслуга принадлежит Кристиану Бланкере

26.06.2019 02:56:47
Приведенный выше алгоритм не работает для измерений:
$test = '100,10,10|50,50,50';
Первый результат:
(
[0] => 50
[1] => 60
[2] => 50
)
но первый продукт не подходит. Комбинированный массив должен включать только суммы размеров, которые больше или равны размеру самого большого измерения (комбинация ширины не должна включать 50).