Всем привет. Пытаюсь решить следующую задачу. Есть несколько разных товаров. По каждому товару известно кол-во ящиков. Их надо распределить по машинам. Все машины имеют одинаковую вместимость (55 ящиков). Кол-во машин ограничено (это минимальное кол-во, достаточное для перевозки всех ящиков). Необходимо распределить ящики по машинам так, чтобы каждый товар находился в наименьшем количестве различных машин. Для товара с 30 ящиками идеально разместиться в 1 машине. Для товара с 60 ящиками - в 2 и т.д.
Не могу придумать, как это решить средствами Excel (как, впрочем, и любыми другими)
ок добавил 1 ЕСЛИ все, что помещается в одну машину, уедет одной машиной (или может в конце не поместиться, если количество коробок довольно близко к количеству мест в машинах)
Андрей VG написал: Ну, я думал, что ваш тёзка MCH откликнется
Для меня тема интересная. Алгоритм решения задачи вижу такой: Определяем минимальное количество машин: округлвверх(суммарное количество/вместимость) Груз, который больше вместимости в одну машины разделяем, 60 ящиков это 55+5 (но можно разделить и 50+10 или 45+15 и т.п.) Далее задачу сводим к задаче раскроя (упаковки в контейнеры) любым из алгоритмов.
В данном случае 718 ящиков очень легко распределить на 14 машин, подойдет и жадный алгоритм Если не получается распределить груз на 14 машин, то нужно принимать решения, какой груз разделяем по машинам и какое решением будет приемлемым. (например если весь товар по 30 ящиков, то невозможно его без разделения упаковывать в машины вместимостью 55)
Во вложении пример полуручного распределения груза по 14 машинам, в первом варианте распределяем по максимуму первые 13 машин, остаток в 14ю во втором варианте распределяем груз равномерно, 4 машины по 52 ящика и 10 машин по 51 ящику
MCH написал: Далее задачу сводим к задаче раскроя (упаковки в контейнеры) любым из алгоритмов.
В этом слабо разбираюсь, прошу подсказки. Мне же нужно не упаковать остаток коробок в наименьшее возможное число машин, а распределить по имеющемуся числу авто таким образом, чтобы минимизировать "разрывы" одного товара между машинами. Кажется, что это разные вещи. И алгоритмы для раскроя решают первую, а не вторую. Хотя может я не понимаю, как одно свести к другому (нет навыка решения таких задач).
Volounteer написал: Кажется, что это разные вещи. И алгоритмы для раскроя решают первую, а не вторую.
Примеры распределения, которые я привел не оптимальны? Они как раз и получены алгоритмом раскроя + небольшая эвристика когда необходимо распределять один товар по разным машинам
Цитата
Volounteer написал: Мне же нужно не упаковать остаток коробок в наименьшее возможное число машин, а распределить по имеющемуся числу авто таким образом, чтобы минимизировать "разрывы" одного товара между машинами.
У Вас уже задано - наименьшее возможное число машин. Если товары распределяются в указанные машины алгоритмом раскроя - то решение найдено Если не распределяется, то необходимо разделять товар между машинами. Минимальное количество распределяемого товара - это тот товар, количество которого больше вместимости машины Далее пытаемся минимизировать количество разделяемого товара, здесь уже нужно думать над алгоритмом поиска оптимального (или приемлемого) решения
А вот и формульное решение поспело на втором листе: =ЕСЛИ(И(СУММ(D$6:D6)<$B$1;СУММ($C7:C7)<$B7;МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6))>=ОСТАТ($B7;$B$1));МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6));) Правда оптимальность зависит от порядка расположения значений. Сортировка по убыванию и по возрастанию даёт не самый оптимальный результат. Надо немного доработать формулу. На первом листе неудачные попытки оптимизации.
Немного улучшил формулу. Для исходного и сортированного по убыванию даёт оптимальный результат (для имеющимся данных). Формула массива: =ЕСЛИ(МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6))=$B7-СУММ($C7:C7);$B7-СУММ($C7:C7);ЕСЛИ(И(СУММ(D$6:D6)<$B$1;СУММ($C7:C7)<$B7;МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6))>=ОСТАТ($B7;$B$1);$B8:$B$28-МУМНОЖ(Ч(+$C8:C$28);ТРАНСП($D$5:D$5^0))<>МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6)));МИН($B7-СУММ($C7:C7);$B$1-СУММ(D$6:D6));))
Светлый написал: даёт оптимальный результат (для имеющимся данных)
Сергей, исходный набор данных - 718 ящиков на 14 машин достаточно простой в распределении Значительно сложнее распределить 769 ящиков на 14 машин с наименьшим распределением по различным машинам
Коллеги, а рассматривался ли вариант с поиском решения в несколько итераций? Сначала раскладываем каждый товар в свою машину(ы), а затем в несколько шагов пытаемся сократить количество машин до минимума, перекладывая самые большие партии товара на свободные места в других машинах... Альтернативный способ: наоборот последовательно разложить весь товар в минимальное суммарное число машин, а затем сортировать его между машинами для достижения более оптимального размещения. А-ля визуализация процесса дефрагментации жесткого диска. Это также позволяет управлять приоритетами условий в решении задачи: что важнее разложить каждый товар по минимальному числу машин или перевезти весь товар наименьшим количеством машин...
IKor написал: Коллеги, а рассматривался ли вариант с поиском решения в несколько итераций?
Я собственно так и решал (в несколько итераций) 1. определяем количество машин 2. определяем, минимальное количество товаров которые нужно распределять (те, что не влезают в одну машину) 3. алгоритмом, подходящим для линейного раскроя пытаемся распределить груз с учетом определенного минимума к разделению груза между машинами 4. если на шаге 3 не удается найти решение, то пытаемся найти решения для разделения товаров в количестве min+1 (и т.д. до получения результата)
Решил поупражняться на случайных данных, 769 ящиков на 14 машин Если у кого нибудь получится найти адекватный алгоритм, сравните с найденными мной решениями
Данную задачу можно свести к решению линейным программированием Где целевой функцией будет минимизация стыков (распределения одного товара по разным автомобилям) при заданном количестве автомобилей.
Пример "ручного" построения модели во вложении, построенную модель решал уже через OpenSolver Теоретически решение задачи можно полностью автоматизировать и будет гарантированно найден оптимальный вариант (минимизация количества стыков).
А попробуйте задать ровно 55 ящиков какого-нибудь товара в файле из сообщения #10. В формуле все ">"&$B$1 надо заменить на ">="&$B$1. *И что делать, если товара больше, чем на две машины?