如何在PROMETHEE II方法及PyDecision库中表示非效益型准则?
在PyDecision的PROMETHEE中处理非效益型准则(以手机选型为例)
PyDecision的PROMETHEE实现默认针对效益型准则(最大化)设计,没有直接参数指定准则类型。对于成本这类需最小化的非效益型准则,核心思路是将其转换为等效的效益型指标,再代入PROMETHEE计算。
处理方法(两种常用方式)
针对手机选型中的成本准则,可任选一种转换方式:
- 方法1:取倒数(需避免成本为0的情况):转换后的值越大,代表原始成本越低,符合效益型要求。
- 方法2:反向差值:用成本列的最大值减去每个样本的成本值,新值越大则原始成本越低。
代码示例(以手机选型场景为例)
假设你有3款手机的原始数据:
| 型号 | 成本(元) | RAM(GB) | 存储(GB) |
|---|---|---|---|
| A | 3000 | 8 | 256 |
| B | 4000 | 16 | 512 |
| C | 2500 | 8 | 128 |
以下是完整的PROMETHEE计算代码,包含成本准则的转换:
# 导入PyDecision的PROMETHEE模块 from pydecision.models import promethee_i, promethee_ii # 1. 准备原始数据:每行对应一个备选方案,列顺序为[成本, RAM, 存储] original_data = [ [3000, 8, 256], [4000, 16, 512], [2500, 8, 128] ] # 2. 转换非效益型准则(成本):这里使用反向差值法 costs = [row[0] for row in original_data] max_cost = max(costs) transformed_costs = [max_cost - c for c in costs] # 3. 组装转换后的数据集:替换原始成本为转换后的值 transformed_data = [ [transformed_costs[i], original_data[i][1], original_data[i][2]] for i in range(len(original_data)) ] # 4. 定义准则权重(可根据实际需求调整,示例中成本、RAM、存储权重为0.4, 0.3, 0.3) weights = [0.4, 0.3, 0.3] # 5. 定义每个准则的偏好函数(默认用线性偏好,可选'linear'/'vshape'/'ushape'等) preference_functions = ['linear', 'linear', 'linear'] # 6. 定义偏好函数参数:线性函数需设置无差异阈值q和偏好阈值p p_values = [ max([row[0] for row in transformed_data]) - min([row[0] for row in transformed_data]), max([row[1] for row in transformed_data]) - min([row[1] for row in transformed_data]), max([row[2] for row in transformed_data]) - min([row[2] for row in transformed_data]) ] q_values = [0, 0, 0] # 无无差异阈值 # 7. 运行PROMETHEE计算 phi_plus, phi_minus, phi = promethee_i(transformed_data, weights, preference_functions, q_values, p_values) ranking = promethee_ii(phi) # 输出结果 print("PROMETHEE I 正流量:", phi_plus) print("PROMETHEE I 负流量:", phi_minus) print("PROMETHEE II 净流量:", phi) print("最终排名(从优到劣):", ranking)
关键说明
- 转换后的成本指标完全适配PROMETHEE的效益型准则逻辑,计算流程和官方演示一致。
- 若选择取倒数法,只需将
transformed_costs = [1/c for c in costs],注意提前处理成本为0的异常情况。 - 偏好函数和权重可根据决策需求灵活调整,上述示例为通用配置。
内容的提问来源于stack exchange,提问作者nanitoo
相关产品推荐
相关产品推荐

