powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Прямоугольники
25 сообщений из 28, страница 1 из 2
Прямоугольники
    #34514167
Slonyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите с задачкой.
даны прямоугольники со сторонами параллельными осям координат. требуется найти прямоугольник максимальной площадью который бы покрывал исходные прямоугольники. пустых мест не должно быть. прямоугольники можно разворачивать на 90 градусов и прямоугольники могут перекрываться.
нужно найти примерный алгоритм.
заранее спасибо.
...
Рейтинг: 0 / 0
Прямоугольники
    #34514176
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slonyaraданы прямоугольники со сторонами параллельными осям координат.
Это понятно.

Slonyaraтребуется найти прямоугольник максимальной площадью который бы покрывал исходные
Максимальной? Может, минимальной?

Slonyaraпустых мест не должно быть.
Пожалуйста, сформулируйте эту фразу как-нибудь попонятнее.

Slonyaraпрямоугольники можно разворачивать на 90 градусов
Как именно их можно разворачивать? Вокруг центра? Вокруг любого угла? Еще как-нибудь?

Slonyaraзаранее спасибо.
В общем, сформулируйте получше. Хотя бы аккуратно скопируйте из той книжки или тетрадки, откуда Вы ее взяли.
...
Рейтинг: 0 / 0
Прямоугольники
    #34514406
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slonyaraданы прямоугольники со сторонами параллельными осям координат. требуется найти прямоугольник максимальной площадью который бы покрывал исходные прямоугольники. пустых мест не должно быть. прямоугольники можно разворачивать на 90 градусов и прямоугольники могут перекрываться.
нужно найти примерный алгоритм.
заранее спасибо.

1) В постановке есть противоречия. Если пустых мест не должно быть, то задача должна накладывать ограничения на кратность длин сторон прямоугольников {A}. В противном случае, можно сразу констатировать ОТСУТСТВИЕ РЕШЕНИЯ ДЛЯ ОБЩЕГО СЛУЧАЯ.

2) Читаем далее - и еще больше удивляемся. "...прямоугольники могут перекыватся...". Это как? Есть ли критерий? Или можно перекрыть как угодно. В таком случае я беру самый крупный прямоугольник A1, последовательно укладываю в него все остальные A2...An (не нарушая условий) и объявляю A1 искомым прямоугольником B. В данном случае РЕШЕНИЕ ТРИВИАЛЬНО!

3) Ну и, конечно-же как правильно подметил коллега, следует искать не максимальный а минимальный прямоугольник, потому-как поиск маскимального лишён смысла.

Вообще складывается впечатление, что автор озвучил задачу "своими словами", потеряв в процессе смысл оригинально постановки. А посему... я вопрошая - а хде собсно исходная?
...
Рейтинг: 0 / 0
Прямоугольники
    #34514547
Slonyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
окей, попробую еще раз.
условия задачи на английском и записывал я условия в начале семестра.
смысл такой.
из множества прямоугольников разныз широт и высот нужно собрать один причем ограничения по ширине и высоте таковы: 1/2<=b/a<=2 (где а и b высота и ширина соотв.)
исходные прямоугольники можно разворачивать, поворачивать вокруг чего угодно, т.е ставить на "попа" или ложить.
ограничения на перекрытия есть, но я точно не помню какие. скорее всего не больше одного слоя. т.е. чем меньше перекрытий тем лучше.

надеюсь пролил хоть немного света....

П.З. неужели за время учебы мой русский настолько испортился что даже условия задачи объяснить не могу :(
...
Рейтинг: 0 / 0
Прямоугольники
    #34514564
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK. Если я правильно понял, условия таковы: даны N прямоугольников, нужно разместить их на плоскости так, чтобы они без пропусков накрыли прямоугольник максимальной площади, причем с отношением сторон в указанных пределах.

Любопытная задачка, неочевидная и с известными сходу не ассоциируется. Вообще по первому взгляду возникает ощущение, что гарантированно решается только перебором.
...
Рейтинг: 0 / 0
Прямоугольники
    #34514596
Slonyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нужен только примерный (aproximate) алгоритм.
есть какние-нить идеи?
уже довольно долго бьюс над этой задачкой и ничего путного в голову не приходит.
думал вначале отсортировать прямоугольники по убывающей и потом один за одним добавлять в одну линю выравнивая по верхней точке первого прямоугольника предварительно развернув те, у которых высота больше ширины. затем начиная с конца по одному добавлять их в следущую строку и так далее. пока на достигну примерно нужного отношения сторон. и в конце заполню пустые промежутки путем сдвигания одной из сторон.
но думаю должно быть более элегантное решение.
...
Рейтинг: 0 / 0
Прямоугольники
    #34515349
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slonyaraно думаю должно быть более элегантное решение.
Думаю, верное решение пригодилось бы гораздо больше, нежели элегантное :)

