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
相关产品推荐
相关产品推荐

