多关联列表约束下最优状态索引的选取方案如何实现?
多条件最优索引选择方案
分两种业务场景给出对应方案:
场景1:三个属性绑定同索引(默认场景,即每个索引对应的三个值属于同一条记录,不可跨索引拆分组合)
这种场景直接使用多属性效用评分法即可,实现步骤简单且可解释性强:
- 属性归一化:消除三个属性的量纲差异,把所有值映射到0-1区间,得分越高代表该属性表现越优
- list1升序最优:归一化公式 =
(list1最大值 - 当前值) / (list1最大值 - list1最小值) - list2降序最优:归一化公式 =
(当前值 - list2最小值) / (list2最大值 - list2最小值) - list3升序最优:归一化公式 =
(list3最大值 - 当前值) / (list3最大值 - list3最小值)
- list1升序最优:归一化公式 =
- 权重配置:根据业务中三个属性的重要程度设置权重
w1、w2、w3,三个权重之和为1,若三个属性同等重要可统一设为1/3 - 总得分计算:对每个索引
i计算总得分 =w1*list1归一化得分 + w2*list2归一化得分 + w3*list3归一化得分 - 最优选择:总得分最高的索引即为全局最优解
示例实现代码(Python)
import numpy as np # 原始嵌套列表数据 raw_data = [ ["array1",0.1,100,0.04], ["array2",0.4,220,0.02], ["array3",0.2,145,0.3], ["array4",0.6,246,0.06], ["array5",0.8,170,0.08], ["array6",0.3,120,0.5], ["array7",0.5,190,1.1], ["array8",0.9,286,0.4] ] list1 = np.array([item[1] for item in raw_data]) list2 = np.array([item[2] for item in raw_data]) list3 = np.array([item[3] for item in raw_data]) # 各属性归一化 norm_list1 = (list1.max() - list1) / (list1.max() - list1.min()) norm_list2 = (list2 - list2.min()) / (list2.max() - list2.min()) norm_list3 = (list3.max() - list3) / (list3.max() - list3.min()) # 配置权重(可根据业务需求调整) w1, w2, w3 = 1/3, 1/3, 1/3 # 计算每个索引的总得分 total_scores = w1 * norm_list1 + w2 * norm_list2 + w3 * norm_list3 # 取得分最高的索引 best_idx = np.argmax(total_scores) print(f"全局最优索引为{best_idx},对应记录为{raw_data[best_idx][0]},总得分{total_scores[best_idx]:.3f}")
按同等权重计算,示例数据的最优索引为1,对应array2,总得分约0.864。
场景2:允许跨索引拆分属性(即三个属性可独立选择不同索引的值,无绑定关系)
这种属于多目标优化问题,可通过帕累托最优筛选解决:
- 枚举所有可能的索引组合(示例数据总共有
8*8*8=512种组合,数据量小的情况下可直接暴力枚举) - 筛选帕累托最优解:判断每个组合是否满足「不存在另一个组合在三个属性上都不比当前组合差,且至少有一个属性更优」,满足条件的即为帕累托最优解
- 最终选择:所有帕累托最优解都是非劣解,可根据你的权重偏好从中选择最终方案
如果候选数量大,可替换为遗传算法、模拟退火等启发式算法快速求解近似最优解,避免全量枚举的性能问题。
内容的提问来源于stack exchange,提问作者fasiloo
相关产品推荐
相关产品推荐

