层次分析法(AHP)是把问题条理化、层次化,构造出一个有层次的结构模型的方法。

比如要选择旅游地,有3个选择方案,苏杭、北戴河和桂林。选择过程需要考虑多个因素,比如景色、费用、居住、饮食和旅途。

1.分为目标层(选择旅游地),准则层(景色、费用、居住、饮食和旅途)和方案层(苏杭、北戴河和桂林)。层次结构模型如图所示:

2.构造判断矩阵

标度是主观判断的,不同人造出来的矩阵可能不一样。

准则层的矩阵:Ax = [ aij ]; x个n*n的矩阵,此时n=5表示准则层的数量,x表示准则层对目标层的影响,这里x=1。

举例:a14 = 3表示主观认为在选择旅游地时,景色比美食稍重要。反之,a41 = 1/3表示美食比景色稍不重要。

方案层的矩阵:Bx = [ aij ]; x个n*n的矩阵,此时n=3表示方案层的数量,x表示准则层对方案层的影响,这里x=5。

举例:B1中,a13=5表示,在景色方面,苏杭比桂林明显重要。

也就是要构造x+1=6个矩阵。数据如下,是主观假设给出的。

  1. [
  2. / ;
  3. ;
  4. / / / /;
  5. / / ;
  6. / /
  7. ]
  8.  
  9. [
  10. ;
  11. / ;
  12. / /
  13. ]
  14.  
  15. [
  16. / /;
  17. /;
  18.  
  19. ]
  20.  
  21. [
  22. ;
  23. ;
  24. / /
  25. ]
  26.  
  27. [
  28. ;
  29. / ;
  30. /
  31. ]
  32.  
  33. [
  34. /;
  35. /;
  36.  
  37. ]

数据

3.一致性检验

构造判断矩阵过程可能会构造错误,比如矩阵

1    9    1/3

9    1    5

3    1/5  1

a12 = 9 表示 因素1比因素2极端重要,a31=2表示因素3比因素1稍重要,则重要程度显然是 因素3>因素1>因素2,而a23=5表示因素2比因素3明显重要,矛盾。

并且对于每一个n阶矩阵会得到一个权重矩阵W,W是一个n*1的矩阵,即n个数,比如A矩阵得到的WA矩阵是

[0.26228;

0.47439;
0.054492;
0.098534;
0.1103;]

表示景色、费用、居住、饮食和旅途对于选择旅游地(上一层)的权重比分别是0.26228、0.47439、0.054492、0.098534和0.1103。体现出影响因素的层次。

比如B2得到的WB2矩阵是

[0.08199;
0.23645;
0.68156]

表示苏杭、北戴河和桂林在景色方面的权重比分别是0.08199、0.23645和0.68156。

4.对权值计算做出决策

获得了6个矩阵的权重比,分别是

WA=[0.26228;0.47439;0.054492;0.098534;0.1103];

WB1=[0.59489;0.27661;0.1285];

WB2=[0.08199;0.23645;0.68156];

WB3=[0.42857;0.42857;0.14286];

WB4=[0.63275;0.1924;0.17485];

WB5=[0.16667;0.16667;0.66667];

每一个旅游景点对于目标层Z的权重=准则层权重*方案层权重之和。

苏杭的权重=0.26228*0.59489+0.47439*0.08199+0.054492*0.42857+0.098534*0.63275+0.1103*0.16667=0.29901

北戴河的权重=0.26228*0.27661+0.47439*0.23645+0.054492*0.42857+0.098534*0.1924+0.1103*0.16667=0.24541

桂林的权重=0.26228*0.1285+0.47439*0.68156+0.054492*0.14286+0.098534*0.17485+0.1103*0.66667=0.45558

最后0.29901+0.24541+0.45558=1;

桂林的比重最大,选择去桂林!

代码:

  1. clc
  2. clear all;
  3. disp('请输入判断矩阵A(n阶)');
  4. A = input('A=');
  5. [n,~]=size(A);%由于矩阵构造方法的原因,矩阵都是正方形的所以关于矩阵的大小只需要取一个参数
  6. Asum=sum(A,1);%求每一列的和
  7. Aprogress=A./(ones(n,1)*Asum);%计算每一列个元素在这一列占的比重
  8. W=sum(Aprogress,2)./n;%每一行元素相加取平均值,需要注意这里W是个列项量且所有值加起来等于1
  9. w=A*W;%如果A的矩阵是理想状况的话这里W=w
  10. lam=sum(w./W)/n;%通过这一步最大lam
  11. RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45];
  12. CI=(lam-n)/(n-1);
  13. CR=CI/RI(n);%计算误差
  14. if CR<0.10 %如果误差小于0.1则可以接受
  15. disp('此矩阵的一致性可以接受!');
  16. fprintf('Cl=');disp(CI);
  17. fprintf('CR=');disp(CR);
  18. fprintf('W=');disp(W);
  19. else
  20. disp('此矩阵的一致性不可以接受!');
  21. end

对于不同阶判断矩阵是否满足一致性,引入判断矩阵的平均随机一致性指标RI(rand index)。Saaty给出的RI的值是一连串系数,对应各阶矩阵分别

1阶和2阶会提示不满足一致性检验,但只要矩阵斜对称就可以了。因为RI(1)和RI(2)都等于0,导致CR为NaN不能进入if语句。但是可以求出权重比W。

