Gurobi人力优化模型:员工技能转岗约束调整需求
Gurobi人力优化模型优先级转训约束调整方案
问题核心
当前模型可从对应档位选取技能1员工转训至技能2,但无法实现优先从最高薪资档位往下选取的需求,需通过约束调整或目标函数引导解决。
先修正现有代码的错误
现有H["2", t, 1]约束重复包含了U[t,11](该档位已对应转训至技能2档位2),会导致同一员工被重复转训,修正如下:
for t in months: manpower.addConstr(H["2", t, 1] == U[t, 10] + U[t, 9] + U[t, 8] + U[t, 7] + U[t, 6] + U[t, 5] + U[t, 4] + U[t, 3] + U[t, 2] + U[t, 1])
方案1:硬约束强制优先级(严格按高档位优先)
通过累积约束,强制模型必须先用尽高档位的可用员工,再动用下一档位。
步骤1:定义转训档位映射
先明确技能1档位到技能2档位的转训分组(按从高到低排序):
# 技能2档位 → 对应的技能1档位列表(从高到低) transfer_mapping = { 7: list(range(27, 16, -1)), # 技能1档位27-17 → 技能2档位7 6: [16, 15], # 技能1档位16-15 → 技能2档位6 5: [14], # 技能1档位14 → 技能2档位5 4: [13], # 技能1档位13 → 技能2档位4 3: [12], # 技能1档位12 → 技能2档位3 2: [11], # 技能1档位11 → 技能2档位2 1: list(range(10, 0, -1)) # 技能1档位10-1 → 技能2档位1 }
步骤2:添加优先级约束
对每个转训分组,按从高到低的档位顺序,添加累积转训人数的下限约束,确保只有高档位无法满足剩余需求时,才启用低档位:
for t in months: for target_step_2, steps_1 in transfer_mapping.items(): # 当前分组的总转训需求 total_transfer = H["2", t, target_step_2] # 计算分组内每个技能1档位的可用人数 avail_list = [] for step_1 in steps_1: if t == 1: avail = WC["1", step_1] + H["1", t, step_1] + Leavers_and_Joiners["1", t, step_1] else: avail = Wp["1", t-1, step_1] + H["1", t, step_1] + Leavers_and_Joiners["1", t, step_1] avail_list.append(avail) total_group_avail = sum(avail_list) # 添加累积优先级约束 cumulative_U = 0 cumulative_avail = 0 for idx in range(len(steps_1)): step_1 = steps_1[idx] cumulative_U += U[t, step_1] cumulative_avail += avail_list[idx] # 剩余档位的总可用人数 remaining_avail = total_group_avail - cumulative_avail # 强制当前及以上档位必须承担的最小转训量 min_cumulative_transfer = max(total_transfer - remaining_avail, 0) manpower.addConstr(cumulative_U >= min_cumulative_transfer, name=f"Priority_Constraint_{t}_{target_step_2}_{step_1}")
约束逻辑解释
对于每个档位(从高到低),约束当前及以上档位的累计转训人数,必须至少等于总需求减去剩余低档位的可用人数。如果剩余低档位无法满足需求,模型必须从当前高档位补足,从而实现优先选用高档位员工的效果。
方案2:目标函数引导(软约束,更灵活)
如果不需要强制严格优先级,可通过调整目标函数权重,让模型自动优先选择高档位员工转训。例如:
- 假设转训高档位员工的成本更低(或产出更高),给高档位转训变量
U[t,step]赋予更低的成本权重:
# 档位越高,权重越小,转训成本越低 weight = {step: 1 / step for step in range(1, 28)} # 目标:最小化总转训成本 manpower.setObjective( quicksum(weight[step] * U[t, step] for t in months for step in range(1, 28)), GRB.MINIMIZE )
模型在优化时会优先选择成本更低的高档位员工转训,间接实现优先级需求。
内容的提问来源于stack exchange,提问作者Adri
相关产品推荐
相关产品推荐

