数学建模——评价决策类算法(层次分析法、Topsis)

news/2024/9/22 20:28:49/

一、层次分析法

概念原理

        通过相互比较确定各准则对于目标的权重, 及各方案对于每一准则的权重,这些权重在人的思维过程中通常是定性的, 而在层次分析法中则要给出得到权重的定量方法. 将方案层对准则层的权重及准则层对目标层的权重进行综合, 最终确定方案层对目标层的权重。

层次分析算法的基本步骤 

1、建立递阶层次结构模型

2、构造出各层次中的所有判断矩阵

3、一致性检验

4、求权重后进行评价

一致性检验

求解权重 

 例题

例题:某公司计划投资一个新项目,现有三个候选城市A、B、C可供选择。公司希望通过层次分析法来确定最佳投资地点。评价指标包括:经济发展水平、人力资源、基础设施、政策支持四个方面。

步骤1:建立递阶层次结构模型

目标层:选择最佳投资地点 准则层:经济发展水平、人力资源、基础设施、政策支持 方案层:城市A、城市B、城市C

步骤2:构造各层次中的所有判断矩阵

假设公司对四个评价指标的重要性进行了如下判断(1-9标度法):

经济发展水平:人力资源 = 3,基础设施 = 5,政策支持 = 7 人力资源:基础设施 = 2,政策支持 = 4 基础设施:政策支持 = 1

构造准则层判断矩阵P:

对于方案层,假设公司对三个城市在各评价指标下的表现进行了如下判断:

经济发展水平:A > B > C 人力资源:A > C > B 基础设施:B > A > C 政策支持:C > A > B

构造方案层判断矩阵Q1(经济发展水平):

构造方案层判断矩阵Q2(人力资源):

构造方案层判断矩阵Q3(基础设施):

构造方案层判断矩阵Q4(政策支持):

步骤3:一致性检验

首先计算判断矩阵的最大特征值和特征向量,然后计算一致性指标CI和一致性比例CR。

步骤4:求权重后进行评价

根据步骤3的计算结果,得到各评价指标和方案的权重,进而计算出各方案的综合得分,选择得分最高的方案。

import numpy as np# 计算最大特征值和特征向量
def cal_maxEigenvalue_and_Eigenvector(matrix):eigenvalues, eigenvectors = np.linalg.eig(matrix)max_index = np.argmax(eigenvalues)max_eigenvalue = eigenvalues[max_index]max_eigenvector = eigenvectors[:, max_index]return max_eigenvalue, max_eigenvector# 一致性检验
def consistency_check(matrix, n):max_eigenvalue, max_eigenvector = cal_maxEigenvalue_and_Eigenvector(matrix)CI = (max_eigenvalue - n) / (n - 1)RI = [0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45]  # 随机一致性指标CR = CI / RI[n - 1]if CR < 0.1:print("判断矩阵的一致性可以接受,CR = {:.4f}".format(CR))return max_eigenvector / np.sum(max_eigenvector)  # 归一化特征向量else:print("判断矩阵的一致性不可接受,CR = {:.4f}".format(CR))return None# 构造判断矩阵
P = np.array([[1, 1/3, 1/5, 1/7],[3, 1, 1/2, 1/4],[5, 2, 1, 1/3],[7, 4, 3, 1]])Q1 = np.array([[1, 3, 5],[1/3, 1, 3],[1/5, 1/3, 1]])Q2 = np.array([[1, 3, 5],[1/3, 1, 3],[1/5, 1/3, 1]])Q3 = np.array([[1, 1/3, 1/5],[3, 1, 3],[5, 1/3, 1]])Q4 = np.array([[1, 1/3, 1/5],[3, 1, 3],[5, 1/3, 1]])# 进行一致性检验并计算权重
weights_P = consistency_check(P, 4)
weights_Q1 = consistency_check(Q1, 3)
weights_Q2 = consistency_check(Q2, 3)
weights_Q3 = consistency_check(Q3, 3)
weights_Q4 = consistency_check(Q4, 3)# 如果一致性检验未通过,则无法继续计算
if weights_P is None or weights_Q1 is None or weights_Q2 is None or weights_Q3 is None or weights_Q4 is None:print("存在判断矩阵的一致性不可接受,请重新评估。")
else:# 计算各方案的综合得分scores = np.dot(weights_P, np.array([weights_Q1, weights_Q2, weights_Q3, weights_Q4]))print("各城市的综合得分:")for i, score in enumerate(scores):print("城市{}:{:.4f}".format(chr(65+i), score))# 选择得分最高的城市best_city_index = np.argmax(scores)print("最佳投资地点是:城市{}".format(chr(65+best_city_index)))

请注意,这段代码假设所有的判断矩阵都通过了一致性检验。在实际应用中,如果任何一个判断矩阵没有通过一致性检验,就需要重新评估矩阵中的元素,直到所有矩阵都通过一致性检验。

此外,代码中的RI数组是一个预定义的随机一致性指标,它依赖于矩阵的大小(即准则的数量)。如果准则层或方案层的元素数量超过9,那么需要查找额外的RI值。

运行上述代码将给出每个城市的综合得分,并确定最佳投资地点。这个过程体现了层次分析法的核心步骤,包括建立模型、构造判断矩阵、一致性检验和权重计算。

二、Topsis算法

模型原理

基本步骤

原始矩阵正向化

