资源分配算法:时间约束下最小化任务分配成本的Python求解
任务分配成本最小化线性规划问题解答
现有建模与代码问题说明
正确部分
- 优化目标系数匹配给定的人力、设备、操作员单位工时成本,设定正确
- 单人力/单设备的最高8小时工时约束、3名人力/3台设备的总工时上限约束逻辑符合预设的实操场景要求
- 总物料处理量等式约束、设备与操作员工时匹配的约束逻辑方向正确
存在的问题
- 等式约束放置错误:设备总工时与操作员总工时相等的约束被放入了
A_ub(不等式约束矩阵),当前仅约束了设备总工时 <= 操作员总工时,缺少反向约束,无法保证两者完全相等,需将该约束移入A_eq等式约束矩阵 - 缺少操作员单工时上限约束:未添加
O1<=8、O2<=8、O3<=8的约束,不符合操作员最长工作8小时的规则 - 建模冗余:由于所有人力、设备、操作员的成本、效率参数完全一致,无需为每个个体单独设置变量,直接用总人力工时、总设备工时、总操作员工时3个变量即可完成建模,大幅简化模型复杂度
- 方法参数过时:
scipy.optimize.linprog的revised simplex方法已在新版本SciPy中弃用,推荐替换为highs方法,求解效率和稳定性更高
简化后正确实现代码
简化建模逻辑
仅设3个变量:
x1:总人力工时x2:总设备工时x3:总操作员工时
优化目标:最小化20*x1 + 30*x2 +15*x3
约束条件:x1 <= 80(最多10名人力,每人最长工作8小时,实操场景下可改为24匹配你设定的3人上限)x2 <= 24(最多3名操作员,对应最多3台设备同时运行,每台最长工作8小时)x3 <=24(最多3名操作员,每人最长工作8小时)x2 - x3 = 0(设备运行必须匹配对应操作员)10*x1 + 20*x2 =1000(总物料处理量达标)- 所有变量大于等于0
代码示例
from scipy.optimize import linprog # 目标函数系数 c = [20, 30, 15] # 不等式约束 A_ub @ x <= b_ub A_ub = [ [1, 0, 0], [0, 1, 0], [0, 0, 1] ] b_ub = [80, 24, 24] # 等式约束 A_eq @ x = b_eq A_eq = [ [0, 1, -1], [10, 20, 0] ] b_eq = [0, 1000] # 变量下界 bounds = [(0, None), (0, None), (0, None)] # 求解 res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs') print("最小成本:", res.fun) print("总人力工时:", res.x[0]) print("总设备工时:", res.x[1]) print("总操作员工时:", res.x[2])
常用的Python线性规划求解库
- SciPy linprog:无额外第三方依赖,适合小规模线性规划问题,适合快速验证简单模型
- PuLP:专门面向线性规划的建模库,语法贴近数学建模逻辑,代码可读性高,支持调用多种开源/商业求解器,适合中等规模运筹问题
- OR-Tools:谷歌开源的运筹学工具集,支持线性规划、整数规划、约束规划等多种问题类型,求解效率高,适合大规模复杂工业场景
- CVXPY:通用凸优化建模工具,支持线性规划、二次规划、半正定规划等多种凸优化问题,语法灵活,适合学术研究和复杂凸优化场景
内容的提问来源于stack exchange,提问作者Lopez
相关产品推荐
相关产品推荐

