带约束的多列表组合按稀有度梯度分布筛选算法咨询
解决方案
核心思路是通过权重规则给所有组合打分,按分数优先级筛选或采样,天然满足「数值越小的元素出现频次越低」的稀有度分层要求。
具体实现步骤
- 步骤1:设计权重计算规则
要实现数值越大优先级越高,直接将组合的总权重设为三个维度元素的加权和即可,默认权重系数都为1,需要调整某个维度的影响时修改对应系数就行。
以你举的2元素小例子验证:组合(2,2,2)总权重为2+2+2=6,(1,2,2)和(2,2,1)总权重都是5,正好匹配你手动筛选的优先级顺序。 - 步骤2:选择筛选方案
两种方案可以根据需求选:- 硬取高权重组合:适合需要严格保证大数值元素优先出现的场景
- 带权重随机采样:适合需要更平滑的线性频次梯度、小数值元素也有少量出现的场景
Python 实现代码
from itertools import product import random from collections import Counter # 生成所有唯一组合,输入列表无重复元素时可以去掉set A = [1,2,3,4,5] B = [1,2,3,4,5] C = [1,2,3,4,5] all_combs = list(set(product(A,B,C))) # 自定义权重计算函数,可调整各维度的权重系数 def calc_weight(comb): a, b, c = comb weight_a, weight_b, weight_c = 1, 1, 1 return a * weight_a + b * weight_b + c * weight_c # 方案1:硬取权重最高的前N个 N = 50 all_combs_sorted = sorted(all_combs, key=lambda x: calc_weight(x), reverse=True) selected = all_combs_sorted[:N] # 方案2:带权重采样,分布更平滑 # weights = [calc_weight(comb) for comb in all_combs] # selected = set() # # 采样直到凑够N个不重复的组合 # while len(selected) < N: # selected.add(random.choices(all_combs, weights=weights, k=1)[0]) # selected = list(selected) # 验证各维度频次梯度 a_counts = Counter(comb[0] for comb in selected) b_counts = Counter(comb[1] for comb in selected) c_counts = Counter(comb[2] for comb in selected) print("A维度频次:", sorted(a_counts.items())) print("B维度频次:", sorted(b_counts.items())) print("C维度频次:", sorted(c_counts.items()))
方案优势
- 计算效率高,权重计算为O(1)单组合,排序/采样的时间复杂度适配百万级组合场景,完全支持大数据量筛选
- 灵活度高,修改权重函数即可调整梯度陡峭程度、各维度的重要性
- 完全匹配需求,小体量场景下的筛选结果和你手动选择的逻辑完全一致
内容的提问来源于stack exchange,提问作者luke
相关产品推荐
相关产品推荐

