Как распределить товары с опциями и складами в заказы? Не получается решить задачу на комбинаторику, не знаю даже как называется данная проблема, но наверняка есть готовые библиотеки/функции/скрипты по ее решению. Есть товары и опции которые лежат на складах. Товар или опция может иметь фиксированное кол-во или быть бесконечной(вместо кол-ва указано 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}, ...]
Данная проблема, когда нужно распределить товары с опциями по складам в заказы, относится к задаче комбинаторной оптимизации или задаче о рюкзаке (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)
Этот код поможет распределить товары с опциями по складам в заказы и вывести информацию о максимальном количестве товаров в случае, если не хватает на складе. Необходимо использовать в своем проекте и доработать под свои нужды.
Данная проблема, когда нужно распределить товары с опциями по складам в заказы, относится к задаче комбинаторной оптимизации или задаче о рюкзаке (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)
Этот код поможет распределить товары с опциями по складам в заказы и вывести информацию о максимальном количестве товаров в случае, если не хватает на складе. Необходимо использовать в своем проекте и доработать под свои нужды.