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

带顺序约束的任务-工人分配优化问题求解咨询

带连续约束的任务分配:最优与近似算法

针对你提出的「将连续索引的任务划分为N个连续子序列,最小化各工人总工作量差异」的问题,以下是可行的最优与近似解法:

最优解算法

1. 动态规划

这是解决此类带顺序约束划分问题的标准方法,能保证找到全局最优解。

预处理

先计算前缀和数组 s,其中 s[0] = 0,s[i] = w[0] + w[1] + ... + w[i-1](即前i个任务的总工作量)。

状态定义

设 dp[i][j] 表示将前 i 个任务分配给 j 个工人时,各工人总工作量的最小可能最大差值。

状态转移

  • 初始状态:dp[i][1] = 0(所有任务给一个工人,只有一个总工作量,差值为0)
  • 对于 j > 1,遍历所有可能的划分点 k(j-1 ≤ k < i,保证前k个任务能分给j-1个工人),计算将前k个任务分给j-1个工人的最小差值,结合当前段 s[i]-s[k] 的工作量,取所有可能情况中的最小最大差值:
    dp[i][j] = min{ max( dp[k][j-1], |(s[i]-s[k]) - current_min_workload|, |(s[i]-s[k]) - current_max_workload| ) }
    
    简化实现中,也可先通过动态规划找到「最小化最大工作量」的划分,再计算该划分下的实际差值,这是更常用的落地方式。

2. 二分查找+贪心验证

当任务数量k较大时,动态规划的O(k²N)复杂度较高,二分查找结合贪心验证的效率更优:

  • 步骤1:计算总工作量 total = sum(w),确定差值的搜索范围:最小为0(若能均分),最大为 total - min(w)(极端情况单工人拿所有任务)。
  • 步骤2:对候选差值 d,验证是否存在合法划分:
    • 假设目标是让所有工人的工作量落在 [L, L+d] 区间内,满足 N*L ≤ total ≤ N*(L+d)。
    • 从左到右累加任务,每当累加和超过 L+d 时,回溯到前一个任务作为划分点,同时确保当前段的工作量不低于 L。若能完成N段划分,则该差值d可行,尝试更小的差值;否则尝试更大的差值。

近似最优算法

若k极大,最优算法的复杂度无法接受,可采用贪心类算法快速得到近似解:

  • 贪心划分策略:计算平均工作量 avg = total / N,从左到右累加任务,当累加和超过avg时,比较「当前累加和」与「前一次累加和」哪个更接近avg,选择对应的位置作为划分点。重复此过程直到分成N段。
  • 迭代调整策略:先通过贪心得到初始划分,然后遍历相邻的划分点,尝试将边界任务从一个工人转移到另一个,若能减小整体差值则保留调整,直到无法优化为止。

你的示例分析

针对任务数组 w = [4,5,3,10,1,1,1,3],总工作量28,平均约9.33。你给出的次优划分{0,1,2}, {3}, {4,5,6,7}(总和12、10、6,差值6)已经是较优的结果;受连续索引约束限制,很难找到差值更小的划分方案。

内容的提问来源于stack exchange,提问作者Zaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 09:47:22