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

news2024/12/23 20:05:41

一、层次分析法

概念原理

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

层次分析算法的基本步骤 

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.coloradmin.cn/o/2036545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解读RPA自动化流程机器人

RPA全称Robotic Process Automation&#xff0c;即机器人流程自动化&#xff0c;基于人工智能和自动化技术&#xff0c;能够将大量重复、规则明确的日常事务操作实现自动化处理&#xff0c;通常被形象地称为“数字员工”。本文金智维将深入探讨RPA的主要价值和应用领域&#xf…

除悟空CRM外,主流的6大CRM私有部署的厂商

支持私有化部署的CRM有&#xff1a;1.纷享销客&#xff1b; 2.悟空CRM&#xff1b; 3.销售易&#xff1b; 4.有赞CRM&#xff1b; 5.知客CRM&#xff1b; 6.八骏CRM&#xff1b; 7.白码CRM。 面对日益复杂的网络环境和严峻的数据保护法规&#xff0c;私有化部署的CRM系统成为了…

论文阅读笔记:Semi-DETR: Semi-Supervised Object Detection with Detection Transformers

论文阅读笔记&#xff1a;Semi-DETR: Semi-Supervised Object Detection with Detection Transformers 1 背景1.1 动机1.2 问题 2 创新点3 方法4 模块4.1 分阶段混合匹配4.2 跨视图查询一致性4.3 基于代价的伪标签挖掘4.4 总损失 效果5.1 和SOTA方法对比5.2 消融实验 论文&…

Flink开发过程中遇到的问题

1. 任务启动报错Trying to access closed classloader. Exception in thread "Thread-5" java.lang.IllegalStateException: Trying to access closed classloader. Please check if you store classloaders directly or indirectly in static fields. If the st…

基于PSO-BP+BP多特征分类预测对比(多输入单输出) Matlab代码

基于PSO-BPBP多特征分类预测对比(多输入单输出) Matlab代码 1、和市面上的不同&#xff0c;运行一个main一键出对比图&#xff0c;非常方便 2、可以根据需要定制其他算法优化模型对比 程序已经调试好&#xff0c;无需更改代码替换数据集即可运行&#xff01;&#xff01;&…

Python | Leetcode Python题解之第334题递增的三元子序列

题目&#xff1a; 题解&#xff1a; class Solution:def increasingTriplet(self, nums: List[int]) -> bool:n len(nums)if n < 3:return Falsefirst, second nums[0], float(inf)for i in range(1, n):num nums[i]if num > second:return Trueif num > first…

C++字体库开发之EM长度单位转换九

freetype 设置EM // if (m_face) // FT_Set_Pixel_Sizes(*m_face, 0, pixelSize); // 动态宽&#xff0c;固定高 px // error FT_Set_Char_Size(face, /* face 对象的句柄 */ // 0, /* 以 …

Unity Audio

这章练习将介绍在unity中创建 audio&#xff08;音频&#xff09;的工具&#xff0c;培养的技能将帮助创建引人入胜的音频音景。完成本次学习后&#xff0c;能够使用 Unity 中的所有主要音频组件&#xff0c;为各种不同体验创建音频效果。 音频处理工具&#xff1a; Audacity…

Mintegral出海系列:解锁全球应用商店新增长路径

在全球化竞争的浪潮中&#xff0c;面对打法各异的应用和游戏品类&#xff0c;以及全球数百个环境不同的国家和地区&#xff0c;开发者们正面临着前所未有的挑战。Mintegral「出海ing」系列专题内容&#xff0c;助力出海开发者选准赛道探索新的增长路径。 据近期数据显示&#x…

LLM微调(精讲)-以高考选择题生成模型为例(DataWhale AI夏令营)

前言 你好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;上一篇文章中&#xff0c;作者介绍了基于讯飞开放平台进行大模型微调的完整流程&#xff1b;而在本文中&#xff0c;作者将对大模型微调的数据准备部分进行深入&#xff1b;…

凤凰端子音频矩阵应用领域

凤凰端子音频矩阵&#xff0c;作为一种集成了凤凰端子接口的音频矩阵设备&#xff0c;具有广泛的应用领域。以下是其主要应用领域&#xff1a; 一、专业音响系统 会议系统&#xff1a;在会议室中&#xff0c;凤凰端子音频矩阵能够处理多个话筒和音频源的信号&#xff0c;实现…

Luminar Neo for Mac/Win:创新AI图像编辑软件的强大功能

Luminar Neo&#xff0c;这款由Skylum公司倾力打造的图像编辑软件&#xff0c;为Mac和Windows用户带来了前所未有的创作体验与编辑便利。作为一款融合了先进AI技术的图像处理工具&#xff0c;Luminar Neo以其独特的功能和高效的操作流程&#xff0c;成为了摄影师、设计师及摄影…

使用Sanic和SSE实现实时股票行情推送

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【Next】全局样式和局部样式

不同于 nuxt &#xff0c;next 的样式绝大部分都需要手动导入。 全局样式 使用 sass 先安装 npm i sass -D 。 我们可以定义一个 styles 文件&#xff0c;存放全局样式。 variables.scss $fs30: 30px;mixin border() {border: 1px solid red; }main.scss use ./variables …

业界首个OpenTelemetry结合eBPF的向导式可观测性平台APO正式开源

AutoPilot Observability (简称APO&#xff09;是什么&#xff1f; 开箱即用的可观测性平台&#xff1a;APO 致力于提供一键安装、开箱即用的可观测性平台。APO 的 OneAgent 支持一键免配置安装 Tracing 探针&#xff0c;支持采集应用的故障现场日志、基础设施指标、应用和下游…

主机防火墙IPV6 域名 测试环境搭建及测试方法

由于国内当前网站支持ipv6的很少,部分支持ipv6 的网站由于路由器的限制,也无法直接访通过ipv6进行访问,因此进行主机防火墙ipv6域名测试时,需要自己搭建环境进行测试,以下为搭建环境的步骤。 1 . 搭建DNS服务器 环境:安装有python,系统为Windows Server 2016 DNS服务…

【Vue3】vue模板中如何使用enum枚举类型

简言 有的时候&#xff0c;我们想在vue模板中直接使用枚举类型的值&#xff0c;来做一些判断。 ts枚举 枚举允许开发人员定义一组命名常量。使用枚举可以更容易地记录意图&#xff0c;或创建一组不同的情况。TypeScript 提供了基于数字和字符串的枚举。 枚举的定义这里不说了…

haproxy最强攻略

1、负载均衡 负载均衡&#xff08;Load Balance&#xff0c;简称 LB&#xff09;是高并发、高可用系统必不可少的关键组件&#xff0c;目标是 尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用如下&#xff1a; 高并发…

接入谷歌支付配置

1.谷歌云创建项目 网址&#xff1a;https://console.cloud.google.com/ 按照步骤创建即可 创建好后选择项目&#xff0c;转到项目设置 选择服务账户&#xff0c;选择创建新的服务账户 名称输入好后访问权限吗账号权限都可以不用填写&#xff0c;默认就好了 然后点击电子邮…

爵士编曲:Bass编写,Walking Bass,SwingBass 爵士鼓 Swing Jazz律动 Moonkits

Walking Bass Line是乐曲构造中的基垫&#xff0c;“Walking”是在BassLine中的一种重要的感觉构成&#xff0c;等同于我们对于“行走”的理解&#xff0c;意义就是“一步接着一步”&#xff0c;先从每一步&#xff08;每一小节&#xff09;建立&#xff0c;并持续构建成一个完…