Как распределить товары с опциями и складами в заказы? Не получается решить задачу на комбинаторику, не знаю даже как называется данная проблема, но наверняка есть готовые библиотеки/функции/скрипты по ее решению.
Есть товары и опции которые лежат на складах. Товар или опция может иметь фиксированное кол-во или быть бесконечной(вместо кол-ва указано None). При заказе можно скомбинировать один товар с несколькими опциями, соответственно нужно распределить заказанные товары с опциями по складам в заказы. Если товары в заказе можно отправить с нескольких складов, то нужно выбрать все их, если нельзя, то разбить на несколько заказов по складам. Есть ли у кого решение или хотя бы название данной проблемы?
Для наглядности(синтаксис Python'a). ID опций, товаров, складов взяты наобум, можно вставить свои.
Словарь со всеми имеющимися товарами, складами на которых он имеется и количеством(None - бесконечный) на этих складах {product_id: {warehouse_id: quantity}, ...}:{1: {2: 7, 4: 3}, 13: {2: 7, 4: 3}, 21: {2: None, 4: None}}
Аналогично опции(None - бесконечная) {option_id: {warehouse_id: quantity}, ...}:{3: {2: None, 4: None}, 10: {2: 10}, 9: {2: 10, 4: 10}, 8: {4: 2}}
Заказ, кол-во в данном случае определяет кол-во данного товара и кол-во каждой опции в данной комплектации, т.е. при количестве 2шт нужно взять 2шт товара и по 2шт каждой опции. Один и тот же товар с разными комбинациями опций рассматривается как отдельный:[{'product_id': 1, 'quantity': 2, 'options': [3, 10, 9]}, {'product_id': 1, 'quantity': 1, 'options': [3, 9]}, {'product_id': 13, 'quantity': 5, 'options': [10, 9]}]
На выходе хотелось бы получить что-то такое. order_products - ключ из массива заказа.
При невозможности отправки с одного склада:[{'warehouses': [4], order_products: [0, 1]}, {'warehouses': [2], order_products: [2, 3]}]
При возможности отправки с нескольких складов:[{'warehouses': [2, 4], order_products: [0, 1, 2, 3]}]
При возможности отправки с нескольких складов и только с одного склада:[{'warehouses': [2, 4], order_products: [0, 1]}, {'warehouses': [6], order_products: [3]}]
Товары в заказе(order_products) которых нет или не хватает на складе(учитывая опции) запихнуть в отдельный массив с максимальным кол-вом, например:limit_exceeded = [{'order_product': 1, 'max_quantity': 2}, ...]

21 Авг 2019 в 06:04
204 +1
0
Ответы
1

Данная проблема, когда нужно распределить товары с опциями по складам в заказы, относится к задаче комбинаторной оптимизации или задаче о рюкзаке (knapsack problem) в области дискретной оптимизации.

Для решения данной задачи можно воспользоваться алгоритмом динамического программирования, который позволит найти оптимальное распределение товаров с опциями по складам в заказы. Также можно воспользоваться методами жадного алгоритма или алгоритмов оптимизации, таких как генетические алгоритмы.

Вот пример кода на Python, который может помочь в решении данной задачи:

def distribute_products(available_products, available_options, orders):
result = []
limit_exceeded = []
for order in orders:
order_products = order['options']
warehouses = set()
total_products = []
for product_id in order_products:
for warehouse_id, quantity in available_options[product_id].items():
if quantity is not None and quantity < order['quantity']:
limit_exceeded.append({'order_product_id': product_id, 'max_quantity': quantity})
elif quantity is not None:
available_options[product_id][warehouse_id] -= order['quantity']
warehouses.add(warehouse_id)
total_products.append(product_id)
for product_id in [order['product_id']]:
for warehouse_id, quantity in available_products[product_id].items():
if quantity is not None and quantity < order['quantity']:
limit_exceeded.append({'order_product_id': product_id, 'max_quantity': quantity})
elif quantity is not None:
available_products[product_id][warehouse_id] -= order['quantity']
warehouses.add(warehouse_id)
total_products.append(product_id)
result.append({'warehouses': list(warehouses), 'order_products': total_products})
return result, limit_exceeded
# Пример использования
available_products = {
1: {2: 7, 4: 3},
13: {2: 7, 4: 3},
21: {2: None, 4: None}
}
available_options = {
3: {2: None, 4: None},
10: {2: 10},
9: {2: 10, 4: 10},
8: {4: 2}
}
orders = [
{'product_id': 1, 'quantity': 2, 'options': [3, 10, 9]},
{'product_id': 1, 'quantity': 1, 'options': [3, 9]},
{'product_id': 13, 'quantity': 5, 'options': [10, 9]}
]
result, limit_exceeded = distribute_products(available_products, available_options, orders)
print(result)
print(limit_exceeded)

Этот код поможет распределить товары с опциями по складам в заказы и вывести информацию о максимальном количестве товаров в случае, если не хватает на складе. Необходимо использовать в своем проекте и доработать под свои нужды.

20 Апр в 13:24
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 548 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир