
本文介绍一种高效、可扩展的方法,将多个带优先级的箱体(box)按日容量限制进行逐日分配,生成符合业务逻辑的分配结果表,核心在于模拟“贪心式流水线分配”过程。
本文介绍一种高效、可扩展的方法,将多个带优先级的箱体(box)按日容量限制进行逐日分配,生成符合业务逻辑的分配结果表,核心在于模拟“贪心式流水线分配”过程。
在生产调度、资源配给或物流分仓等场景中,常需将有限资源(如箱体容量)按时间维度(如每日可用容量)和业务优先级(Preference)进行有序分配。本教程提供一个健壮、清晰且可扩展的解决方案:基于排序+双指针贪心算法的逐日容量分配。
核心思路
分配逻辑本质是“流水线式消耗”:
- 所有箱体按 Preference 升序排列(1 优先级最高),形成待分配队列;
- 所有日期按 Day 升序排列,形成容量供给队列;
- 使用两个指针分别遍历箱体与日期,每次取二者当前剩余量的最小值作为本次分配量;
- 分配后更新双方剩余量;若某箱体耗尽 → 移动箱体指针;若某日容量用完 → 移动日期指针;
- 直至任一队列耗尽。
实现代码(含注释与优化)
import pandas as pd
from numba import jit
def allocate_boxes_by_day(df_boxes, df_days):
"""
按日容量与箱体优先级分配 box_cap
Parameters:
-----------
df_boxes : pd.DataFrame
必须包含列:'Box', 'box_cap', 'Preference'
df_days : pd.DataFrame
必须包含列:'Day', 'Capacity'
Returns:
--------
pd.DataFrame : 列为 ['Day', 'Box', 'box_cap'],每行表示某日对某箱体的分配量
"""
# ✅ 步骤1:严格按业务顺序排序(关键!)
df_boxes = df_boxes.sort_values('Preference', ignore_index=True)
df_days = df_days.sort_values('Day', ignore_index=True)
# ✅ 步骤2:提取底层数组(提升性能)
boxes = df_boxes['box_cap'].to_numpy(copy=True) # 剩余箱容
capacities = df_days['Capacity'].to_numpy(copy=True) # 剩余日容
# ✅ 步骤3:定义高性能分配内核(支持 Numba JIT 加速)
@jit(nopython=True)
def _allocate(boxes_arr, caps_arr):
box_i, cap_i = 0, 0
result = []
while box_i <h3>输出结果</h3><pre class="brush:php;toolbar:false;"> Day Box box_cap
0 1 1 16
1 1 2 7
2 2 2 9
3 2 3 15
关键注意事项
- 排序不可省略:Preference 和 Day 的升序是逻辑正确性的前提,否则分配顺序将错乱;
- 原地修改安全:.to_numpy(copy=True) 确保不污染原始 DataFrame;
- 边界鲁棒性:当总箱容 > 总日容时,仅分配完所有日容量即停止(剩余箱体不参与);反之亦然;
- 性能提示:对于万级箱体+千级日期规模,启用 @jit(nopython=True) 可提速 5–10×;若环境无 Numba,可直接移除装饰器,逻辑不变;
- 扩展建议:如需支持“跨日拆分禁止”(整箱必须单日完成),可在内层循环中添加 take = min(boxes_arr[box_i], caps_arr[cap_i]) 后判断是否 take == boxes_arr[box_i] 再决定是否推进指针。
该方案兼顾可读性、正确性与工程实用性,适用于真实产线排程、仓储分拣、广告库存分配等多种时序资源调度场景。










