如何在pyDecision中为MAUT的7个主准则设置权重
问题:MAUT中基于主准则分配测量准则权重的实现方法
我正在进行一项**MAUT(多属性效用理论)**练习,参考pyDecision示例,但不清楚如何设置权重。我的评估矩阵包含68个测量准则,它们分属7个不同的主准则,我希望为这7个主准则设置权重,而非每个测量准则。数据集的准则分布如下:
- 前5个值属于第1个主准则
- 接下来4个属于第2个主准则
- 再接下来14个属于第3个主准则
- 之后11个属于第4个主准则
- 随后20个属于第5个主准则
- 接下来11个属于第6个主准则
- 最后3个属于第7个主准则
请问该如何实现?以下是我的代码:
# Required Libraries import pyDecision import numpy as np from pyDecision.algorithm import maut_method weights = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0] #This is the tricky part. It should sum up to 1 #Here I have 68 criterion types, one for every measurement criteria criterion_type = ['min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'min', 'max', 'min'] # Load Utility Functions: 'exp'; 'ln'; 'log'; 'quad' or 'step' # Possibly the amount of utility functions defined here should be 68 as well? utility_functions = ['exp', 'exp', 'exp', 'exp', 'exp', 'exp', 'exp', 'exp', 'exp', 'exp'] # In this dataset, every value is a measurement criteria, and every row belongs to one of the five decision alternatives dataset = np.array([ [1, 1, 1, 1, 1, 2, 2, 2, 3, 59.4, 4.13, 4, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1550, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.43, 187, 1.87e-05, 0.0698, 0.149, 1, 0.0398, 1, 1, 1, 1, 1, 1, 315, 6030, 1, 2910, 0.00134, 1, 183, 27.2, 30.6, 3, 48, 3, 23, 14, 3.3, 1, 3.65, 0.025, 2, 0.0], #A1 [1, 1, 1, 1, 1, 2, 2, 2, 3, 57.5, 5.04, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 357, 4.13e-05, 0.551, 1.47, 1, 0.12, 1, 1, 1, 1, 1, 1, 768, 8760, 1, 5770, 0.0214, 1, 218, 28, 32, 3.4, 22.1, 3, 27, 17, 13, 5, 8.936, 0.304, 2, 0.0], #A2 [1, 1, 1, 1, 1, 2, 2, 2, 3, 57.5, 5.04, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 357, 4.13e-05, 0.551, 1.47, 1, 0.12, 1, 1, 1, 1, 1, 1, 768, 8760, 1, 5770, 0.0214, 1, 218, 20, 30, 6.2, 26.1, 3, 27, 17, 13, 5, 8.936, 0.304, 2, 0.0], #A3 [1, 1, 1, 1, 1, 2, 2, 2, 3, 54.9, 2.58, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 8.7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.53, 216, 1.78e-05, 0.0706, 0.199, 1, 0.0364, 1, 1, 1, 1, 1, 1, 312, 5830, 1, 3400, 0.00133, 1, 227, 15, 19, 5.4, 20.8, 2, 21.5, 18.5, 8.6, 2.1, 1.125, 0.41, 2, 0.0], #A4 [1, 1, 1, 1, 1, 2, 2, 2, 3, 54.9, 2.58, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 8.7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.53, 216, 1.78e-05, 0.0706, 0.199, 1, 0.0364, 1, 1, 1, 1, 1, 1, 312, 5830, 1, 3400, 0.00133, 1, 227, 16, 22, 9.1, 41.2, 2, 21.5, 18.5, 8.6, 2.1, 1.125, 0.41, 2, 0.0] #A5 ]) # Call MAUT Function rank = maut_method(dataset, weights, criterion_type, utility_functions, step_size, graph = True)
解决方案
1. 基于主准则推导测量准则权重
pyDecision的maut_method要求传入每个测量准则的权重,因此需要先给7个主准则分配权重(总和为1),再将主准则权重均分到下属的测量准则上:
- 先定义主准则权重,比如:
main_weights = [0.15, 0.1, 0.2, 0.15, 0.2, 0.15, 0.05](可根据实际需求调整,确保总和为1) - 根据各主准则下的测量准则数量,计算每个测量准则的权重:主准则权重 ÷ 该主准则下测量准则的数量
2. 补全效用函数列表
utility_functions的长度必须和测量准则数量(68)一致,可根据每个准则的特性选择'exp'、'ln'、'log'等,也可以统一设置(比如全部使用'exp')。
3. 修正后的完整代码
# Required Libraries import pyDecision import numpy as np from pyDecision.algorithm import maut_method # 1. 定义主准则权重(总和为1) main_weights = [0.15, 0.1, 0.2, 0.15, 0.2, 0.15, 0.05] # 各主准则下的测量准则数量 criterion_counts = [5, 4, 14, 11, 20, 11, 3] # 2. 推导每个测量准则的权重 weights = [] for mw, cnt in zip(main_weights, criterion_counts): # 将主准则权重均分到下属测量准则 weights.extend([mw / cnt] * cnt) # 确认权重总和为1(浮点误差可忽略) assert abs(sum(weights) - 1.0) < 1e-6, "权重总和必须为1" # 3. 补全效用函数列表(示例:全部使用'exp') utility_functions = ['exp'] * 68 # 原有的准则类型和数据集 criterion_type = ['min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'min', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'max', 'min', 'max', 'min'] dataset = np.array([ [1, 1, 1, 1, 1, 2, 2, 2, 3, 59.4, 4.13, 4, 4, 2, 3, 4, 1, 1, 1, 1, 1, 1, 1, 1550, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.43, 187, 1.87e-05, 0.0698, 0.149, 1, 0.0398, 1, 1, 1, 1, 1, 1, 315, 6030, 1, 2910, 0.00134, 1, 183, 27.2, 30.6, 3, 48, 3, 23, 14, 3.3, 1, 3.65, 0.025, 2, 0.0], #A1 [1, 1, 1, 1, 1, 2, 2, 2, 3, 57.5, 5.04, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 357, 4.13e-05, 0.551, 1.47, 1, 0.12, 1, 1, 1, 1, 1, 1, 768, 8760, 1, 5770, 0.0214, 1, 218, 28, 32, 3.4, 22.1, 3, 27, 17, 13, 5, 8.936, 0.304, 2, 0.0], #A2 [1, 1, 1, 1, 1, 2, 2, 2, 3, 57.5, 5.04, 3, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 198, 1, 1, 1, 1, 1, 1, 1, 1, 1, 11, 357, 4.13e-05, 0.551, 1.47, 1, 0.12, 1, 1, 1, 1, 1, 1, 768, 8760, 1, 5770, 0.0214, 1, 218, 20, 30, 6.2, 26.1, 3, 27, 17, 13, 5, 8.936, 0.304, 2, 0.0], #A3 [1, 1, 1, 1, 1, 2, 2, 2, 3, 54.9, 2.58, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 8.7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.53, 216, 1.78e-05, 0.0706, 0.199, 1, 0.0364, 1, 1, 1, 1, 1, 1, 312, 5830, 1, 3400, 0.00133, 1, 227, 15, 19, 5.4, 20.8, 2, 21.5, 18.5, 8.6, 2.1, 1.125, 0.41, 2, 0.0], #A4 [1, 1, 1, 1, 1, 2, 2, 2, 3, 54.9, 2.58, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 8.7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.53, 216, 1.78e-05, 0.0706, 0.199, 1, 0.0364, 1, 1, 1, 1, 1, 1, 312, 5830, 1, 3400, 0.00133, 1, 227, 16, 22, 9.1, 41.2, 2, 21.5, 18.5, 8.6, 2.1, 1.125, 0.41, 2, 0.0] #A5 ]) # 4. 调用MAUT方法(需定义step_size,示例设为0.01) step_size = 0.
相关产品推荐
相关产品推荐