А что касается верного.... на свежую голову я вижу доказательство того, что эта задача np-полна. Так что если Вам удастся найти решение со сложностью меньше O(n!), прославите нашу страну в веках :)
...
Рейтинг: 0 / 0
Прямоугольники
    #34515468
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка мне очень напоминает покрытие пола линолеумом из кусочков.

Я бы предложил следующий подход:

1. Выделить множество крупных прямоугольников {A big} (критерий выборки - нечёткий. Это может быть либо площадь, либо минимальная сторона). Выложить из них периметр прямоугольника B. Здесь задача еще решается конечным количеством шагов и можно применить строгие проверки на отсутствие дырок в периметре.

2. Оставшееся пространство (в середине комнаты), можно заполнить случайным образом из оставшихся прямоугольников {A small}, руководтсвуясь нечёткими критериями. (Наложить сетку, использовать какие - нибудь ГА, для выбора координат и ориентации и т.п.) Здесь вариантов реализации будет масса и все они - одинаково правильны.

3. Если {A small} не хватит, то можно вернутся на шаг 1 и уменьшить периметр B (скажем на 5%) и повторить шаг 2, до тех пор, пока сетка не будет содержать дырок.

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

Привожу картинку для (1) шага алгоритма.
...
Рейтинг: 0 / 0
Прямоугольники
    #34515501
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗадачка мне очень напоминает покрытие пола линолеумом из кусочков.
Не совсем.

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

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

2. Площадь "внутренней дырки" при этом оказывается сравнимой с площадью оставшихся "маленьких прямоугольников".

Если присмотритесь, эта задачка подозрительно напоминает задачку о делении камней на две кучки :)
...
Рейтинг: 0 / 0
Прямоугольники
    #34515648
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНе думаю, что эта эвристика даст хорошие результаты. По разным причинам, из которых первая же - попробуйте придумать критерий выбора, рассчитываемый за полиномиальное время, такой, что:

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

2. Площадь "внутренней дырки" при этом оказывается сравнимой с площадью оставшихся "маленьких прямоугольников".


Я понял вашу мысль. Вас интересует принципиальная возможность заполнения дырки в этом бублике. Думаю, что этот вопрос решается введением итераций в предложный мной алгоритм с учетом нехватки "сеточного" пространства для оставшихся {A small}.

По поводу периметра.

С учетом отсутствия явных ограничений на перекрытие, я утверждаю, что выложить периметр можно ВСЕГДА с количеством прямоугольников, начиная от четырёх (как я привёл на рисунке).
Другое дело, насколько близко мы прибизимся к рекорду площади минимального прямоугольника B.

Кстати, предлагаю рассмотреть максимально возможную площадь Smax=Sum {Ai}, и площадь прямоугольника B равную Sb. Сравнение этих двух площадей будет хорошим критерием близости к наилучшему (гипотетическому решению). В алгоритм-же следует ввести некий критерий sEpsilon.

Код: plaintext
1.
2.
3.
| Smax - Sb | = sEpsilon

sEpsilon -> min

Кстати, можно придумать еще одно утвердение для шагов алгоритма.

Код: plaintext
1.
2.
Sb < Smax или 
Sb = Smax

Если вдруг на (1) шаге мы получили Sb > Smax то изначально очевидно, что дырка в нашем бублике не заполнится.
...
Рейтинг: 0 / 0
Прямоугольники
    #34515746
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ понял вашу мысль. Вас интересует принципиальная возможность заполнения дырки в этом бублике.
Не только. Меня интересует еще и отсутствие варианта "кучу маленьких прямоугольников заведомо будет некуда класть".

