2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Оптимальное размещение маленьких коробок в большой
Сообщение12.04.2012, 18:26 


12/04/12
3
Чего-то не знаю, как подступиться к задаче. Может, подскажете?

На входе имеются:
a. Одна большая обычная (прямоугольнопараллелепипедная) коробка с размерами ШхГхВ (размеры являются входящими параметрами)
b. Неограниченное количество маленьких коробок (тоже обычных) с размерами ШхГхВ (размеры являются входящими параметрами)

Нужно разработать алгоритм для определения самого выгодного способа установки маленьких коробок в большую (коробки можно вертеть не во всех 3D-направлениях, а только на 90-градусов-кратные углы во всех 3-х плоскостях). Выгодный – т.е. обеспечивающий максимальное количество маленьких коробок в большой.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение12.04.2012, 18:50 
Заслуженный участник


08/04/08
8562
Вы ошиблись разделом - это не олимпиадная задача, а дискретная оптимизационная задача.
topic183.html - загляните сюда, здесь написано, как набирать формулы (формулы здесь обязательно набираются ТеХом).
Далее:
semyonrsh в сообщении #559367 писал(а):
Одна большая коробка с размерами ШхГхВ
и
semyonrsh в сообщении #559367 писал(а):
b. Неограниченное количество маленьких коробок с размерами ШхГхВ
Что за Г? Даже спрашивать боюсь... Но размеры Вы должны точно описать. В том смысле, что при таком описании непонятно, отличаются ли размеры большой и маленьких коробок (не отличаются же!: тут ШхГхВ и там ШхГхВ - одно и то же!)? И главное - размеры маленьких коробок все одинаковые или нет?

Наконец, когда Вы на эти вопросы ответите, Вы можете записать задачу в виде задачи булева линейного программирования (задача укладки). Для них разработаны стандартные алгоритмы, ну а в общем случае задача NP-полная со всеми вытекающими отсюда последствиями.... Хотя, конечно, это в самом худшем случае... Для начала можно вполне удовлетвориться очевидным жадным алгоритмом решения...

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение12.04.2012, 23:53 


12/04/12
3
...да, действительно сформулировал не блестяще.

По порядку:
Г - это Глубина :-)
Все "маленькие" коробки одинаковые,
Размер маленьких коробок отличается от размера большой коробки. Думаю, лучше далее называть большую коробку "Контейнером"

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

В случае 3-мерных контейнера и коробок мне кажется каким-то подозрительно непростым вопрос того, какую коробку каким образом можно уложить в контейнер при условии какой-то частичной заполненности этого контейнера. Ну не перебирать же каждый кубический миллиметр на предмет того, можно ли в него упаковать "дальний левый нижний угол" очередной коробки...
По этому поводу какая-то "стандартная" методика имеется?

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение13.04.2012, 20:43 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Хранить массив дальних левых нижних внутренних углов (первоначально таковых ровно 1, потом делается больше), тыкать коробкой в каждый из них.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение13.04.2012, 23:00 


17/10/08

1313
Если мне не изменяет память, то эта задача именуется как «Плотная упаковка». Занимался ей, в частности, Саати. Может чего и нагуглите.

Коробочки можно плотно уложить в виде прямоугольного параллелепипеда (назовем это блоком) так, что ШГВ этого блока будут кратны ШГВ коробочек. Блок нужно собрать побольше, но чтобы он мог уместиться в контейнере. Возникает несколько комбинаций помещение блока «максимального размера» в контейнер, если учитывать возможность поворота блока на 90 градусов. Блок нужно задвигать в дальний левый угол контейнера. Спереди, справа и сверху может остаться свободное пространство. Его также можно попытаться заполнить блоками. С учетом порядка заполнения «спереди, справа и сверху» и поворотов блоков возникает некоторое некосмическое количество вариантов…
При большом контейнере и маленьких коробочках это почти оптимально.

Линейное программирование решает такие задачи крайне плохо. К тому же размер контейнера фиксирован, а количество коробочек, которое нужно уложить – неизвестно. Поэтому потребуется решить ряд задач линейного программирования, например, с дихотомией количества коробочек.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение14.04.2012, 11:17 
Заблокирован


