(PHP) maksimum paket boyutu hesaplanıyor

3 Cevap php

Bunun için PHP ile çalışmak.

Öğeleri, kendi ağırlığı ile her verilen bir dizi, ben otomatik olarak 100 £ paketleri içine öğeleri paketlemek için en etkili yolu hesaplamak gerekir (100 lbs max paketi ağırlığı statik, ancak ileride değiştirilebilir). Tek bir paket belirtilen maksimum geçemez.

: £ 254 toplam ağırlığı ile - Örnek olarak, I 5 öğeler

  • Madde 1 -> 51 £
  • Madde 2 -> 28 £
  • Madde 3 -> 73 £
  • Madde 4 -> 51 £
  • Madde 5 -> 51 £

Bir £ 254 3 x 100 £ paketlerini gerektirecek zannedebilir. Bu örnek bilerek bu her zaman böyle olmadığını göstermektedir. Belirli bir öğe konfigürasyonları birlikte iyi çalışmıyor olabilir. Bu örnek, iyi bir yapılandırma 4 x 100 £ paket gerekir.

Madde sayısı ve ağırlıkları tamamen değişkendir ve tek madde 100 £ aşacaktır.

Ne bunu başarmak için en uygun yol olacaktır?

3 Cevap

Eğer açıklayan sorunu Bin Packing Problem denir. Kimse bunu çözmek için en iyi şekilde bilir. Yaptılar eğer onlar P=NP kanıtlamak veya P mümkün olacaktır = NP - hesaplamada büyük açık sorulardan biri.

İlk uyum algoritması, en uygun azalan, ilk uyum azalan - Wikipedia sayfası bazı örnek algoritmaları başvurular içerir. Genel olarak bu sorunu çözmek için hızlı bir yol en uygun çözümü bulmak girişimi değil, ama iyi bir yaklaşım bulmak. 'Azalan' ilk büyük, en zor unsurları ambalaj ile başlar, ve sonra sonunda küçük elemanları ile boşlukları doldurmak için iyi bir fikir olmak anlamına gelir. Bu aslında çoğu insan genellikle bu sorunu yaklaşım nasıl benzer.

Sizin örnekte verdim problemin boyutu için, sadece tüm olası permütasyon kontrol ederek uygun çözümü bulmak için basit olurdu, ama belli ki daha büyük örnekler için çok verimli olmayacaktır.

Burada tarif edildiği gibi bir sorun gerçekten aynıdır:

http://stackoverflow.com/questions/1982906/convert-function-from-recursion-to-iteration

Kör arama yöntemi sipariş N bir algoritma yaratacak paketlerinin her kombinasyonunu uygulamak için, sadece büyük bir sorun değil, öğeleri küçük sayıda (5 öğe aramak için sadece 120 kombinasyonları vermektedir var ise - ama 10 3.6 üzerinde gerektirir milyon)

Orada benim yazılan başı olarak görmek

http://en.wikipedia.org/wiki/Travelling_salesman_problem

Ayrıntılı olmayan algoritmalar açıklamaları için.

C.

Ilgilenenler için, burada benim soru çözmek için yazdığı kod:

    //Loop thru cart items - adding weights to packages
    foreach((array)$this->cart_items as $cart_item) {
        for ($i = 0; $i < $cart_item->quantity; $i++) {

            $itemWeight = $cart_item->weight;    //Get current item weight
            $currWeight += $itemWeight;             //Add item weight to active package

            if ($currWeight > 100){                      //Max weight reached for active package

                $currWeight -= $itemWeight;         //Remove item from current package, too heavy
                $loopPack = 0;                                  
                $itemUsed = false;

                //Check if an existing package can take the item
                while (($loopPack != $packageCount) or ($itemUsed = false)) {
                    if ($packages[$loopPack] + $itemWeight < 100) {
                        $packages[$loopPack] += $itemWeight;
                        $itemUsed = true;
                    }
                    $loopPack++;
                }

                //if the item didn't fit in an existing package, create a new package for it
                if ($itemUsed == false) {
                    $packageCount++;
                    $packages[$packageCount-1] = $currWeight;
                    $currWeight = $cart_item->weight;            //Put unused item back in active package			
                }

            }
        }
    }
    //The remainder becomes a package
    $packageCount++;
    $packages[$packageCount-1] = $currWeight;

    print_r($packages);