سؤال

أحاول العثور على أفضل طريقة لحساب حجم الصندوق اللازم للشحن.

لدي 3 حاويات شحن بأحجام مختلفة. لدي عرض المنتج وطوله وعمقه والكتلة المحددة في قاعدة البيانات.

أود أن أعرف كيفية العثور على أصغر كمية من الصناديق اللازمة للشحن ، وكذلك أصغر أبعاد تلك الصناديق نظرًا لعدد العناصر الموجودة في العربة.

"فكرتي" الحالية هي العثور على الحد الأقصى لعرض مجموعة المنتجات بأكملها ، و Select A Box وفقًا لذلك ، ثم تقسيم الطلب حسب الحاجة ... هذا لا يبدو أنه سيعمل.

أحجام الصندوق الخاصة بي هي: - 8 × 6 × 6 = 228 بوصة مكعبة - 10 × 8 × 8 = 640 بوصة مكعبة - 12.5 × 12.5 × 12.5 = 1953.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
                )

لقد بحثت في مشكلة knapsack ، ومشكلة التعبئة ، وما إلى ذلك ولا يمكنني العثور على طريقة للقيام بذلك. أي مساعدة ستكون رائعة.

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

الخوارزمية الجشع الموضحة على ويكيبيديا ، في حين أنها يمكن أن تكون بعيدة جدًا ، قد تفعل فعليًا في قضيتك.

ومع ذلك ، كتقدير ، يمكنك فقط تلخيص أحجام العناصر ثم تطبيق أ عامل عدم الكفاءة ثم استخدم أصغر مربع (مربعات) يمكنك.

بالتناوب ، يمكنك فرز العناصر إلى خفض مستوى الصوت ومن ثم معرفة مقدار ما يمكنك الوصول إليه في المجموعة الحالية من الصناديق ، وإنشاء مربع جديد عندما لا يمكنك وضع العنصر فيه. لست متأكدًا من كيفية التعامل مع أحجام الصناديق المختلفة. يمكن أن يكون لديك أيضًا حالة يغير فيها حجم الصندوق بدلاً من إنشاء صندوق جديد.

غذاء للفكر.

نصائح أخرى

إليك حل تقني منخفض ولكنه ممكن:

لقد واجهنا نفس القضية. قررت أخذ أحجام الصناديق الخاصة بنا ثم أعطي كل منتج نسبة مئوية عن مقدار المساحة التي استغرقتها في كل حجم صندوق. منتجاتنا هي شكل مجاني ويمكن سحقها قليلاً ، لذا إذا كان الحجم الخاص بك مطلقة ، فقد تحتاج إلى تقليل النسب المئوية التي يتم حساب المنتجات التي يتم وضعها في الصندوق في زوايا مختلفة أيضًا ... أيضًا بالنسبة لنا ، يمكننا دائمًا وضعها الأشياء في الصناديق مثل نفس الزاوية لبعضها البعض ، لذلك يساعد هذا أيضًا في جعل الطريقة أدناه تعمل بشكل أفضل.

هذا يفترض أن هناك 3 أحجام الصناديق:

  • المنتج أ
    • المربع A = 48 ٪ (2 مناسب في صندوق)
    • المربع ب = 30 ٪ (3 تناسب في صندوق)
    • المربع C = 12 ٪ (8 تناسب في صندوق)
  • المنتج ب
    • المربع A = 24 ٪
    • المربع ب = 15 ٪
    • المربع C = 7 ٪

ثم فقط اطلب من الرمز الخاص بك إضافة هذه النسب المئوية لعناصر العربة الخاصة بك للمربع A و B و C ... من الواضح أنه إذا كان أي منها أقل من 100 ٪ يجب أن يناسب كل شيء ، وإذا بدأت من أعلى إلى أسفل ، فإن أول واحد يصل إلى أقل من 100 ٪ سوف تناسب منتجاتك وتكون أصغر صندوق. وإذا واجهت أي سيناريوهات عند التعبئة التي لن تتناسب مع تقليل النسبة المئوية التي أدخلتها لهذا المنتج بشكل طفيف.

بالنسبة لشحنات الصناديق المتعددة ، تحتاج فقط إلى تحديد ما تريد القيام به كمجموعات. يعمل ما سبق بشكل أفضل لشحنات الصناديق الفردية ولكن مع بعض المنطق الإضافي يمكن أن يعمل بشكل جيد لشحنات الصناديق المتعددة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top