多最低阈值约束下实现人员最多作业分配的最优贪心算法咨询
多阈值约束下作业分配最优贪心算法
核心设计目标
在满足多维度阈值递进要求、单用户最大权重上限J100的前提下,实现分配作业数量最大化,同时自动过滤无法帮助任何用户达到阈值的无效作业。
具体执行步骤
预处理环节
- 所有待分配作业按从小到大排序(小作业优先分配是最大化作业数量的核心前提,和原有从大到小的排序逻辑相反)
- 为每个用户初始化4个状态字段:
cur_weight:当前累计已分配权重,初始值为0cur_level:已达到的最高阈值等级,初始值为0(未达到任何阈值)next_threshold:下一级待达成阈值,初始值为第一级阈值T1remaining:剩余可分配容量,初始值为J100 - cur_weight
作业分配环节
遍历排序后的每一个作业,按以下规则分配:
- 无效作业校验:如果当前作业的大小 > 所有用户的
next_threshold - cur_weight,说明分配给任何用户都无法帮助其达成下一级阈值,直接弃置 - 筛选合格承接用户,需同时满足两个条件:
- 剩余容量
remaining≥ 当前作业大小 cur_weight + 作业大小≤next_threshold(避免超额占用容量,预留空间给后续小作业凑阈值)
- 剩余容量
- 对合格用户按优先级从高到低排序:
- 第一优先级:
cur_weight + 作业大小 == next_threshold(分配后刚好达成下一级阈值,无容量浪费) - 第二优先级:
cur_level更低(优先推进低阈值阶段的用户升级,覆盖更多阈值要求) - 第三优先级:
remaining更小(优先消耗剩余容量少的用户,保留大剩余容量的用户承接后续作业)
- 第一优先级:
- 将作业分配给优先级最高的用户,同步更新该用户的4个状态字段。如果用户分配后达到
next_threshold,则自动升级cur_level,更新next_threshold为下一级阈值,若已达到最高级阈值则next_threshold设为J100
收尾校验环节
所有作业遍历完成后,清空cur_level = 0用户的所有分配作业,转为弃置(未达到最低阈值要求的分配视为无效)
场景适配验证
原示例验证
示例参数:2名用户A、B,三级阈值为
T10、T20、T30,单用户上限J100;待分配作业为[J5,J10,J15,J20]
- 作业从小到大排序为
J5、J10、J15、J20 - 分配
J5:A、B均满足条件,且优先级相同,假设分配给B,B的cur_weight变为5 - 分配
J10:B的cur_weight +10 =15 < next_threshold 20,A的cur_weight +10=10 == next_threshold 10,A优先级更高,分配给A,A等级升级到1,next_threshold变为20 - 分配
J15:A的cur_weight+15=25 ≤ next_threshold 30,B的cur_weight+15=20 == next_threshold 20,B优先级更高,分配给B,B等级升级到2,next_threshold变为30 - 分配
J20:A的cur_weight+20=30 == next_threshold 30,优先级更高,分配给A,A等级升级到2 - 最终分配结果总作业数为4,和原有逻辑结果一致,满足最多作业要求
无效作业验证
如果仅存在大小为W5的作业,所有用户的next_threshold - cur_weight =10 >5,但没有用户分配后可以刚好达到T10,因此作业直接弃置,符合规则要求。
对比原有逻辑的优势
原有从大到小分配的逻辑,容易出现大作业占用容量导致大量小作业无法分配的问题,极端场景下:阈值T10,作业为[J1*10, J90],原有逻辑先分配J90,总作业数仅1;本算法先分配10个J1刚好达标,总作业数为10,更符合最大化作业数量的需求。
内容的提问来源于stack exchange,提问作者Sijan Shrestha
相关产品推荐
相关产品推荐

