Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимальное размещение прямоугольников, Есть один большой, есть много маленьких. 
V
    Опции темы
Coriolis
Дата 22.8.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



Здравствуйте, люди.
Эту тему можно разместить и в разделе про графику, т.к. под прямоугольниками я понимаю текстуры.

Задача:

Имеется набор прямоугольников с известными размерами. Имеется прямоугольник определённых размеров. Необходимо оптимально разместить первые во втором, т.е. таким образом, чтобы поместилось как можно больше.
Прямоугольники можно вращать на 90 градусов.

На выходе координаты левого верхнего угла каждого прямоугольника и угол поворота.

Я поискал по форуму – ничего подобного не встретил.

Это сообщение отредактировал(а) Coriolis - 22.8.2005, 16:21
PM MAIL   Вверх
DENNN
Дата 22.8.2005, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Наврное стоиттнаписать о том, можно ли вращать прямоугольники и как они сами могут быть ориентированны относительно большого.
PM ICQ   Вверх
Akina
Дата 22.8.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



"Задача о рюкзаке". В поиск тебе...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Coriolis
Дата 22.8.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



to DENNN
Да-да, мне эта мысль пришла, правда поздно.

Вращать можно, но только на 90 градусов.
Т.е. стороны малых прямоугольников параллельны сторонам прямоугольника-контейнера.
Вот, и на выходе - это координаты левого верхнего угла и угол поворота каждого прямоугольника.

to Akina
Я так понял, задача о рюкзаке оперирует одной составляющей. А в моей задаче их две - длинна и ширина.

PM MAIL   Вверх
Akina
Дата 22.8.2005, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Coriolis
Ты неправильно понял. Одномерный рюкзак - всего лишь частный случай.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Coriolis
Дата 22.8.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



А! О!
Я на форуме (здесь где-то рядом) встретил тему про рюкзак, и решил что это не моё (хотя очень похоже было).

А подробное описание алгоритма здесь нигде не обсуждалось?
Добавлено @ 16:30
АААААААА!!!!
Бейте меня ногами!!!
Пропустил-таки нужную тему, наплодил новую!

вот, человек уже спрашивал:
http://forum.vingrad.ru/index.php?showtopic=9160
PM MAIL   Вверх
Coriolis
Дата 22.8.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



В той теме отправили на matlab.ru - честно там поискал. Ниччего не нашёл.
А вот Матлаб не у каждого стоит. smile (это podval посоветовал smile )

По ссылке http://algolist.manual.ru/maths/combinat/index.php скачал пдф-ку на инглийском (там в основном формулы) - мало чего понял.

Видимо, придётся таки ковырять MatLab. Просто времени уйдёт уйма. (с учётом что я его в глаза не видел).
PM MAIL   Вверх
Гость_Программер
Дата 8.12.2005, 13:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Coriolis попробуй методом построения годографов.
Для прямоугольников это не так уж и сложно.
Я прогал так но без вращения.
  Вверх
laimerok
Дата 10.12.2005, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 14.6.2005
Где: Хабаровск

Репутация: нет
Всего: нет



Размещай в заданом прямоугольнике сначала маленькие , потом больше и больше по размерам
PM MAIL WWW   Вверх
bsa
Дата 6.4.2006, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



Мне тоже нужна была данная прога. Думал, что смогу найти в инете (кстати, наткнулся на это форум). Не нашел. Зато нашел несколько идей по этому поводу, в т.ч. и почти готовый алгоритм, который я привожу ниже...

Хочу описать данный алгоритм.
Но сначала о терминах:
ФОРМА - большой прямоугольник, на котором размещаются маленькие.
МАТРИЦА - двумерный булевый массив, размеры которого совпадают с ФОРМОЙ (используется для определения пустого места).
ДОСТУПНЫЙ/ИСХОДНЫЙ ПРЯМОУГОЛЬНИК - "маленький" прямоугольник, который надо разместить на форме
Если требуется найти прямоугольник, одна из размерностей которого максимальна, то подразумевается, что среди прямоуг. с равными этими размерностями будет выбираться с наибольшей площадью.
Кстати, рекомендуется перед началом выполнения алгоритма отсортировать исходные прямоугольники по убыванию высоты.

Самое начало: задаем размер формы равным <ширина> x <высота = 0>.

1. Находим максимальный размер свободного прямоугольника на форме
2. Находим наиболее подходящий для него доступный прямоугольник.
2.1. Такой не существует - находим прямоугольник, высота которого максимальна, увеличиваем высоту формы на соответствующее значение (чтобы он влез) и переходим на п.1.
2.2. Такой существует - размещаем его на форме и помечаем в матрице, что соответствующее место занято и удаляем из доступных.
3. Находим все свободные прямоугольники на форме, ограниченные с 3-х сторон занятым пространством, ширина которых меньше, чем у наименее широкого из доступных.
4. повторяем п. 1.

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

В результате работы данного алгоритма в моей реализации ( http://sourceforge.net/projects/texpack ) упаковка получается порядка 80% - 98% (меньше бывает, если много крупных картинок, а размеры результирующих файлов не сильно больше).
Скорость могу указать лишь приблизительно (на глаз): 411 картинок размерами от 32х32 до 300х300 были размещены на двух формах 2048х2048 (заполнение 98% и 86%) примерно за 5 секунд на машине AMD Athlon 64 3000+ 1024Mb под управлением Gentoo Linux с ядром 2.6.15.

Это сообщение отредактировал(а) bsa - 6.4.2006, 22:30
PM   Вверх
Coriolis
Дата 7.4.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



Не, для меня 5 сек много. Тем более для такой машины.
Я исчу место по другому:
Т.к. прямоугольники должны лежать вплотную друг к другу, то я для того чтобы определить, поместится ли данный прямоугольник, пробую поместить его с каждым уже находящимся на форме прямоугольником каждым углом к каждому углу, т.е. 12 комбинаций + 12 для повёрнутого.
PM MAIL   Вверх
bsa
Дата 7.4.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: нет
Всего: 196



И что, быстрее?!?
У меня больше всего времени уходит на фактическое размещение картинок.
Кстати, а с чего ты взял, что прямоугольники ложатся вплотную?!?
Программа работала 4.46 сек. Прогнал через профилер:
12% загрузка картинок.
82% сохранение картинок
1.11% собственно размещение картинок (определение что и куда нужно поместить).
все остальное - тоже связано с фактическим размещением картинок.

Так что, скорость работы - 411 прямоугольников за 0.0446 сек. или по-научному 9,22 прям/мс.

А у твоего алгоритма какая скорость?
Кстати, хотелось бы и на него взглянуть.

Это сообщение отредактировал(а) bsa - 7.4.2006, 20:16
PM   Вверх
Coriolis
Дата 9.7.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 22.8.2005

Репутация: нет
Всего: 1



bsa, сорри что долго не отвечал - система уведомлений на этом форуме как всегда на высоте.
У меня вышел дуратский алгоритм, хоть и рабочий. Я потом наткнулся на статью англоязычную, с отличным алгоритмом, и сделал перевод.
Ссылка на переведенную статью
Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0922 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.