今天,朋友火急火燎地找到我:
兄弟救命,我们主管给了我一道题,说算不出来就别下班。 我算了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,把"思考过程"自动化
核心是两步:
枚举所有可能的工时分配 按优先级挑出最优解
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 秒出答案。"
后来我们把这套脚本抽象成了一个通用模板👇
三个核心变量:
demand:每个产品的需求数量tempo:每条线在每个产品上的速度priority:业务上先满足谁
只要这三个参数定下来,不管产品多少、线多少、约束多复杂,算法都一样。
典型应用场景:
🏭 工厂排产(本文案例) 📦 物流配送:多少辆车、跑几条路线、装什么货 💼 团队排期:谁做什么、各占多少工时 📚 课程表编排:教室、老师、班级怎么配 💰 投资组合:资金怎么分给不同资产
本质上都是同一个问题:资源有限 + 多个目标 + 优先级。
四、源码和excel数据分享
我知道很多朋友看到代码就头大。直接拿去用:
前准本好类似下面的excel:

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

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

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

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

夜雨聆风