maytonС учетом отсутствия явных ограничений на перекрытие, я утверждаю, что выложить периметр можно ВСЕГДА
Безусловно. В том, что этот алгоритм даст некий ответ, я не сомневаюсь. Я сомневаюсь в том, что он сможет сочетать более-менее хороший ответ с разумным временем счета.

maytonКстати, предлагаю рассмотреть максимально возможную площадь Smax=Sum {Ai}, и площадь прямоугольника B равную Sb. Сравнение этих двух площадей будет хорошим критерием близости к наилучшему (гипотетическому решению).
Оно-то конечно, вот только ответа на заданные мной вопросы никак не дает.

P.S. Я не то чтобы требую от Вас чего-то... просто задачка действительно нетривиальная, с наскока не раскусишь.
...
Рейтинг: 0 / 0
Прямоугольники
    #34515857
Фотография Alex721
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton А по моему, надо выбрать нулевую точку и относительно нее наращивать вправо и вниз (в любую четверть например)

* ------->
|
|
|
\/
...
Рейтинг: 0 / 0
Прямоугольники
    #34515906
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerНе только. Меня интересует еще и отсутствие варианта "кучу маленьких прямоугольников заведомо будет некуда класть".

Я тоже думал об этом. Сейчас появилась мысль о принципиальной решабельности задачи в некоторых условиях. Мне удалось создать набор прямоугольником для которого не удаётся найти максимальный вложенный прямоугольник B без дырок. Это необходимо ввести в дополнительное условие задачи.

Возможно, моё утверждение о построении периметра из 4 любых прямоугольников требует дополнений. Чуть позже я их постараюсь озвучить.

В целом, я согласен, что задачка нетривиальная и требует рассмотрения множества направлений в оптимизации (по скорости отклика алгоритма, по качеству решения, и проч. критерии типа пропорций и т.п.).
...
Рейтинг: 0 / 0
Прямоугольники
    #34516078
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯМне удалось создать набор прямоугольником для которого не удаётся найти максимальный вложенный прямоугольник B без дырок. Это необходимо ввести в дополнительное условие задачи.
Рисунок приведите плиз.. что-то сомнительно :-). Возмите квадрат стороной в 1 пиксель(он накрывается целиком) и расширяйте пока возможно.. максимальный по площади прямоугольник всегда существует(но может и не единственен естественно)..
...
Рейтинг: 0 / 0
Прямоугольники
    #34516129
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Палестинец

Попробуйте решить задачу Слоняры для данного набора прямоугольников.
...
Рейтинг: 0 / 0
Прямоугольники
    #34516174
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Прямоугольники
    #34516179
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это конечно же приближенное решение ибо существует и большей площади :-)
...
Рейтинг: 0 / 0
Прямоугольники
    #34516225
abecadlo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А тупым ограниченным перебором получить приблизительное решение?
Ssum - суммарная площадь заданных прямоугольников
Smax - макс площадь среди заданных прямоугольников
deltaS , к примеру = 0.005*Ssum
deltaR , к примеру = 0.005
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
BestS =  0 
BestR =  0 
for s from Ssum to Smax step -deltaS loop // по площади
   for r from  1  to  2  step deltaR loop // по соотношению сторон
      // а здесь проверяем, можем ли мы покрыть такой прямоугольник заданными
      if can_cover_rectangle( s, r ) then 
        BestS := s
        BestR := r
        exit
      end if
   end loop r
end loop s
...
Рейтинг: 0 / 0
Прямоугольники
    #34516315
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПопробуйте решить задачу Слоняры для данного набора прямоугольников.
Ну, лично я решал бы ее так:
...
Рейтинг: 0 / 0
Прямоугольники
    #34516401
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну.. не знаю. Моё видение постановки было таково, что прямоугольники нельзя резать. Хотелось-бы услышать мнение автора по этому поводу.
...
Рейтинг: 0 / 0
Прямоугольники
    #34516437
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен, автора можно понять двояко.

требуется найти прямоугольник максимальной площадью который бы покрывал исходные прямоугольники

