如何修复基于不同列条件分配发货量的嵌套while循环问题
错误原因
你写的嵌套循环存在三个核心问题:
- 内层的额外发货while循环会在第一轮TO_SHIP分配时就把所有额外额度全部耗尽,所有额外包裹都分配给了第一次计算得到的最优门店,完全没有遵循逐包分配、每次重新计算最低库存周数门店的规则
- 额外包裹分配后没有同步更新
Wk_bal字段,分配逻辑的判断基准失准 - 额外发货没有按
[SUPPLIER, PRODUCTID]分组单独计算最优分配门店,和原有的普通发货分配规则不一致
修复方案
建议先完成所有普通发货(TO_SHIP)的分配,再按相同规则分配额外发货(EXTRA_SHIP),逻辑最清晰,可运行代码如下:
import pandas as pd # 原始数据初始化 df = pd.DataFrame({'SUPPLIER': ['SUP1', 'SUP1', 'SUP1', 'SUP2', 'SUP2', 'SUP2'], 'PRODUCTID': ['P1', 'P1', 'P1', 'P4', 'P4', 'P4'], 'STOREID': ['STR1', 'STR2', 'STR3', 'STR1', 'STR2', 'STR3'], 'BALANCE': [50, 6, 74, 35, 5, 54], 'AVG_SALES': [5, 4, 4, 3, 4, 7], 'TO_SHIP': [18, 18, 18, 500, 500, 500], 'EXTRA_SHIP': [2, 2, 2, 3, 3, 3],}) # 最优门店查找函数 def find_min(x): num_mins = x["Wk_bal"].loc[x["Wk_bal"] == x["Wk_bal"].min()].shape[0] if num_mins == 1: return(x["Wk_bal"].idxmin()) else: min_df = x.loc[x["Wk_bal"] == x["Wk_bal"].min()] return(min_df["AVG_SALES"].idxmax()) # 字段初始化 df['SEND_PKGS'] = 0 df['SEND_EXTRA_PKGS'] = 0 df['Wk_bal'] = (df['BALANCE']+1) / df['AVG_SALES'] # 第一步:分配普通发货TO_SHIP while (df['TO_SHIP'] != 0).any(): lowest_idx = df[df['TO_SHIP'] > 0].groupby(["SUPPLIER", "PRODUCTID"])[['Wk_bal', 'AVG_SALES']].apply(find_min) df.loc[lowest_idx, 'SEND_PKGS'] += 1 # 更新库存周数,包含已发普通包裹 df['Wk_bal'] = ((df['BALANCE']+1) + df['SEND_PKGS'] + df['SEND_EXTRA_PKGS']) / df['AVG_SALES'] df.loc[df['TO_SHIP'] > 0, 'TO_SHIP'] -= 1 # 第二步:分配额外发货EXTRA_SHIP,逻辑和普通发货完全一致 while (df['EXTRA_SHIP'] != 0).any(): lowest_idx = df[df['EXTRA_SHIP'] > 0].groupby(["SUPPLIER", "PRODUCTID"])[['Wk_bal', 'AVG_SALES']].apply(find_min) df.loc[lowest_idx, 'SEND_EXTRA_PKGS'] += 1 # 更新库存周数,包含已发额外包裹 df['Wk_bal'] = ((df['BALANCE']+1) + df['SEND_PKGS'] + df['SEND_EXTRA_PKGS']) / df['AVG_SALES'] df.loc[df['EXTRA_SHIP'] > 0, 'EXTRA_SHIP'] -= 1 # 输出结果 print(df[['SUPPLIER','PRODUCTID','STOREID','SEND_PKGS','SEND_EXTRA_PKGS']])
输出说明
运行后即可得到每个门店的普通发货量SEND_PKGS和额外发货量SEND_EXTRA_PKGS,完全符合你原有的最低库存周数优先、同最低选最高平均销量的分配规则。
内容的提问来源于stack exchange,提问作者its.kcl
相关产品推荐
相关产品推荐

