Распределите количество товаров в ящиках по разному количеству заказов. - PullRequest
0 голосов
/ 20 июня 2020

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

import pandas as pd

a={'Bin 1': 12,
   'Bin 2': 1}

b={'Order 1': 5,
   'Order 2': 8}

bins = pd.DataFrame(a.items(), columns=['Bin', 'Items'])
orders =pd.DataFrame(b.items(), columns=['Order', 'Items'])

Распределение должно происходить, как показано здесь: image

I want to generate a new dataset or list of instructions that describes what elements from which bin have been assigned to which order:

  1. From Bin 1, 5 element(s) have been assigned to Order 1. Bin 1 has 7 Items left. #if order is full, move to the next order
  2. From Bin 1, 7 element(s) have been assigned to Order 2. Bin 1 has 0 Items left. #move to next bin
  3. From Bin 2, 1 element(s) have been assigned to Order 2. Bin 2 has 0 Items left.

Practically I would like to end up with a dataframe like this: результат

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

Заранее благодарим за любые предложения или идеи о том, как решить эту проблему.

1 Ответ

0 голосов
/ 21 июня 2020

Вот решение:

bins={'Bin 1': 12,
   'Bin 2': 1}

orders={'Order 1': 5,
   'Order 2': 8}

while len(orders) and len(bins): 
    order_name = list(orders.keys())[0]
    bin_name = list(bins.keys())[0]
    m = min(bins[bin_name], orders[order_name])
    print(order_name, bin_name, m)
    bins[bin_name] -= m
    orders[order_name] -= m
    if orders[order_name] == 0: 
        del orders[order_name]
    if bins[bin_name] == 0:
        del bins[bin_name]

Результат для этого случая:

Order 1 Bin 1 5
Order 2 Bin 1 7
Order 2 Bin 2 1
...