Как сгруппировать несколько посылок в одну с помощью PHP - PullRequest
1 голос
/ 22 марта 2019

Мне нужна формула, которая поможет мне сгруппировать несколько посылок в одну.

У меня есть объект посылки, подобный этому:

<?php

class Parcel {
    function __construct($length,$width,$height,$weight) {
        $this->length=$length;
        $this->width=$width;
        $this->height=$height;
        $this->weight=$weight;
    }

    private $length;
    private $width;
    private $height;
    private $weight;

    public function getParcelDetails()
    {
        echo "length=".$this->length."<br>";
        echo "width =".$this->width."<br>";
        echo "height=".$this->height."<br>";
        echo "weight=".$this->weight ."<br>";
    }

    public static function mergeParcels($parcels){
        $new_parcel_length=0;
        $new_parcel_width=0;
        $new_parcel_height=0;
        $new_parcel_weight=0;
        foreach ($parcels as $key => $parcel) {
            # What is the formula that can create a new parcel which is enable to contain the parcels $parcels ?

            # The weight will be just additionned
            $new_parcel_weight+=$parcel->$weight;
        }

        $new_parcel= new static($new_parcel_length,$new_parcel_width,$new_parcel_height,$new_parcel_weight);

        return $new_parcel;
    }
}

Цель - объединить участки водин, так что в основном сценарии у меня будет что-то вроде этого:

$parcel1=new Parcel(10,10,10,1);
$parcel2=new Parcel(5,5,5,1);

//$parcel1->getParcelDetails();
//$parcel2->getParcelDetails();

$new_parcel=Parcel::mergeParcels([$parcel1,$parcel2]);

$new_parcel->getParcelDetails();

Эта картина может продемонстрировать проблему: enter image description here

Обратите внимание, чтопроблема в том, что когда у меня несколько посылок, где размеры не равны.

Если размеры равны, я могу просто добавить их друг к другу, но у меня нет решения, когда размеры не совпадают.

1 Ответ

2 голосов
/ 22 марта 2019

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

Небольшие задачи можно решить с помощью динамического программирования, а более крупные - с помощью эвристики.

Подробнее об этом можно прочитать здесь и здесь .

Обратите внимание, что крупномасштабные комбинаторные решатели - это целая отрасль, требующая годыR & D.

...