Целевая функция упаковки бин
Сначала я хочу уточнить, что английский не является моим родным языком, поэтому наберитесь немного терпения:)
Я пытаюсь решить проблему с упаковкой 3D-бина, только с одним контейнером (рюкзаком), и у меня есть проблема с формулировкой целевой функции. У меня есть контейнер и список пакетов:
Контейнер:
- ширина
- глубина
- Рост
- Вместимость
- Трехмерная матрица
Пакет:
- ширина
- глубина
- Рост
- Положение (X,Y,Z)
- Вес
- Фактор позиции
Каждый пакет будет иметь коэффициент положения, который говорит нам, в какую позицию вы хотите загрузить пакет, коэффициент от 1 до 5, 1 означает, что пакет должен быть размещен в передней части контейнера, а 5 - в задней части контейнер.
Теперь моя цель состоит в том, чтобы максимизировать пространство на контейнере, а пакеты, которые имеют больший коэффициент, должны быть в задней части контейнера, а пакеты с меньшим коэффициентом - в передней части грузовика.
Если я хочу максимизировать пространство, мне просто нужно максимизировать сумму всех объёмов пакета, но я должен комбинировать это с штрафом к целевой функции, когда, например, пакет с коэффициентом 5 находится в положении перед контейнера.
Я хочу кое-что прояснить на примере пакетов одинакового размера, расположенных в линию
- назад 5 1 5 4 4 4 3 3 2 2 спереди
- назад 5 5 4 4 4 3 3 2 1 2 спереди
В первом дистрибутивном пакете вы видите, что пакет с коэффициентом 1 почти находится позади контейнера, в то время как во втором дистрибутиве пакет с коэффициентом 1 расположен рядом с положением, где он должен быть (спереди), поэтому второе распределение лучше.
Проблема в том, что пакеты имеют разные размеры и могут быть размещены в любой позиции. Я надеюсь, что вы можете помочь мне:D!
1 ответ
Конкретная форма целевой функции зависит от метода решения.
Поскольку проблема с упаковкой в бункер является NP-трудной проблемой, я думаю, что вы будете использовать некоторую эвристику для ее решения. В этом случае подходящее решение - это набор всех пакетов (P) с заполненным атрибутом Position (X,Y,Z). И целевая функция выглядит так:
F({P}) -> int
Таким образом, вы можете прибавить в весе результат по коэффициенту пакета: наилучшая компоновка - это отсортированные коэффициенты от 1 до 5, как я понимаю. Разница между ним и текущим макетом - ваш коэффициент (используйте наименьшие квадраты):
ideal: back 5 5 4 4 4 3 3 2 2 1 front
current: back 5 1 5 4 4 4 3 3 2 2 front
coefficient: (5-5)^2 + (5-1)^2 + ... + (1-2)^2