Попалась интересная задачка. Нужен алгоритм решения.

Delphist 11.05.2004 - 12:49 | Есть N прямоугольников разного размера. Собрать из них новый большой прямоугольник с соотношением ширины/высоты максимально близким к A/B. Должны быть использованы ВСЕ исходные прямоугольники. Допускается наличие нескольких дырок внутри большого прямоугольника и/или неполный последний ряд: A +---------------------+ | | | +--+ | | | | | B | |1 | | | +--+ | | | | | | +-------+ | |2 +-------------+ Здесь 1 и 2 - дырки
Delphist 1 - 11.05.2004 - 12:52 | +---------------------+ |****A****************| |*********+--+********| |B********|**|********| |*********|1*|********| |*********+--+********| |*********************| |*********************| |*************+-------+ |*************|2 +-------------+ Здесь 1 и 2 - дырки
Delphist 2 - 11.05.2004 - 12:53 | Гадский скрипт Ж:( В общем, эту ASCII-картинку можно сделать Courier New шрифтом, будет ясно что требуется.
ПМ 3 - 11.05.2004 - 13:15 | В каком диапазоне находится N?
Delphist 4 - 11.05.2004 - 16:24 | N < 100 Хотя здесь это не критично.
Doid 5 - 11.05.2004 - 17:30 | (0) А можно привести и примероы парочку?
MatriXakep 6 - 11.05.2004 - 17:36 | Doid> Зачем примеры? Главное понять задачу примеров - без конца. (0)-> А разммеры прямоугольников могут быть 1x1 исходя из твоего ASCII картинки?
Delphist 7 - 11.05.2004 - 17:39 | Конечно, размеры могут быть произвольными, от единицы до мульёна. Прямоугольники могут быть квадратами.
Delphist 8 - 11.05.2004 - 17:43 | В паринципе, первая идея - найти 1) самый длинный прямоугольник 2) самый широкий прямоуголник . Затем составить из них букву Г и начать запихивать остальные внутрь этой буквы Г.
MatriXakep 9 - 11.05.2004 - 18:10 | Ага буква Г. А куда деваться с маленькими картонами их можно некуда девать
ACM2003 10 - 11.05.2004 - 18:16 | Скажи а А и В заданы!?
Doid 11 - 11.05.2004 - 18:21 | (6) Глядя на рисунки, я не совсем понял где там прямоугольники. Дырки увидел. Парочка примеров помогла бы понять условия полностью.
Doid 12 - 11.05.2004 - 18:22 | (+11) Или конец рабочего дня или одно из двух :)
Delphist 13 - 11.05.2004 - 19:51 | Да, A и B заданы как исходные данные, в течение одной расстановки не меняются.
Delphist 14 - 11.05.2004 - 19:55 | 2 Doid Попробую нарисовать еще раз. Надеюсь, сервер пропустит этот ASCII-арт 1111111111111111111 1000001100000011001 1000001111111111111 1111111999910011111 1111111111110019999 1000011000010019999 1111111111111119999 . Здесь 1 - границы, 0 - поверхность прямоугольников, 9 - дырки
Delphist 15 - 11.05.2004 - 19:59 | 2 MatriXakep > А куда деваться с маленькими картонами их можно некуда девать Ну, а если остались лишние финтифлюшки, то выкладываем их справа и внизу от уже заполненного прямоугольника (то, что было буквой Г) Хотя... Представляю это себе с трудом и нет удовлетворения от гладкого решения. Как представлю, такие сопли программировать с кучей if then else ...
Kabbalah 16 - 12.05.2004 - 02:22 | Помоему это типичная неполиноминальная задачка - один в один про раскройку листов...
Delphist 17 - 12.05.2004 - 18:06 | Да нет, листы строго заданного размера, а тут - главное пропорции соблюсти. > типичная неполиноминальная задачка Можно подробнее про такие задачи? В чем фишка?
Sabrian 18 - 13.05.2004 - 12:57 | В том что эту задачу невозможно решить за полиноминальное время, тоесть несуществует алгоритма решающего эту задачу за время С*N^A где A,C некоторые константы, а значит возможно что единственным алгоритмом будет перебор. А вообще с данной задачей хорошо должен справится генетический алгаритм, но он не гарантирует точного решения (скорее даже наоборот).
Sabrian 19 - 13.05.2004 - 12:58 | Тфу. АлгОритм
БАТЬКА 20 - 14.05.2004 - 08:54 | У у этой в задачи в общем виде нет решения. Либо условия в субже некорректно сфомулированы. :) Возьмем 3 куба без ограничения общности: 100*100, 20*20, 1*1. Где тут прямоугольник, неполный ряд или дырка? Вообще ахинея получается. Да и все равно, полиномиальной сложностью тут и не пахнет.
LongTom 21 - 14.05.2004 - 09:35 | При определенных условиях, может ли быть такое решение? 999111999 999101999 999111999 111111111 100191001 111111111 999111999 999101999 999111999 то есть крест? Про дырки не понятно. Где и какие дырки могут быть в собираемом "прямоугольнике", нужно определить критерии при которых ответ будет принят. То есть каким может быть вид конечного "прямоугольника". А то так получается что если нам дадут 2 прямоугольника начальных, то собираемый прямоугольник будет похожь на букву Г или Т или вот так "-". Будет ли принято 2 первых ответа если они будут отвечать критерию размеров А/В "Собрать из них новый большой прямоугольник с соотношением ширины/высоты максимально близким к A/B", значит ли это, что нам подойдет любой прямоугольник с размерами k*(A/B) то есть, должны быть соблюдены лишь пропорции прямоугольника? (если я не правильно понял, уточните что вы имели в виду)
Delphist 22 - 14.05.2004 - 10:58 | Да, главное - соблюсти пропорции. Вариант креста - не лучший, тем более, что нижнюю ветвь можно переставить в левый верхний угол. . Так что требований два 1) соблюсти пропорции при составлении общего прямоугольника 2) минимизировать кол-во дырок.
LongTom 23 - 14.05.2004 - 12:37 | В таком случае, самый простой вариант. Даже думать не надо. Берем два коэфициента пропорциональности, (минимальный) k1=(площадь всех прямоугольников)/(A*B) и (максимальный) k2=((длинна всех прямоугольников)*(максимальную ширину из этих прямоугольников))/(A*B) и простой бихотомией подбираем такое k при котором раскройка материала дает минимальный остаток ))). Для раскройки есть вседанные, размер материала, и размеры всех кусочков. Думаю за 64 итерации ответ будет найден в БОЛЬШЕНСТВЕ случаев. Сложность алгоритма = (сложности алгоритма раскройки)*log(2)(k2-k1) --- или что то типа того.
ващ 24 - 18.05.2004 - 13:49 | а что есть k и что такое бихотомия? мне интересен этот вопрос, т.к. сейчас занимаюсь задачей раскройки/упаковки
UE 25 - 18.05.2004 - 16:36 | 2ващ, я так понимаю, что это тоже самое, что и дихотомия ;)
:) 26 - 19.05.2004 - 12:29 | А также лоботомия и тахикардия...

>>