Алгоритм группировки заданий на печать с минимальными отходами? - PullRequest
10 голосов
/ 10 апреля 2011

Я работаю в издательстве и настраиваю один из наших прессов для «группирования», другими словами, для одновременной печати нескольких заданий.Принимая во внимание, что разные задания на печать могут иметь разное количество, и может потребоваться рассмотреть от 1 до 20 заданий одновременно, проблема заключается в том, чтобы определить, какие задания группировать вместе, чтобы минимизировать потери (отходы, получаемые при перепечатке на меньшихколичество заданий в данном наборе, то есть).

Учитывая следующие стабильные данные:

  1. Все задания равны по пространственному размеру - размещение на бумаге не идет
  2. Существует три "полосы", означающие, что три задания могут быть напечатаны одновременно.
  3. В идеале, каждая полоса имеет одно задание.Частично проблема заключается в минимизации количества дорожек, на которых выполняется каждое задание.
  4. При необходимости одно задание может быть выполнено на двух дорожках, а второе - на третьей.
  5. "группировка «отходов от заданного набора заданий (скажем, их количество x, y и z) будет наибольшим числом минус два нижних числа.Таким образом, если x - это более высокое число, отходы группировки будут (x - y) + (x - z).В противном случае, отходы производятся путем печати задания Y и Z (сверх их количества) до количества X. Группировка отходов будет классификатором для данного набора, то есть она не может превышать определенное количество, или задание будетпросто напечатайте в одиночку.

Таким образом, задается вопрос: как определить, какие наборы заданий сгруппированы вместе, из любого заданного числа заданий, на основе квалификаторов 1) Три одинаковых количества ИЛИ2) Два количества, где одно примерно вдвое больше другого, И с целью минимального общего группирования отходов по различным наборам.

(Изменить) Информация о количестве: Типичные объемы работ могут быть от 150 до 350 на иностранных языкахили от 500 до 1000 на английских тиражах.Эти данные могут быть использованы для настройки некоторых сценариев для алгоритма.Например, скажем, у вас было 5 заданий:

1000, 500, 500, 450, 250

Глядя на это, я вижу пару ответов.Очевидно, что (1000/500/500) неэффективен, поскольку у вас будет групповая трата 1000. (500/500/450) лучше, так как у вас будет потеря 50, но затем вы запускаете (1000) и (250) один.Но вы также можете запустить (1000/500) с 1000 на двух линиях, (500/250) с 500 на двух линиях и затем (450) в одиночку.

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

(Конец редактирования)

... Излишне говорить, что это большая проблема.(Для меня.)

Я программист средней квалификации, но я не очень знаком с алгоритмами, и я не полностью изучен в области математики в этой области.Я I / P пишу что-то вроде программы грубой силы, которая просто пробует все опции, пренебрегая любым деревом опций, которое, кажется, имеет чрезмерную трата группировки.Тем не менее, я не могу не надеяться, что есть более простой и эффективный метод.

Я просматривал различные сайты, пытаясь узнать больше об алгоритмах в целом, и пробирался сквозь символы, ноидет медленноК сожалению, статьи Википедии на эту тему очень взаимозависимы, и трудно найти "в".Единственной вещью, которую я смог найти, было определение грубого типа алгоритма, который мне нужен: «Эксклюзивная кластеризация расстояний», говоря одномерно.

Я посмотрел на то, что мне кажетсябыть популярным алгоритмом на этом сайте, Bin Packing, но я не смог точно понять, как он будет работать с моей проблемой.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

Это похоже на проблему классического исследования операций по сокращению запасов.Для формальной математической обработки попробуйте http://en.wikipedia.org/wiki/Cutting_stock_problem

