You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:40:10