Как распределить товары с опциями и складами в заказы? Не получается решить задачу на комбинаторику, не знаю даже как называется данная проблема, но наверняка есть готовые библиотеки/функции/скрипты по ее решению Есть товары и опции которые лежат на складах. Товар или опция может иметь фиксированное кол-во или быть бесконечной(вместо кол-ва указано 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_exceede # Пример использовани available_products = 1: {2: 7, 4: 3} 13: {2: 7, 4: 3} 21: {2: None, 4: None
Этот код поможет распределить товары с опциями по складам в заказы и вывести информацию о максимальном количестве товаров в случае, если не хватает на складе. Необходимо использовать в своем проекте и доработать под свои нужды.
Данная проблема, когда нужно распределить товары с опциями по складам в заказы, относится к задаче комбинаторной оптимизации или задаче о рюкзаке (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_exceede
# Пример использовани
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)
Этот код поможет распределить товары с опциями по складам в заказы и вывести информацию о максимальном количестве товаров в случае, если не хватает на складе. Необходимо использовать в своем проекте и доработать под свои нужды.