Я закодировал решения для проблем режущего материала с использованием техники отложенной генерации столбцов из статьи «Выбор и разработка эвристических процедур для решения задач обрезки валков» Роберта У.Хесслер (Sci. Management. Dec '88).Я проверил это до ста рулонов без проблем.Понимание того, как получить остатки от первой итерации, и использование их для создания нового уравнения для следующей итерации, довольно интересно.Посмотрите, сможете ли вы достать эту статью, так как автор обсуждает варианты, более близкие к вашей проблеме.

Если вы подходите к работающей технике, я рекомендую использовать способный решатель линейной алгебры, а не заново изобретать колесо,В то время как симплекс-метод достаточно прост, чтобы кодировать себя для дробных решений, то, с чем вы здесь работаете, сложнее - это смешанная целочисленная задача.Для современного C смешанного целочисленного решателя (MIP), использующего, например,.ветвление и привязка, с привязками Java / python я рекомендую lp_solve .

Когда я написал это, я нашел эту справочную страницу NEOS полезной.Онлайн решатель выглядит несуществующим (для меня он возвращает Perl-код, а не выполняет его).Еще есть некоторая справочная информация.

Правка - несколько примечаний: я суммирую различия между вашей проблемой и проблемой режущего материала: 1) режущий материал имеет входные длины, которые являются неделимыми.Вы можете смоделировать свои делимые проблемы, запустив задачу несколько раз, разбив задания на 1,0, {0,5, 0,5} времени.2) ваша карта «длина тиража» соответствует длине сечения 3) выберите большую длину материала

1 голос
/ 10 апреля 2011

Я собираюсь попытаться атаковать «идеальный» случай, в котором никакие задания не разбиты на полосы или напечатаны в одиночку.

Пусть n будет количеством заданий, округленным до ближайшего кратного 3. Можно создать фиктивные задания нулевой длины, чтобы число заданий было кратным 3.

Если n = 3, это тривиально, потому что есть только одно возможное решение. Итак, предположим, что n> 3.

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

Таким образом, если n = 6, у вас есть две группы работ, из которых самая длинная или равная имеет фиксированное наибольшее или совместное наибольшее количество заданий. Таким образом, единственный вопрос заключается в том, как организовать остальные 5 рабочих мест между группами. Формула для расчета отходов группировки может быть выражена как 2∑h i - ∑x j , где h i s - это наибольшие количества в каждой группе и x j s - остальные величины. Таким образом, переход от одного возможного решения к другому будет включать в себя замену одного из h на один из x. (Если вы поменяете местами один из h с другим h, или один из x с другим x, это не будет иметь никакого значения, поэтому вы бы не перешли к другому решению.) Поскольку h 2 фиксирован, и x 1 и x 2 бесполезны для нас, что мы на самом деле пытаемся минимизировать, это w (h 1, х 3 , х 4 ) = 2 ч 1 - (х 3 + х 4 ). Если h 1 <= x <sub>3 <= x <sub>4 , это оптимальная группировка, поскольку никакой своп не может улучшить ситуацию. (Чтобы увидеть это, пусть d = x 3 - h 1 и обратите внимание, что w (x 3 , h 1 , x 4 ) - ш (ч 1 , х 3 , х 4 ) = 3d, что неотрицательно и по симметрии одинаковы Аргумент справедлив для замены с x 4 ). Итак, это касается случая n = 6.

Для n = 9 у нас есть 8 заданий, которые можно перемещать, но опять же, бесполезно перемещать самые короткие два. Таким образом, формула на этот раз W (ч 1 , ч 2 , х 3 , х 4 , х 5 , х 6 ) = 2 ч 1 + 2 ч 2 - (х 3 + х 4 + x 5 + x 6 ), но на этот раз мы имеем ограничение, что h 2 не должен быть меньше второго наименьшего x в формуле (в противном случае она не может быть самой высокой или самой высокой в ​​любой группе). Как отмечалось ранее, h 1 и h 2 нельзя поменять местами друг с другом, поэтому либо поменяйте местами один из них с соответствующим x (без нарушения ограничения), либо вы поменяйте местами их обоих, каждый с отличным х. Взять h 1 <= x <sub>3 <= x <sub>4 <= h <sub>2 <= x <sub>5 < = х 6 . Опять же, одиночные свопы не могут помочь, и двойной своп тоже не может помочь, потому что его эффект обязательно должен быть суммой эффектов двух отдельных свопов. Опять же, это оптимальное решение.

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

Я подумаю о неидеальных случаях и обновлю этот ответ, если что-нибудь придумаю.

0 голосов
/ 10 апреля 2011

Если я понимаю проблему (и я не уверен, что понимаю), решение может быть простым: печать задания 1 на всех трех дорожках, затем работа 2 на всех трех дорожках, а затем работа 3 на всех трех дорожках.

В худшем случае печатается два дополнительных листа на задание.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...