当前位置: 首页 > news >正文

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中的区间(如['非常优秀', '优秀', '良好', '一般', '较差'])。

通过本代码,数模小白可以快速掌握模糊综合评价的实现流程,并应用于产品质量评价、城市环境评估、学生成绩排名等实际问题。

http://www.dtcms.com/a/289241.html

相关文章:

  • Vue基础(21)_Vue生命周期
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 用户注册实现
  • 《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
  • 力扣49:字母异形词分组
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • 下载win10的方法
  • 构建一个简单的Java框架来测量并发执行任务的时间
  • Linux安装jdk和maven教程
  • 论文解读:基于时域相干累积的UWB Radar 生命体征检测
  • PyTorch里的张量及张量的操作
  • The FastMCP Client
  • 反欺诈业务 Elasticsearch 分页与导出问题分析及解决方案
  • Kotlin函数式接口
  • 第六章 提炼:萃取本质--创建第二大脑读书笔记
  • 【esp32s3】4 - 从零开始入门 MQTT
  • Selenium 处理动态网页与等待机制详解
  • 谷歌开源项目MCP Toolbox for Databases实操:Docker一键部署与配置指南
  • zabbix服务器告警处理
  • 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)
  • Web服务压力测试工具hey学习一:使用方法
  • seo优化
  • UE5多人MOBA+GAS 番外篇:移植Lyra的伤害特效(没用GameplayCue,因为我失败了┭┮﹏┭┮)
  • 均值漂移累积监测算法(MDAM):原理、命名、用途及实现
  • C++现代编程之旅:从基础语法到高性能应用开发
  • JavaScript 对象操作、继承与模块化实现
  • 深度学习图像分类数据集—八种贝类海鲜食物分类
  • UDP中的单播,多播,广播(代码实现)
  • #SVA语法滴水穿石# (014)关于链式蕴含的陷阱
  • python生成密钥
  • FreeSwitch编译部署