Есть блоки длиной 1..M и Ширина экрана N
Блоки идут по порядку, если есть место в строке для размещения следующего - добавляется в строку, иначе перенос строки
Нужно отсортировать блоки для минимизации места на экране. Я пока что просто сортирую по убыванию длины, но понятно что это не оптимально.
Есть какой-то стандартный алгоритм под это дело, не напомните?
Прямой перебор - это сложность по факториалу, а самому придумывать что то лень (думаю реально займет день), задача не так уж и важна,
Задача минимизации группировки
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Задача минимизации группировки
Вспомнил, есть задача упаковки, но там у прямоугольников разная ширина и высота, а у меня высота = const
-
- Уже с Приветом
- Posts: 3000
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
Re: Задача минимизации группировки
Задачи раскроя-упаковки бывают одномерные, двумерные, трехмерные и т.д. Ваша - классическая задача одномерного раскроя-упаковки. Задача NP-трудная, т.е. эффективных алгоритмов для поиска оптимального решения нет. Если вас не интересует гарантированная оптимальность решения, то простейшие эвристические алгоритмы дадут неплохой результат ("best fit decreasing", "first fit decreasing" и т.п.). А если нужно именно оптимальное решение - то либо перебор с отсечением (branch&cut), либо динамическое программирование.
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
Re: Задача минимизации группировки
Будет очень сомнительная эффективность у такого алгоритма, т.к. перестановка отдельных элементов в строке никак не повлияет на оптимизируемую функцию.
@OtherSide: Я бы на вскидку попробовал что-то вроде интерпретации "Simulated annealing":
1. Сгенерировал бы случайную последовательность элементов.
2. Рандомно переставлял бы элементы попарно между строками. Если перестановка улучшает целевую функцию, то оставлять. Если нет, то реализовать любую функцию вероятности, которая будет затухать от времени/итераций, постепенно снижая шанс выигрыша "плохой" перестановки. Иначе говоря плохая комбинация тоже должна иметь шанс быть принятой. Но со временем шанс должен стремиться к нулю.
Если есть возможность считать это на ГПУ, то это хорошо распараллеливается.
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Задача минимизации группировки
У меня порядка 10 элементов и javascript. На сервере не посчитать, потому что неизвестно какой экран у юзера.
Да и задача не такой уж важности, +/- одна лишняя строка на экране. Если готовый код не откопипастить, то и фиг с ним.
Да и задача не такой уж важности, +/- одна лишняя строка на экране. Если готовый код не откопипастить, то и фиг с ним.
-
- Уже с Приветом
- Posts: 3000
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
Re: Задача минимизации группировки
К алгоритму как таковому это замечание не имеет никакого отношения вообще. И ежу понятно, что данная задача решается с точностью до порядка расположения блоков в каждой строке, т.е. порядок в строке не важен.
Т.е. ваше замечание говорит лишь о том, что использовать в процессе перебора в качестве пространства решений упорядоченные перестановки блоков и делать перебор по таким перестановкам - неразумный подход. Частичное решение в данном случае будет формироваться из неупорядоченных наборов блоков для каждой строки: блоки с приписанной каждому блоку кратностью. То есть понятия "порядка расположения блоков в строке" вообще не вводится и в алгоритме никак не участвует.
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
Re: Задача минимизации группировки
Алгоритм я представляю такой.
Вначале пробуем отобрать все двойки, которые полностью заполняют строку.
Потом выкидываем, из списка, выбираем все тройки,
потом все четверки.
Если что то осталось - все двойки, которые на один символ меньше и т.д.
Вначале пробуем отобрать все двойки, которые полностью заполняют строку.
Потом выкидываем, из списка, выбираем все тройки,
потом все четверки.
Если что то осталось - все двойки, которые на один символ меньше и т.д.
-
- Уже с Приветом
- Posts: 13339
- Joined: 07 Dec 2004 04:00
- Location: Москва->CO
Re: Задача минимизации группировки
А эта задачка никак к линейному програмированию не относится? Если да, то библиотек с решалками ЛП вроде б до фига.
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
-
- Уже с Приветом
- Posts: 13339
- Joined: 07 Dec 2004 04:00
- Location: Москва->CO
Re: Задача минимизации группировки
Высота = конст есть частный случай произвольных высот, не?
Как же это вы без гравицаппы пепелац выкатываете из гаража? Это непорядок...
-
- Уже с Приветом
- Posts: 15770
- Joined: 01 Mar 2008 15:14
-
- Уже с Приветом
- Posts: 3000
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
Re: Задача минимизации группировки
<сарказм>
Да. Точно также так как любая одномерная задача является частным случаем десятимерной задачи, в которой входные данные просто по какому-то странному стечению обстоятельств оказались лежащими на одной прямой.
</сарказм>
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 549
- Joined: 07 Jan 2016 13:04
Re: Задача минимизации группировки
OtherSide, очень многое у Вас будет еще зависеть от возможности введения эвристик. Например, если вы знаете что максимальная длинна строки - 4 элемента, то для 10 элементов это всего 210 возможных комбинаций. Троек 120. Двоек 45. В итоге у вас получится гораздо меньшее число возможных комбинаций, чем факториал 10.
Далее, если возможно ввести критерий остановки, например, если одна из комбинаций легла в искомый диапазон (ширина экрана - погрешность), то можно просто драматически уменьшить вычислительную сложность.