正向化矩阵标准化 

 计算得分并归一化

 例题

假设某公司需要从三个供应商(A、B、C)中选择一个作为长期合作伙伴。评价指标包括:价格、质量、交货时间和售后服务。以下是供应商在每个指标上的原始评分(价格越低越好,其他指标越高越好):

首先,我们将价格指标正向化,因为价格是成本型指标,越低越好,而其他指标是效益型指标,越高越好。

正向化后的矩阵X’:

X' = [[1/10, 85, 3, 90],[1/12, 90, 5, 85],[1/11, 88, 4, 88]]

对正向化后的矩阵进行标准化处理,得到标准化矩阵R。

X_prime = np.array([[1/10, 85, 3, 90],[1/12, 90, 5, 85],[1/11, 88, 4, 88]])# 计算每列的平方和
squared_sums = np.sum(X_prime**2, axis=0)# 标准化矩阵R
R = X_prime / np.sqrt(squared_sums)

假设每个指标的权重相等,即每个指标的权重为1/4。

# 权重向量W
W = np.array([1/4, 1/4, 1/4, 1/4])# 计算加权得分
V = R * W

归一化得分:

# 计算得分向量V的平方和
v_squared_sums = np.sum(V**2, axis=1)# 归一化得分
S = V / np.sqrt(v_squared_sums)[:, np.newaxis]

 完整代码:

import numpy as np# 原始矩阵正向化
X_prime = np.array([[1/10, 85, 3, 90],[1/12, 90, 5, 85],[1/11, 88, 4, 88]])# 标准化矩阵R
squared_sums = np.sum(X_prime**2, axis=0)
R = X_prime / np.sqrt(squared_sums)# 权重向量W
W = np.array([1/4, 1/4, 1/4, 1/4])# 计算加权得分
V = R * W# 归一化得分
v_squared_sums = np.sum(V**2, axis=1)
S = V / np.sqrt(v_squared_sums)[:, np.newaxis]# 输出归一化得分
print("各供应商的归一化得分:")
for i, s in enumerate(S):print(f"供应商 {chr(65+i)}: {s}")


http://www.ppmy.cn/news/1509149.html

相关文章

【工作经验】关于远程软件,网络联通方面的异常

NoMachine&#xff0c;ssh&#xff0c;xterm等远程软件 现象1&#xff1a;NoMachine是开机自启的&#xff0c;但是开机后&#xff0c;传输文件失效。 原因&#xff1a;可能是开机时的网络条件不好导致&#xff0c;等网络稳定时&#xff0c;重启NoMachine往往可以解决。 另外&a…

PDF转图片新潮流,4款神器告别手动截图

在这个信息爆炸的时代&#xff0c;PDF文件因为能在各种设备上保持格式不变&#xff0c;成了我们学习和工作中的好帮手。今天&#xff0c;我就诚心诚意地给你推荐几款现在特别流行的PDF转图片工具。这些工具操作起来非常简单&#xff0c;转换速度快&#xff0c;而且转换出来的图…

Python实战项目:天气数据爬取+数据可视化(完整代码)

一、选题的背景 随着人们对天气的关注逐渐增加&#xff0c;天气预报数据的获取与可视化成为了当今的热门话题&#xff0c;天气预报我们每天都会关注&#xff0c;天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

如何利用数字孪生技术实现可视化

数字孪生技术是指通过将实体系统、设备或流程的数字模型与实时数据和传感器信息相结合&#xff0c;实现对实体系统的仿真、监测、优化和预测。在制造、工业、物流等领域&#xff0c;数字孪生技术被广泛应用来提高效率、降低成本和改善决策质量。以下是如何利用数字孪生技术实现…

视频汇聚/安防综合管理系统EasyCVR非管理员账户能调用分配给其他用户的通道是什么原因?

视频汇聚/安防综合管理系统EasyCVR视频监控平台&#xff0c;作为一款智能视频监控综合管理平台&#xff0c;凭借其强大的视频融合汇聚能力和灵活的视频能力&#xff0c;在各行各业的应用中发挥着越来越重要的作用。平台不仅具备视频资源管理、设备管理、用户管理、网络管理和安…

vue3使用pnpm运行项目但是运行不起来

运行项目的时候发现根本运行不起来了 尝试过创建.npmr文件 删除node_modules重新下 但是都出现问题了 创建.npmr&#xff1a;不管用 删除node_modules重新下&#xff1a;文字编译乱码&#xff0c;utf-8可能解析处理问题 最后解决方法&#xff1a; 重新创建项目&#xff0…

数字信号处理2: 离散信号与系统的频谱分析

文章目录 前言一、实验目的二、实验设备三、实验内容四、实验原理五、实验步骤1.序列的离散傅里叶变换及分析2.利用共轭对称性&#xff0c;设计高效算法计算2个N点实序列的DFT。3.线性卷积及循环卷积的实现及二者关系分析4.比较DFT和FFT的运算时间5.利用FFT求信号频谱及分析采样…

【零基础学习CAPL语法】——TestWaitForMessage:等待指定报文

文章目录 1.函数介绍2.实例1.函数介绍 TestWaitForMessage——等待指定报文 long TestWaitForMessage(dbMessage aMessage, dword aTimeout); long TestWaitForMessage(dword aMessageId, dword aTimeout); long TestWaitForMessage(dword aTimeout); 若在aTimeout时间内等到了…