Я в принципе сразу прикинул, что перекрывающиеся прямоугольники эквивалентны тому, как если бы один из них сдвинули "за пределы покрывающего прямоугольника" и больше об этом не думал.... Но в Вашем примере попытка "задвинуть под другой" приведет к вылезанию хвоста с другой стороны.... так что может Вы правы и задачка еще сложнее, чем я думал.
...
Рейтинг: 0 / 0
Прямоугольники
    #34516593
Фотография Палестинец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для приближённого алгоритма при большом количестве исходных прямоугольников - можно сначала склеивать маленькие прямоугольники в большие и оперировать уже склееными прямоугольниками как исходными для задачи (это к вопросу о быстродействии алгоритма).
...
Рейтинг: 0 / 0
Прямоугольники
    #34517363
Slonyara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.
спасибо за отклики
несколько вопросов и мнений:

автор MaytonВыделить множество крупных прямоугольников {A big} (критерий выборки - нечёткий. Это может быть либо площадь, либо минимальная сторона). Выложить из них периметр прямоугольника B
по какому принципу определять длину каждой из сторон прямоугольника В? ведь может выйти так что я выложу только одну сторону а на остальные не хватит выбранных прямоугольников.
хотя... можно просчитать по площади прямоугольника В...

автор MaytonМоё видение постановки было таково, что прямоугольники нельзя резать
да, прямоугольники нельзя резать. но не исключено, что слишком длинные прямоуголники "мешающие" решению в некоторых случаях придется удалять... незаметно от препода :)


автор MaytonПопробуйте решить задачу Слоняры для данного набора прямоугольников.
думаю для такого набора прямоугольников задача не имеет решения
...
Рейтинг: 0 / 0
Прямоугольники
    #34517424
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Slonyara

Прошу прощения. Мне сейчас некогда. Но вы можете обратится с этими-же вопросами к форуму. Возможно вечером (в 21.00) я снова присоединюсь к дискуссии.

С уважением
Mayton
...
Рейтинг: 0 / 0
Прямоугольники
    #34519487
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slonyaraпо какому принципу определять длину каждой из сторон прямоугольника В? ведь может выйти так что я выложу только одну сторону а на остальные не хватит выбранных прямоугольников.
хотя... можно просчитать по площади прямоугольника В...

Может быть и такое. Повторяйте алгоритм, уменьшая пропорции периметра (например на 5-15%).

Мы вам дали направление, в котором можно писать алгоритм. Заранее оговорюсь что он не канонизирован и поэтому безсмысленно сейчас доказывать или опровергать, преимущества одних подходов перед другими, не написав ни строчки кода. Практика и только практика расставит все точки над i.

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

Начните хотя-бы с самого первого.

Не пытайтесь искать наилучшее решение для общего случая! Его ИМХО невозможно найти за реальное (не бесконечное) время. Ищите оптимальное. Особенно в условиях "непрерывности" размеров {A}, что сводит на нет усилия по применению "комбинаторных" решений.

Хорошей практикой будет следующее - запустить алгоритм в фоновом потоке, дав ему лимит времени 1-2 минуты, и собрав набор решений, остановить поток, и выдать в результаты, отсортировав по критерию качества в убывающием порядке (площадь прямоугольника B). Для введения возможности "рыскания" алгоритма по различным оптимальным раскладам, в него можно ввести некий "случайный фактор" и запускать многократно. Например, из прямогуольников периметра формировать различные наборы покрытий, меняя в зависимости от "фактора" порядок и ориентацию прямоугольников {A}.


нельзя резать. но не исключено, что слишком длинные прямоуголники "мешающие" решению в некоторых случаях придется удалять... незаметно от препода :)

Я думаю, не стоит этого делать. Препод может специально задать "краевые" начальные данные, чтобы подёргать алгоритм на прочность.

Для упрощенной проверки сделайте в начале алгоритма ряд тестов типа

Код: plaintext
1.
2.
3.
если Площадь(BoundingBox{Ai})> Sum{Площадь(Ai)} для i= 0 ..N то
    вывод "Решений не существует!"
конец если

Это должно отбросить 99.9% тех маргинальных случаев, образец которого я привел на последней картинке. Об оставшемся проценте исходных данных (если они будут), мне ничего не известно. Подумайте над этим сами.

На этом я закругляюсь, и желаю вам успехов.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Прямоугольники
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]