Расчет размеров коробки для нескольких продуктов для несущего модуля в PrestaShop

Расчет размеров коробки для нескольких продуктов для несущего модуля в PrestaShop

09.09.2012 02:49:21 Просмотров 50 Источник

В настоящее время я разрабатываю несущий модуль для 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 продуктов. Есть идеи?

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta#comment16575311_12338431
верхняя граница для количества продуктов?
https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta#comment16577825_12338431
думаю, не больше 10.
https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta#comment16577925_12338431
грубая сила, для всех 3^6 вращений коробок, может быть?
https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta#comment16580352_12338431
Думаю, это единственное решение. Проблема в любом случае NP-полная.

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

Является ответом!
Christian Blanquera

14.02.2014 01:54:22

  • Ответ Демо Здесь .
  • Вы можете проверить код здесь (я добавил холст для визуализации)

Логика:

  1. Найти общий объем (w*h*d) [+(w*h*d)..]

  2. Соберите все возможные значения ширины высоты и глубины, отсортируйте каждое от самого низкого до самого высокого

  3. Найдите все возможные перестановки суммы для ширины, затем для высоты, затем для ширины

    3a. пример: сумма перестановок для диапазонов ширины 1,2,3 будет равна 1, 2, 3, 4, 5, 6

    3b. нам это нужно, потому что ни в коем случае конечное значение ширины не может быть 1,5, например, на основе примера (3a.)

  4. Найти все возможные комбинации ширины, высоты и глубины на основе перестановок, вычисленных по (3.)

  5. Хранить все комбинации, в которых общий объем равен или больше общего объема из (1.)

    5a. это происходит потому, что невозможно, чтобы конечный объем был меньше фактического объема (1.)

    5б. Для объемов больше, чем (1.) это значит, что это мертвое пространство.

  6. Сортировка всех комбинаций из (5.) По возрастанию, первым результатом будет самый точный объем
  7. Вполне возможно, что наиболее точный объем все же мог иметь разные размеры

    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

https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta/21776020#comment32991014_21776020
Спасибо за ваш ответ. В итоге я использовал аналогичное решение. Спасибо за графическое объяснение :)
https://stackoverflow.com/questions/12338431/calculating-the-size-of-a-box-for-multiple-products-for-carrier-module-in-presta/21776020#comment100104051_21776020
Хорошая экспликация !
Macr1408

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>';

Вся заслуга принадлежит Кристиану Бланкере

mingle

26.06.2019 02:56:47

Приведенный выше алгоритм не работает для измерений: $test = '100,10,10|50,50,50'; Первый результат:

(
  [0] => 50
  [1] => 60
  [2] => 50              
)

но первый продукт не подходит. Комбинированный массив должен включать только суммы размеров, которые больше или равны размеру самого большого измерения (комбинация ширины не должна включать 50).

Закрыть X