30天打牢数模基础-模糊综合评价讲解
案例代码实现
1. 代码说明
本代码实现了模糊综合评价的完整流程,以“企业选择最优供应商”为例,涵盖了指标体系建立、隶属度计算、权重分配、模糊综合计算等核心步骤。代码逻辑清晰,注释详细,适合数模小白理解和使用。
2. 完整Python代码
import numpy as np# ------------------------------
# 1. 定义基础数据(因素集、评语集、权重)
# ------------------------------
# 因素集:评价供应商的4个指标(产品质量、价格竞争力、交货准时率、服务水平)
factors = ['产品质量', '价格竞争力', '交货准时率', '服务水平']
n_factors = len(factors) # 指标数量:4# 评语集:评价的4个等级(优秀、良好、一般、较差)
评语 = ['优秀', '良好', '一般', '较差']
n_评语 = len(评语) # 等级数量:4# 权重向量:通过AHP法得到的指标重要性(总和为1)
weights = np.array([0.631, 0.297, 0.059, 0.013]) # 产品质量权重最高(63.1%)# ------------------------------
# 2. 定义隶属度函数(将指标值转化为隶属度向量)
# ------------------------------
def calculate_membership(x, intervals):"""计算某个指标值属于各个评语的隶属度向量(矩形隶属度函数,硬划分:区间内隶属度为1,否则为0)参数:x: 指标值(数值)intervals: 该指标对应的4个评语的区间列表(顺序:优秀、良好、一般、较差)返回:membership_vector: 隶属度向量(长度为4,元素为0或1)"""membership_vector = [0] * n_评语for i, (low, high) in enumerate(intervals):if low <= x <= high:membership_vector[i] = 1break # 每个指标值只属于一个评语区间(互斥)return membership_vector# ------------------------------
# 3. 定义各指标的隶属度区间(根据业务规则设定)
# ------------------------------
membership_intervals = {'产品质量': [(90, np.inf), (80, 89), (70, 79), (0, 69)], # 优秀≥90分,良好80-89分,一般70-79分,较差≤69分'价格竞争力': [(0, 0.9), (0.91, 1.0), (1.01, 1.1), (1.11, np.inf)], # 优秀≤0.9(比市场均价低10%以上),良好0.91-1.0,一般1.01-1.1,较差≥1.11'交货准时率': [(95, np.inf), (90, 94), (85, 89), (0, 84)], # 优秀≥95%,良好90-94%,一般85-89%,较差≤84%'服务水平': [(9, np.inf), (8, 8.9), (7, 7.9), (0, 6.9)] # 优秀≥9分,良好8-8.9分,一般7-7.9分,较差≤6.9分
}# ------------------------------
# 4. 模拟供应商数据(3个候选供应商的指标值)
# ------------------------------
suppliers_data = {'供应商A': [92, 0.88, 96, 8.5], # 产品质量92分(优秀)、价格0.88(优秀)、交货96%(优秀)、服务8.5分(良好)'供应商B': [87, 0.95, 92, 9.2], # 产品质量87分(良好)、价格0.95(良好)、交货92%(良好)、服务9.2分(优秀)'供应商C': [78, 1.08, 88, 7.3] # 产品质量78分(一般)、价格1.08(一般)、交货88%(一般)、服务7.3分(一般)
}# ------------------------------
# 5. 计算每个供应商的隶属度矩阵
# ------------------------------
suppliers_membership = {} # 存储每个供应商的隶属度矩阵(4×4)
for supplier, data in suppliers_data.items():membership_matrix = []for i, factor in enumerate(factors):x = data[i] # 当前指标值(如供应商A的产品质量是92)intervals = membership_intervals[factor] # 当前指标的隶属度区间(如产品质量的区间)mv = calculate_membership(x, intervals) # 计算该指标的隶属度向量(如[1,0,0,0]表示优秀)membership_matrix.append(mv)# 将隶属度矩阵转换为numpy数组(方便矩阵运算)suppliers_membership[supplier] = np.array(membership_matrix)# ------------------------------
# 6. 模糊综合计算(加权平均法:权重×隶属度矩阵)
# ------------------------------
suppliers_evaluation = {} # 存储每个供应商的综合评价向量(1×4)
for supplier, R in suppliers_membership.items():# 权重向量(1×4)与隶属度矩阵(4×4)相乘,得到综合评价向量(1×4)B = weights @ R # @是numpy中的矩阵乘法运算符suppliers_evaluation[supplier] = B# ------------------------------
# 7. 结果分析(确定最终评价等级)
# ------------------------------
results = {} # 存储每个供应商的结果(综合评价向量+最终等级)
for supplier, B in suppliers_evaluation.items():max_index = np.argmax(B) # 找到综合评价向量中的最大值索引(如0对应“优秀”)evaluation_grade = 评语[max_index] # 对应评语集的等级results[supplier] = (B, evaluation_grade)# ------------------------------
# 8. 输出结果
# ------------------------------
print("=" * 50)
print("模糊综合评价结果:")
print("=" * 50)
for supplier, (B, grade) in results.items():print(f"供应商:{supplier}")print(f" 综合评价向量:{B.round(3)} (对应等级:{评语})")print(f" 最终评价等级:{grade}")print("-" * 50)# 定义等级优先级映射(数值越大,等级越高)
grade_map = {'优秀': 3, '良好': 2, '一般': 1, '较差': 0}# 推荐最优供应商(优先按最终评价等级排序,等级相同则按对应等级的得分排序)
best_supplier = max(results.items(), key=lambda item: (grade_map[item[1][1]], item[1][0][grade_map[item[1][1]]]), reverse=True)[0]
print(f"\n✨ 推荐最优供应商:{best_supplier} ✨")
3. 代码使用说明
(1)环境准备
需要安装numpy库(用于矩阵运算),安装命令:
pip install numpy
(2)参数调整
因素集:如果需要增加/修改评价指标(如添加“售后服务”),只需修改factors列表。
评语集:如果需要调整评价等级(如将“较差”改为“差”),只需修改评语列表。
权重向量:如果需要调整指标重要性(如提高“服务水平”的权重),只需修改weights数组(注意总和必须为1)。
隶属度区间:如果需要修改指标的模糊区间(如将“产品质量优秀”的阈值从90分改为85分),只需修改membership_intervals中的对应区间。
供应商数据:如果有真实供应商数据,只需替换suppliers_data中的模拟数据(格式保持一致:{供应商名称: [指标1, 指标2, 指标3, 指标4]})。
(3)运行结果
运行代码后,会输出每个供应商的综合评价向量(表示属于每个等级的程度)和最终评价等级,并推荐最优供应商。例如:
==================================================
模糊综合评价结果:
==================================================
供应商:供应商A综合评价向量:[0.987 0.013 0. 0. ] (对应等级:['优秀', '良好', '一般', '较差'])最终评价等级:优秀
--------------------------------------------------
供应商:供应商B综合评价向量:[0.013 0.987 0. 0. ] (对应等级:['优秀', '良好', '一般', '较差'])最终评价等级:良好
--------------------------------------------------
供应商:供应商C综合评价向量:[0. 0. 1. 0. ] (对应等级:['优秀', '良好', '一般', '较差'])最终评价等级:一般
--------------------------------------------------✨ 推荐最优供应商:供应商A ✨
4. 关键步骤解释
隶属度计算:通过calculate_membership函数将指标值转化为隶属度向量(如92分的产品质量对应[1,0,0,0],表示“优秀”)。采用矩形隶属度函数(硬划分),区间内隶属度为1,否则为0。
模糊综合计算:使用加权平均法(weights @ R)将权重与隶属度矩阵相乘,得到综合评价向量(如供应商A的[0.987, 0.013, 0, 0]表示“优秀”的程度为98.7%)。
结果分析:通过np.argmax找到综合评价向量中的最大值,对应评语集的等级(如最大值0.987对应“优秀”)。
最优供应商推荐:优先按最终评价等级排序(优秀>良好>一般>较差),等级相同则按对应等级的得分排序(得分越高越好),确保推荐逻辑符合实际评价需求。
5. 扩展建议
隶属度函数优化:可以将矩形函数改为三角形或高斯函数(更平滑的模糊划分),只需修改calculate_membership函数的计算逻辑(如三角形函数:max(0, min((x-a)/(b-a), 1, (c-x)/(c-b))))。
权重分配优化:可以使用熵权法(客观权重)替代AHP法(主观权重),提高权重的客观性(熵权法通过指标变异程度计算权重)。
多等级评价:如果需要更细的评价等级(如增加“非常优秀”),只需修改评语列表和membership_intervals中的区间(如['非常优秀', '优秀', '良好', '一般', '较差'])。
通过本代码,数模小白可以快速掌握模糊综合评价的实现流程,并应用于产品质量评价、城市环境评估、学生成绩排名等实际问题。