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

16个破碎锤配重分4组组重差≤1磅的自动分组算法求解

破碎锤配重自动分组实现方案

核心算法逻辑

这个问题属于固定数量分组的重量均衡问题,针对16个配重分4组每组4个的场景,用「贪心初始分配+局部交换优化」的组合策略即可100%满足组差小于1磅的要求,步骤如下:

  • 首先将所有16个破碎锤配重按重量从高到低排序
  • 蛇形分配初始分组:第1、8、9、16名分给组A,第2、7、10、15名分给组B,第3、6、11、14名分给组C,第4、5、12、13名分给组D,这一步分配后初始组差基本已经在2磅以内
  • 迭代交换优化:循环执行以下操作直到满足组差要求:
    • 计算4个组的当前总重,找到总重最大的组(重数组)和总重最小的组(轻数组)
    • 遍历重数组和轻数组中所有两两交换的组合,找到能让两组总重差缩小最多的交换方案
    • 执行该交换,直到4组总重的最大值减最小值小于1磅即停止

Python 实现代码

def balance_groups(weights, group_num=4, per_group=4, max_diff=1.0):
    # 第一步:按重量从高到低排序
    sorted_weights = sorted(weights, reverse=True)
    # 第二步:蛇形分配得到初始分组
    groups = [[] for _ in range(group_num)]
    for i, w in enumerate(sorted_weights):
        group_idx = i % group_num
        # 奇数轮反向分配实现蛇形效果
        if (i // group_num) % 2 == 1:
            group_idx = group_num - 1 - group_idx
        groups[group_idx].append(w)
    # 第三步:迭代交换优化组差
    for _ in range(100): # 最多迭代100次,当前场景下10次内即可收敛
        group_sums = [sum(g) for g in groups]
        current_diff = max(group_sums) - min(group_sums)
        if current_diff < max_diff:
            break
        # 定位最重、最轻的组
        max_idx = group_sums.index(max(group_sums))
        min_idx = group_sums.index(min(group_sums))
        best_gain = 0
        best_swap = None
        # 遍历所有两两交换组合,找缩小组差效果最好的方案
        for i in range(per_group):
            for j in range(per_group):
                new_max_sum = group_sums[max_idx] - groups[max_idx][i] + groups[min_idx][j]
                new_min_sum = group_sums[min_idx] - groups[min_idx][j] + groups[max_idx][i]
                gain = (group_sums[max_idx] - group_sums[min_idx]) - abs(new_max_sum - new_min_sum)
                if gain > best_gain:
                    best_gain = gain
                    best_swap = (i, j)
        if best_swap is None:
            break
        # 执行最优交换
        i,j = best_swap
        groups[max_idx][i], groups[min_idx][j] = groups[min_idx][j], groups[max_idx][i]
    # 返回分组结果和对应总重
    return groups, [round(sum(g),2) for g in groups]

# 测试用例:你提供的16个配重数据
weights = [39.1,40.1,42.0,41.5,40.05,41.0,40.05,38.90,41.2,42.1,41.3,43.1,38.5,43.60,42.1,41.5]
groups, sums = balance_groups(weights)
print("分组结果:", groups)
print("各组总重:", sums)
print("最大组差:", round(max(sums)-min(sums),2))

效果验证

用你给出的16个配重数据运行上述代码,输出的各组总重差值均小于0.5磅,完全符合要求,单次运行耗时不超过1毫秒,远高于人工调整的效率。如果后续配重数量、分组规则有变化,只需调整group_num(分组数)和per_group(每组数量)两个参数即可适配其他场景。

内容的提问来源于stack exchange,提问作者Justin K Valence

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:36:03