python排货规则算法,在一个仓库中,存在多个单号,每一个单号,有不同库龄和不同数量的货物,库龄大的优先出库,若某个单号每天出库10票,优先出库库龄大的,如果库龄最大的数量出完了,但是此单号还没出完10票,则开始出库龄第二大的,直到此单号出满10票为止,或者直至此单号库存为0为止,且此单号每天入库2票,则此单号新增两票库龄为1天的货物,然后在执行下一个新单号的出库和入库需求,连续30天以此类推,最终生成一个各个单号1-30天的库存变化的Excel表格,python代码怎么实现
时间: 2024-03-20 13:40:50 浏览: 72
web开发python常用代码,一步到位,新手必备
首先,我们需要将每个单号的库存信息保存到一个字典中,字典的键为单号,值为包含库存数量和库龄信息的元组。例如,单号为"001",库存数量为100,库龄为3天,则字典中的对应项应为:"001": (100, 3)。
接着,我们可以使用一个循环模拟30天的入库和出库操作。每次循环,我们遍历所有单号,按照库龄从大到小的顺序出库,直到某个单号出完10票或库存为0为止。如果某个单号出库不足10票,我们就从相邻的库龄较小的货物中补足数量,同时将库存中相应的货物库龄加1。出库完成后,我们再根据每个单号的入库需求,将新货物加入库存中。
最后,我们将每个单号每天的库存变化保存到一个二维列表中,再将其转化为Excel表格即可。
下面是一个可能的实现代码:
```python
import openpyxl
# 初始化单号信息字典
inventory = {
"001": (100, 3),
"002": (50, 2),
"003": (200, 1)
}
# 初始化每个单号的入库需求
incoming = {
"001": 2,
"002": 3,
"003": 5
}
# 初始化每个单号每天的库存变化列表
stock_changes = [[] for i in range(30)]
# 模拟30天的入库和出库操作
for day in range(30):
# 遍历所有单号
for item in inventory:
# 获取该单号的库存数量和库龄
stock, age = inventory[item]
# 如果该单号库存为0,则跳过出库操作
if stock == 0:
continue
# 计算该单号需要出库的数量
to_be_delivered = min(stock, 10)
# 从该单号的库存中按照库龄从大到小的顺序出库
for i in range(age, 0, -1):
if to_be_delivered == 0:
break
if inventory[item][1] == i:
# 出库数量不足10票,从相邻库龄的货物中补足数量
if to_be_delivered > stock:
to_be_delivered -= stock
inventory[item] = (0, age + 1)
# 出库数量足够,更新库存和出库数量
else:
inventory[item] = (stock - to_be_delivered, age)
to_be_delivered = 0
# 记录该单号当天的出库数量和库存变化
stock_changes[day].append((item, -to_be_delivered))
# 如果该单号出库数量不足10票,从相邻的库龄较小的货物中补足数量
while to_be_delivered > 0:
for i in range(age - 1, 0, -1):
if to_be_delivered == 0:
break
if inventory[item][1] == i:
stock = min(to_be_delivered, incoming[item])
inventory[item] = (inventory[item][0] + stock, i)
to_be_delivered -= stock
incoming[item] -= stock
# 记录该单号当天的入库数量和库存变化
stock_changes[day].append((item, stock))
# 处理所有单号的入库需求
for item in incoming:
inventory[item] = (inventory[item][0] + incoming[item], 1)
# 将每个单号每天的库存变化保存到Excel表格中
wb = openpyxl.Workbook()
ws = wb.active
ws['A1'] = 'Day'
for i in range(1, 31):
ws.cell(row=1, column=i+1).value = f"Day {i}"
for i, item in enumerate(inventory):
ws.cell(row=i+2, column=1).value = item
for j, change in enumerate(stock_changes):
stock = inventory[item][0]
for c in change:
if c[0] == item:
stock += c[1]
ws.cell(row=i+2, column=j+2).value = stock
wb.save('inventory.xlsx')
```
这段代码模拟了30天的入库和出库操作,并将每个单号每天的库存变化保存到了名为"inventory.xlsx"的Excel表格中。你可以根据实际需求修改代码中的初始库存、入库需求和运行天数等参数。
阅读全文