B站视频看到的矩阵数据,但是RI数组和我不一样。我的RI数组是在建模神书司守奎的算法大全上看的。

https://www.bilibili.com/video/av29474522/?p=2

matlab-层次分析法的更多相关文章

  1. 层次分析法、模糊综合评测法实例分析(涵盖各个过程讲解、原创实例示范、MATLAB源码公布)

    目录 一.先定个小目标 二.层次分析法部分 2.1 思路总括 2.2 构造两两比较矩阵 2.3 权重计算方法 2.3.1 算术平均法求权重 2.3.2 几何平均法求权重 2.3.3 特征值法求权重 2 ...

  2. 从Elo Rating System谈到层次分析法

    1. Elo Rating System Elo Rating System对于很多人来说比较陌生,根据wikipedia上的解释:Elo评分系统是一种用于计算对抗比赛(例如象棋对弈)中对手双方技能水 ...

  3. 层次分析法(Analytic Hierarchy Process,AHP)

    昨天晚上室友问我什么是层次分析法?我当时就大概给他介绍了一下,没有细讲. 今天我仔细讲讲这个. 层次分析法是运筹学里面的一种方法,是讲与决策总是有关的元素分解成目标.准则.方案等层次,在此基础上进行定 ...

  4. 层次分析法MATLAB

    输入成对比较矩阵,输出权重值和一致性检验结果. disp('请输入判断矩阵A(n阶)'); A=input('A='); [n,n]=size(A); x=ones(n,100); y=ones(n, ...

  5. Maths | 层次分析法(Analytic Hierarchy Process)

    目录 1. 概述 2. AHP算法 2.1. 建立层级 2.2. 构造 成对 比较 矩阵 2.3. 成对比较矩阵的 一致性检验 与 层次单排序 2.4. 层次总排序 参考: (中文)https://z ...

  6. 同TTX更可爱的层次分析法游戏破解

    最近的工作太忙,没啥时间写文章,今天遇到一点点的游戏,浅析.以中午的优势写这篇文章. 移动MM的游戏.前面我们已经写过非常多文章,没有看过的朋友,自行查找就可以,今天我们继续分析一个类似的游戏,只是使 ...

  7. ahp层次分析法软件

    http://www.jz5u.com/Soft/trade/Other/58808.html 权重计算 归一化 本组当前数 - 本组最小 / 本组最大-本组最小 http://blog.csdn.n ...

  8. 2017人生总结(MECE分析法)

    试着用MECE分析法对人生的整个规划做一下总结.作为技术人员,其实除了编码架构能力之外,分析问题的能力的重要程度也会随着职业发展越来越重要.<美团点评技术博客>说这几天要在黄金时段头版头条 ...

  9. MECE分析法(Mutually Exclusive Collectively Exhaustive)

    什么是MECE分析法? MECE,是Mutually Exclusive Collectively Exhaustive,中文意思是“相互独立,完全穷尽”. 也就是对于一个重大的议题,能够做到不重叠. ...

随机推荐

  1. (十一)golang--键盘输入

    两种方式:fmt.Scanln()和fmt.Scanf() (1)fmt.Scanln package main import "fmt" func main() { //获取一行 ...

  2. Redis Persistent Replication Sentinel Cluster的一些理解

    Redis Persistent Replication Sentinel Cluster的一些理解 我喜欢把工作中接触到的各种数据库叫做存储系统,笼统地说:Redis.Mysql.Kafka.Ela ...

  3. vue组件、自定义指令、路由

    1.vue组件 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...

  4. MySQL常用系统表汇总

    在这篇文章中: MySQL5.7 默认模式 Information_schema performance_schema mysql sys MYSQL SHOW 命令 致谢 概述 本篇文章虽大部分内容 ...

  5. 一步步在 github pages 上用 jekyll 搭建属于自己的博客

    序 我的专业与互联网没有太大关系,接触博客还是工作以后的事情.随着工作的经验增加,总想将自己的所思所得记录下来,毕竟,好记性不如烂笔头. 开始是将自己的总结在本地保存,但是本地有一个劣势,就是不能随时 ...

  6. virtual DOM的作用:将DOM的维护工作由系统维护转交给virtual DOM维护

    virtual DOM的作用:将DOM的维护工作由系统维护转交给virtual DOM维护 两个方面:对应用端 & 对DOM端(渲染准备的计算) 1.将DOM状态的维护工作由系统维护转交给vi ...

  7. Storm 系列(九)—— Storm 集成 Kafka

    一.整合说明 Storm 官方对 Kafka 的整合分为两个版本,官方说明文档分别如下: Storm Kafka Integration : 主要是针对 0.8.x 版本的 Kafka 提供整合支持: ...

  8. .net core (领域事件,并发 for update) 工作内容记录

    这周工作,因为要对几个不同的表进行货币增加,锁定,所以 用了领域事件和并发 for update  ,先记录一下 领域事件 ,Dapper 事务 ,sql for update 这几个点 头大,最近工 ...

  9. c# 自定义验证登录(Authorize)

    我们的项目本来是用azure的auth认证,是用过程中发现登录速度太慢了,所以还是自己搞一个吧,没想到搞起来挺简单的,不是用一个专门的认证服务器哈,就是一个简单的工具类. 验证是否登录的类 /// & ...

  10. 《EOPL》: 实现了惰性求值的两种参数传递策略

    call-by-need 不过是比 call-by-name 多了一个 memorization 的步骤