乐于分享
好东西不私藏

【实战案例分享】同事用Excel算了3小时排产,我用Python 30秒搞定,老板看完请我吃了顿饭

【实战案例分享】同事用Excel算了3小时排产,我用Python 30秒搞定,老板看完请我吃了顿饭

今天,朋友火急火燎地找到我:

兄弟救命,我们主管给了我一道题,说算不出来就别下班。 我算了3小时,越算越乱,现在已经怀疑人生了……

我拿过来一看,就一张图👇

需求很明确:6小时内完成三类产品的产量目标,4条产线各有所长,怎么排产最大化产量

类型    数量
A       800
B       510
C       125

线体    擅长产品  速度(件/小时)
1       A或B      50
2       A         100
3       B         60
4       C         25

朋友咬着笔头说:"线1是A和B共用的……到底分多少给A、多少给B?我对着Excel算了3小时,主管说还差50件,让我再想想。"

我笑了笑:"3小时?给我30秒。"

一、先别急着写代码,把问题想透

我让朋友先别动手,在纸上把思路理一遍

问自己三个问题: ① 哪条线是"专用"的? ② 哪条线是"共享"的? ③ 共享线时间怎么分?

答案呼之欲出👇

  • 线2:只能产A,6h 满产 = 600 A
  • 线3:只能产B,6h 满产 = 360 B
  • 线4:只能产C,6h 最多 150 C(需求 125,所以只跑 5h就够)
  • 线1:A 和 B 共享,6h 是关键瓶颈

需求拆开看:

A 需求 800 - 线2满产600 = 还差 200 A
B 需求 510 - 线3满产360 = 还差 150 B

线1总共只有 6h × 50 = 300 件的产能。

朋友突然眼睛一亮:

等等,200 + 150 = 350 件需求,线1只能产 300…… 也就是说,无论怎么排,都必欠 50 件

没错。 这就是这道题的"命门"——线1是瓶颈,必欠50

剩下的事就简单了:优先满足谁? 主管说"A优先"。

→ 线1分 4h 给 A(产 200),2h 给 B(产 100) → B 还欠 510 - 360 - 100 = 50 ✓

整道题 30 秒算完。朋友看着我,像看神人。

我说:"别急,我写个脚本,下次主管再出这种题,你一键出答案。"

二、30行Python,把"思考过程"自动化

核心是两步:

  1. 枚举所有可能的工时分配
  2. 按优先级挑出最优解
from itertools import product



# 字典序优先级:A → B → C(业务决定)
priority = ['A''B''C']

# 1) 生成每条线的可能工时分配
defgen_alloc(line_id):
    prods = lines[line_id]
    max_steps = int(MAX_H / 0.5)
if len(prods) == 1:
for k in range(max_steps + 1):
yield {prods[0]: k * 0.5}
else:
for k1 in range(max_steps + 1):
for k2 in range(max_steps + 1 - k1):
yield {prods[0]: k1*0.5, prods[1]: k2*0.5}

# 2) 按优先级逐层筛选
allocs = list(product(*(gen_alloc(l) for l in lines)))
for p in priority:
    best = min(allocs, key=lambda a: max(0, demand[p] - 
        sum(tempo.get((l,prod),0)*h for l,alloc in zip(lines,a) for prod,h in alloc.items())))
    allocs = [a for a in allocs if (
        max(0, demand[p] - sum(tempo.get((l,prod),0)*h 
for l,alloc in zip(lines,a) for prod,h in alloc.items())) 
        == max(0, demand[p] - sum(tempo.get((l,prod),0)*h 
for l,alloc in zip(lines,[best]) for prod,h in alloc.items())))]

# 3) 输出最佳方案
print(dict(zip(sorted(lines), allocs[0])))

运行结果:

跟主管手算的答案完全一致 ✅

三、这个思路能复用到任何排产场景

这个题不是孤例。

我帮朋友做完题之后,主管第二天又扔过来一个新题——多了一条线、加了一个产品、约束变成了"每条线最多 8 小时"。

朋友说:"这次我没慌,把参数往脚本里一填,10 秒出答案。"

后来我们把这套脚本抽象成了一个通用模板👇

三个核心变量

  1. demand:每个产品的需求数量
  2. tempo:每条线在每个产品上的速度
  3. priority:业务上先满足谁

只要这三个参数定下来,不管产品多少、线多少、约束多复杂,算法都一样。

典型应用场景

  • 🏭 工厂排产(本文案例)
  • 📦 物流配送:多少辆车、跑几条路线、装什么货
  • 💼 团队排期:谁做什么、各占多少工时
  • 📚 课程表编排:教室、老师、班级怎么配
  • 💰 投资组合:资金怎么分给不同资产

本质上都是同一个问题资源有限 + 多个目标 + 优先级

四、源码和excel数据分享

我知道很多朋友看到代码就头大。直接拿去用:

前准本好类似下面的excel:

然后执行代码就可以得到结果:

最终得到自己想要的excel结果:

源码获取或交流

还需要本章或其他文章的源码和数据文件的同学,关注+三连,在对应文章下评论“6666“,加下面微信,发你!也可以拉你进群交流学习,加群备注:IT小本本学习

为了能随时获取最新动态,大家可以动动小手将公众号添加到“星标⭐”哦,点赞 + 关注,用时不迷路!!!!

关注公众号:IT小本本 👇

用时不迷路!!