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

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

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

  • Все задания равны по размеру - размещение на бумаге не учитывается.
  • Существует три "полосы", что означает, что одновременно можно печатать три задания.
  • В идеале каждая полоса имеет одно задание. Часть проблемы сводится к минимуму того, сколько полос проходит каждое задание.
  • При необходимости одно задание может выполняться на двух дорожках, второе задание на третьей полосе.
  • Отходы группировки из заданного набора заданий (пусть, величины из них - x, y и z) будут наивысшим числом за вычетом двух меньших чисел. Поэтому, если x - большее число, отходы группировки будут (x - y) + (x - z). В противном случае отходы производятся путем печати заданий Y и Z (превышение их количества) вплоть до количества X. Отходы группировки будут квалификатором для данного набора, то есть он не может превышать определенное количество, или работа будет просто печатайте в одиночку.

Итак, задан вопрос: как определить, какие наборы заданий сгруппированы вместе, из любого заданного количества заданий, на основе квалификаторов 1) Три одинаковых количества OR 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, но я не смог точно определить, как он будет работать с моей проблемой.

Ответ 1

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

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

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

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

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

Ответ 2

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

Пусть 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, x 3, x 4) = 2h 1 - (x 3 + x 4суб > ). Если h 1 <= x 3 <= x 4, это оптимальная группировка, потому что никакой обмен не может улучшить ситуацию. (Чтобы увидеть это, пусть d = x 3 - h 1 и учтите, что w (x 3, h 1, x 4) - w (h 1, x 3, x 4) = 3d, -негативный, и по симметрии тот же аргумент выполняется для замены с помощью x 4). Так что дело с случаем n = 6.

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

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

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

Ответ 3

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

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

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