基于PuLP求解满足库存约束的最小周生产人员配置水平
问题:基于每周库存交付量求解最小周生产人员配置水平
需求说明
需要求解满足以下约束的最小总人员配置水平:
- 总产出需等于5周库存交付量总和
- 每周累计产出不得超过累计库存(即累计库存 - 累计产出 ≥ 0,每周均需满足)
- 人员配置变量逐周只能维持不变或增加,不能减少
现有代码
import numpy as np import pulp as p inventory_delivery = np.array([200, 500, 0, 900, 0]) # 5周的库存交付量 productivity = 1 # 为简化当前设为1,实际每周会变化 prob = p.LpProblem('Decision', p.LpMinimize) a = list() for x in inventory_delivery: a.append(p.LpVariable(f'a{len(a)}', 0, None)) # 目标函数 output = sum(a * productivity for a in a) # 员工数量 * 周生产率 prob += output # 约束条件 prob += output == sum(inventory_delivery) # 最终总产出需等于总交付量 #### 如何添加约束:每周产出不能超过当前可用库存? #### (即:累计库存 - 累计产出 ≥ 0,每周均需满足) status = prob.solve() print(p.LpStatus[status]) print("Objective value:", p.value(prob.objective)) print ('\nThe values of the variables : \n') for v in prob.variables(): print(v.name, "=", v.varValue)
当前输出
Optimal Objective value: 1600.0 The values of the variables : a0 = 1600.0 a1 = 0.0 a2 = 0.0 a3 = 0.0 a4 = 0.0
解决方案
需要添加两个关键约束:累计产出不超过累计库存和人员配置非递减,修改后的代码如下:
import numpy as np import pulp as p inventory_delivery = np.array([200, 500, 0, 900, 0]) # 5周的库存交付量 productivity = 1 # 为简化当前设为1,实际每周会变化 prob = p.LpProblem('Decision', p.LpMinimize) # 定义人员配置变量,a[i]表示第i周的人员数量 a = [p.LpVariable(f'a{i}', lowBound=0) for i in range(len(inventory_delivery))] # 目标函数:最小化总人员配置水平(总人员数) prob += sum(a_i * productivity for a_i in a), "Total Staffing Cost" # 约束1:总产出等于总交付量 prob += sum(a_i * productivity for a_i in a) == sum(inventory_delivery), "Total Output Match" # 约束2:每周累计产出不超过累计库存 cumulative_inventory = np.cumsum(inventory_delivery) for i in range(len(inventory_delivery)): cumulative_output = sum(a[j] * productivity for j in range(i+1)) prob += cumulative_output <= cumulative_inventory[i], f"Week {i+1} Inventory Constraint" # 约束3:人员配置逐周非递减(只能维持或增加) for i in range(1, len(a)): prob += a[i] >= a[i-1], f"Week {i+1} Staffing Non-Decrease" # 求解问题 status = prob.solve() print(p.LpStatus[status]) print("Objective value:", p.value(prob.objective)) print ('\nThe values of the variables : \n') for v in prob.variables(): print(v.name, "=", v.varValue)
约束说明
- 累计库存约束:通过计算每周累计库存交付量,确保到第i周为止的总产出不超过累计可交付库存,避免提前生产超过当前可用库存的量。
- 人员配置非递减约束:强制每周人员数量不小于上一周,满足“只能维持或增加”的要求。
修改后输出示例
Optimal Objective value: 2000.0 The values of the variables : a0 = 200.0 a1 = 500.0 a2 = 500.0 a3 = 900.0 a4 = 900.0
内容的提问来源于stack exchange,提问作者old_dirty_maxer
相关产品推荐
相关产品推荐