16/06/09

1547
semyonrsh в сообщении #559367 писал(а):
(коробки можно вертеть не во всех 3D-направлениях, а только на 90-градусов-кратные углы во всех 3-х плоскостях)
Это бессмысленное условие. Всё равно оптимальным будет размещение под углами в 90 градусов, т.к. в прямоугольном треугольнике катеты всегда меньше гипотенузы.

В общепринятых терминах:
Пусть размеры большой коробки $(x_1,y_1,z_1)$, а размеры маленькой $(x_2,y_2,z_2)$. Тогда очевидна система равенств:
$\begin{cases}
k_1x_2=x_1+m_1\\
k_2y_2=y_1+m_2\\
k_3z_2=z_1+m_3
\end{cases}$
Задача заключается в том, чтобы минимизировать свободные коэффициенты $m_1,m_2,m_3\to\min$. (или максимизировать $\sum{k_i\to\max}$).
Существует только три свободных свободных положения (степеней свободы), в которых можно уложить коробку: $x_2$ вдоль $x_1$, $x_2$ вдоль $y_1$, $x_2$ вдоль $z_1$. И на каждую из которых по две степени свободы оставшихся положений, итого: $3\cdot2=6$ способов укладки, которые надо рассмотреть.

Далее пусть $x_2<y_2<z_2$. Остаются способы, когда $m_i>x_1$ и $m_i>y_1$, т.е. дополнительные коробки можно запихать в оставшиеся щели. Заметим, что во всех 6-ти положениях размещения щели будут из себя представлять меньшие параллелепипеды, у которых одно измерение $m_i>x_2$ или $m_i>y_2$, а два других $(y_1,z_1)$, $(y_1,x_1)$ или $(x_1,z_1)$(рассматриваются также максимум два случая).
Далее исключаем все лишние случаи и получаем требуемое $\sum{k_i}+k'\to\max$, где $k'$ - количество дополнительных коробок в щелях после упаковки основных.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение14.04.2012, 11:44 


17/10/08

1313
Можно еще получить более точную верхнюю оценку оптимума. Простейшая – разделить объем контейнера на объем маленькой коробки и взять целую часть. Можно прикинуть, какой объем контейнера в любом случае останется незаполненным. Для этого с длинами сторон контейнера и маленькой коробочки нужно решить задачи о рюкзаке. Так, если размеры маленькой коробочки 4x8x12, а размер контейнера 57x35x62, то не заполнение по сторонам составит как минимум 1, 3 и 2 соответственно. Т.е. верхняя граница будет 56x32x60 / 4x8x12 = 280

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение15.04.2012, 10:24 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
temp03 в сообщении #559851 писал(а):
Это бессмысленное условие. Всё равно оптимальным будет размещение под углами в 90 градусов

$\begin{picture}(100,100) \put(0,0){\line(1,0){100}} \put(0,0){\line(0,1){100}} \put(100,0){\line(0,1){100}} \put(0,100){\line(1,0){100}} \put(0,10){\line(1,1){90}} \put(10,0){\line(1,1){90}} \put(10,0){\line(-1,1){10}} \put(100,90){\line(-1,1){10}} \end{picture}$

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение15.04.2012, 23:36 


12/04/12
3
temp03 в сообщении #559851 писал(а):
В общепринятых терминах:
Пусть размеры большой коробки $(x_1,y_1,z_1)$, а размеры маленькой $(x_2,y_2,z_2)$. Тогда очевидна система равенств:
$\begin{cases}
k_1x_2=x_1+m_1\\
k_2y_2=y_1+m_2\\
k_3z_2=z_1+m_3
\end{cases}$
Задача заключается в том, чтобы минимизировать свободные коэффициенты $m_1,m_2,m_3\to\min$. (или максимизировать $\sum{k_i\to\max}$).

Задача сложнее - в некоторых случаях если коробки повертеть в разных направлениях, то можно добиться более оптимальной укладки

