Я пытаюсь найти лучший способ вычислить размер поля, необходимый для поставки.
У меня есть 3 контейнеров для перевозок с различными размерами. У меня есть ширина продукта, длина, глубина и масса, определенная в базе данных.
Я хотел бы знать, как найти, что самая маленькая сумма полей должна была поставляться, и также самые маленькие размеры тех полей, учитывая количество объектов в корзине.
Моя текущая 'идея' состоит в том, чтобы найти максимальную ширину всего массива продуктов, выбор поле согласно ему, и затем разделить порядок, по мере необходимости... это не кажется, что работало бы.
Мои размеры Поля: - 8 x 6 x 6 = 228 кубических дюймов - 10 x 8 x 8 = 640 кубических дюймов - 12.5 x 12.5 x 12.5 = 1 953,125 кубических дюйма
Продукт определяется как таковой:
[Product] => Array
(
[STOCK_CODE] => 010003
[Product_Slug] => GABA_010003
[ItemName] => GABA
[WHOLESALE_PRICE] => 17.47
[RETAIL_PRICE] => 24.95
[Brand] =>
[ProductLine] =>
[image_name] => 705077000440
[MASS] => 0.313
[Height] => 4.625
[Width] => 2.375
[Depth] => 2.375
[cubic_inches] => 26.087890625
)
Я изучил задачу о ранце, упаковав проблему, и т.д. и не могу найти способ сделать это. Любая справка была бы БОЛЬШОЙ.
function shipping(){
$this->CartProduct->unbindModel(
array('belongsTo' => array('User'))
);
//find all cart products by current logged in user
$cartItems = $this->CartProduct->find('all', array('conditions' => array('CartProduct.user_id' => $this->Auth->user('id'))));
$i = 0;
//get the max width, height, depth
$maxHeight = 0;
$maxWidth = 0;
$maxDepth = 0;
foreach($cartItems as $c){
$cartItems[$i]['Product']['cubic_inches'] = $c['Product']['Height'] * $c['Product']['Width'] * $c['Product']['Depth'];
$cartItems[$i]['CartProduct']['total_cubic_inches'] = ($c['Product']['Height'] * $c['Product']['Width'] * $c['Product']['Depth']) * $c['CartProduct']['qty'];
if($c['Product']['Height'] > $maxHeight)
{
$maxHeight = $c['Product']['Height'];
}
if($c['Product']['Width'] > $maxWidth)
{
$maxWidth = $c['Product']['Width'];
}
if($c['Product']['Depth'] > $maxDepth)
{
$maxDepth = $c['Product']['Depth'];
}
$i++;
}
//possible containers
//8 x 6 x 6 = 228 ci
//10 x 8 x 8 = 640 ci
//12.5 x 12.5 x 12.5 = 1953.125
$possibleContainers = array(
1 => array(
'Height' => 8,
'Width' => 6,
'Depth' => 6,
'Cubic' => 228),
2 => array(
'Height' => 10,
'Width' => 8,
'Depth' => 8,
'Cubic' => 640),
3 => array(
'Height' => 12.5,
'Width' => 12.5,
'Depth' => 12.5,
'Cubic' => 1953.125)
);
$max = array(
'Height' => $maxHeight,
'Width' => $maxWidth,
'Depth' => $maxDepth,
);
pr($cartItems);
pr($possibleContainers);
die();
}
Что касается получения оптимального ответа, это NP-Hard ... http://en.wikipedia.org/wiki/Bin_packing_problem
Жадный алгоритм, показанный в Википедии, хотя он может быть довольно далеким , может действительно подойти для вашего случая.
Однако в качестве оценки вы можете просто суммировать объемы предметов, а затем применить коэффициент неэффективности , а затем использовать наименьшие квадраты, которые вы можете.
В качестве альтернативы вы можете отсортировать элементы по уменьшающемуся объему, а затем посмотреть, сколько вы можете поместить в текущий набор ящиков, создавая новое поле, когда вы не можете вместить элемент. Не уверен, как вы будете обрабатывать коробки разных размеров хотя. У вас также может быть случай, когда он изменяет размер коробки, а не создает новую коробку.
Пища для размышлений.