mserg в сообщении #559782 писал(а):
Коробочки можно плотно уложить в виде прямоугольного параллелепипеда (назовем это блоком) так, что ШГВ этого блока будут кратны ШГВ коробочек. Блок нужно собрать побольше, но чтобы он мог уместиться в контейнере. Возникает несколько комбинаций помещения блока «максимального размера» в контейнер, если учитывать возможность поворота блока на 90 градусов. Блок нужно задвигать в дальний левый угол контейнера. Спереди, справа и сверху может остаться свободное пространство. Его также можно попытаться заполнить блоками. С учетом порядка заполнения «спереди, справа и сверху» и поворотов блоков возникает некоторое некосмическое количество вариантов…
При большом контейнере и маленьких коробочках это почти оптимально.

Спасибо, по поводу составления блоков - у меня тоже появилась такая идея. Только оптимальной может быть комбинация из некоторого количества различных "блоков", по-разному повернутых.


В общем, судя по всему задача сводится к:
1. Перебору на каждом шаге всех возможных блоков и их "ориентаций" (это несложно)
2. Перебору на каждом шаге всех возможных "нижних левых дальних" углов, в которые можно попытаться вставить каждый из блоков (вот это - какая-то довольно непростая задача, в которой, думаю, вылезет куча различных нюансов, каждый из которых нужно мелочно обсчитать)
3. Выбору оптимального размещения из перебираемых вариантов

Всем большое спасибо за комментарии.
Осталось собраться с силами в свободное от работы время... :)

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 00:46 


17/10/08

1313
Линейное программирование позволяет с помощью псевдобулевых переменных описать и ориентацию коробочек, и их непересекаемость в пространстве друг с другом. Т.е. математическая постановка задачи, решение которой дает глобальный оптимум, существует. Если коробочек всего несколько штук – то глобальный оптимум найти реально. Но все это не работает, если коробочек будет больше чем несколько штук, так как наступает «комбинаторная смерть» «частично-целочисленного линейного программирования».

Поэтому, конечно, поговорить на тему можно, что такой-сякой поворот отдельных коробочек поможет разместить дополнительные элементы. Но в реальной жизни (не в мире специально сконструированных патологических примеров) пользы от этого не будет. Впрочем, не настаиваю

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 10:10 
Заблокирован


16/06/09

1547
semyonrsh в сообщении #560555 писал(а):
Задача сложнее - в некоторых случаях если коробки повертеть в разных направлениях, то можно добиться более оптимальной укладки
Нельзя. И случай приведённый ИСН не пример.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 10:27 


14/01/11
3040
temp03 в сообщении #560619 писал(а):
Нельзя. И случай приведённый ИСН не пример.


В самом деле?

Изображение

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

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 12:58 


17/10/08

1313
В интернете преобладают программы-симулякры. Делается некоторый алгоритм на простых эвристиках. Потом к нему подбираются специальные примеры, дающие оптимальный результат. И это выставляется в интернет. Так, пример выше имеет признаки искусственного конструирования и он с высокой вероятностью является частью «симулякризации».

Чтобы не попасть впросак, нужно иметь библиотечку примеров, на которых можно оценивать общую реальную эффективность интернет-творений и сравнивать их друг с другом. Да и для своих творений тоже нужна библиотека. Это, конечно, актуально, если речь идет о реальном приложении, а не об учебном.

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 15:54 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Не пример? Хе-хе. "Примеров нет, сказал мудрец брадатый."

 Профиль  
                  
 
 Re: Оптимальное размещение маленьких коробок в большой
Сообщение16.04.2012, 18:13 
Заслуженный участник


08/04/08
8562

(Оффтоп)

mserg в сообщении #560666 писал(а):
В интернете преобладают программы-симулякры. Делается некоторый алгоритм на простых эвристиках. Потом к нему подбираются специальные примеры, дающие оптимальный результат. И это выставляется в интернет. Так, пример выше имеет признаки искусственного конструирования и он с высокой вероятностью является частью «симулякризации».
Это скорее наоборот: пример, показывающий, что программы, построенные на хороших эвристиках кое-где (как, например, здесь) все-таки обламываются.
Ну это все для решения несущественно, конечно.

ИСН в сообщении #560708 писал(а):
Не пример? Хе-хе. "Примеров нет, сказал мудрец брадатый."
:lol: +1!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group