matlab如何求指标的权向量_【Matlab】案例讲解层次分析法的Matlab实现
我写过层次分析法的Matlab实现:张敬信:【评价算法】层次分析法zhuanlan.zhihu.com
其中的ahp函数是来自《吴鹏. Matlab高效编程技巧与应用:25个案例分析》,我只是增加或改写了注释说明。但是该函数对大家使用不太友好,非常复杂难用,倒不是函数定义的不好,只是因为它是将整个多层次的层次结构模型,一次代入该函数,一次完成全部的计算,所以就变得很复杂和难用。
这次重写一个简单易用的,一次只解决一个层次结构的层次分析法计算,多个结构多用几次就好了。层次分析法原理见上篇文章,这里不再赘述。
以么焕民老师在智慧树平台的数学建模课程中的,层次分析法案例为基础,来具体阐述。
问题描述:某人要出去旅游,有 3 个备选景点,需要从景色、费用、居住条件、饮食、旅途共5 个因素来考量。
一. 构建层次结构
二. 构造成对比较矩阵
5个因素分别记为X1,X2,X3,X4,X5
某人根据自己的考量,给出的成对比较矩阵:
以
为例,表示在某人看来费用比景色的相对重要程度是
,即认为费用是景色的
倍重要,其它矩阵元素的解释类似。
A = [ 1 1/2 4 3 3;
2 1 7 5 5;
1/4 1/7 1 1/2 1/3;
1/3 1/5 2 1 1;
1/3 1/5 3 1 1];
三. 计算权向量及一致性检验
么老师是用方根法近似计算的,实际上完全没有必要,直接用eig()函数算精确的就行了。两种方法我都实现一下。方根法近似计算
W = prod(A, 2) % 计算每一行乘积
n = size(A, 1); % 矩阵行数
W = nthroot(W, n) % 计算n次方根
W = W / sum(W) % 归一化处理, 计算特征向量, 即权向量
Lmax = mean((A * W) ./ W) % 计算最大特征值
2. 用eig()精确计算
[V,D] = eig(A)
[Lmax,ind] = max(diag(D)); % 求最大特征值及其位置
Lmax % 最大特征值
W = V(:,ind) / sum(V(:,ind)) % 最大特征值对应的特征向量做归一化, 即权向量
3. 再计算一致性指标和一致性比率
n = size(A, 1);
CI = (Lmax - n) / (n - 1) % 计算一致性指标
% Saaty随机一致性指标值
RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
CR = CI / RI(n) % 计算一致性比率
一致性比率 CR=0.0161 < 0.1 满足一致性要求,故前面的权重向量可以使用。
关于一致性的解释:
是
的
倍重要,
是
的
倍重要,则
是
的
倍重要,所以在比较
与的
重要性时,不能和
倍相差太多。
四. 计算组合全向量及其一致性检验
以上只是计算完了层次结构中的:准则层
个因素对目标层的决策权重,即一个层次结构。
还有方案层分别对准则层的
个因素的层次结构需要计算。这可以理解为
个景点分别对每个因素的贡献度(重要度)。
5 个层次结构就是 5 个成对比较矩阵:
这就需要按上述计算 5遍。这怎么能忍,当然是自定义函数解决了。先来谈谈我对自定义函数的一些体会
需要重复做多次同一种计算过程(前面第三部分那一系列的计算),一个好办法是,将该计算过程写成函数,就能方便多次使用了。
(1) 编程中的函数,是用来实现某个功能,其一般形式为:
(返回值1,..., 返回值m) = 函数名(输入1, ..., 输入n)
你只要把输入给它,它就能在内部进行相应处理,把你想要的返回值给你。
这些输入和返回值,在函数定义时,都要有固定的类型(模具)限制,叫做形参(形式上的参数);在函数调用时,必须给它对应类型的具体数值,才能真正的去做处理,这叫做实参(实际的参数)。
所以,定义函数就好比创造一个模具,调用函数就好比用模具批量生成产品。
使用函数最大的好处,就是将实现某个功能,封装成模具,从而可以反复使用。这就避免了写大量重复的代码,程序的可读性也大大加强。
(2) 那么,怎么自定义一个函数?
我想要自定义一个函数,能够实现“完成一个层次结构的层次分析法的计算”的功能。
基于前面函数的理解,
第一步,分析输入和输出,设计函数外形:输入有几个 ,分别是什么,适合用什么数据类型存放;
输出有几个,分别是什么,适合用什么数据类型存放。
本问题,
输入有 1 个:成对比较矩阵(用矩阵存放);
输出有4 个:权重向量(用向量存放)、最大特征值(浮点数存放)、一致性指标(浮点数存放)、一致性比率(浮点数存放)。
然后就可以基于 Matlab 自定义函数的语法,设计自定义函数的外形:
function[W, Lmax, CI, CR] =AHP(A)% 实现单层次结构的层次分析法
% 输入: A为成对比较矩阵
% 输出: W为权重向量, Lmax为最大特征值, CI为一致性指标, CR为一致性比率
注:函数名和变量可以随便起名,但是建议用有含义的单词。另外,为函数增加注释是一个好习惯。这些都是为了代码的可读性。
第二步,梳理功能的实现过程(就是前文的调试过程)
拿一个具体的输入,比如成对比较矩阵
,分析怎么到达想要的那
个返回值结果的。
复杂的功能,就需要更耐心的梳理和思考甚至借助一些算法,当然也离不开代码片段的调试。
注:把一个具体的输入,调试通过,得到正确的返回值结果,这一步骤很有必要。
第三步,将第二步的代码封装到函数体(选精确计算的)
function[W, Lmax, CI, CR] =AHP(A)% 实现单层次结构的层次分析法
% 输入: A为成对比较矩阵
% 输出: W为权重向量, Lmax为最大特征值, CI为一致性指标, CR为一致性比率
[V,D] = eig(A);
[Lmax,ind] = max(diag(D)); % 求最大特征值及其位置
W = V(:,ind) / sum(V(:,ind)); % 最大特征值对应的特征向量做标准化
Lmax = mean((A * W) ./ W); % 计算最大特征值
n = size(A, 1); % 矩阵行数
CI = (Lmax - n) / (n - 1); % 计算一致性指标
% Saaty随机一致性指标值
RI = [0 0 0.58 0.90 1.12 1.24 1.32 1.41 1.45 1.49 1.51];
CR = CI / RI(n); % 计算一致性比率
发现没有?就是前面梳理过程的代码原样复制过来的!原来的变量赋值语句不需要了,只需要形参。另外,为行尾没有分号的行添加了分号,函数不需要输出中间结果。
3. 调用自定义函数
Matlab自定义函数保存为与函数名同名的.m文件,这里是 AHP.m
确保该 AHP.m 文件在当前路径下,即确保该文件在Matlab界面左侧的“当前文件夹”窗口能看到它。那么就可以使用该函数。
以前文的矩阵
为例,测试该自定义的 AHP 函数:
A = [ 1 1/2 4 3 3;
2 1 7 5 5;
1/4 1/7 1 1/2 1/3;
1/3 1/5 2 1 1;
1/3 1/5 3 1 1];
[W, Lmax, CI, CR] = AHP(A)
运行结果:
有了该函数,就是有了可以实现层次分析法的“模具”,该“模具”只要提供成对比较矩阵给它,它就能给你返回:权重向量、最大特征值、一致性指标、一致性比率。
2. 回到问题,那5个层次结构的计算就简单了:
B1 = [ 1 2 5;
1/2 1 2;
1/5 1/2 1];
B2 = [1 1/3 1/8;
3 1 1/3;
8 3 1];
B3 = [ 1 1 3;
1 1 3;
1/3 1/3 1];
B4 = [ 1 3 4;
1/3 1 1;
1/4 1 1];
B5 = [1 1 1/4;
1 1 1/4;
4 4 1 ];
[W1, Lmax1, CI1, CR1] = AHP(B1);
[W2, Lmax2, CI2, CR2] = AHP(B2);
[W3, Lmax3, CI3, CR3] = AHP(B3);
[W4, Lmax4, CI4, CR4] = AHP(B4);
[W5, Lmax5, CI5, CR5] = AHP(B5);
返回结果太长了,加分号不让它直接输出,而是整理到一起再输出:
% 合并结果
rlts3 =[W1 W2 W3 W4 W5; Lmax1 Lmax2 Lmax3 Lmax4 Lmax5;
CI1 CI2 CI3 CI4 CI5; CR1 CR2 CR3 CR4 CR5]
这与么老师的课程里的结果是一致的(我这个更精确哦):
再来计算组合权向量:
a3 = rlts3(1:3,:) * W
这说明 3 个景点的权重分别是:0.2993,0.2453,0.4554
所以,这个某人应该选择的是去第3个景点去旅游。
最后注:这篇文章足够简单了吧,看完再不会用就该从自己身上找原因了。
主要参考文献:
么焕民,数学建模(层次分析法),智慧树平台在线课程。
——————————————
原创作品,转载请注明,禁止用于出版。
matlab如何求指标的权向量_【Matlab】案例讲解层次分析法的Matlab实现相关推荐
- matlab如何求指标的权向量_层次分析模型(AHP)及其MATLAB实现
今天用将近一天的时间学习了层次分析模型(AHP),主要参考了一份pdf,这个网站,和暨南大学章老师的课件,现写出一些自己总结的要点. 一.层次分析法的基本步骤: 角度一: 实际问题--分解--> ...
- 层次分析法及matlab代码
数学建模算法(一) 层次分析法 The analytic hierarchy process(AHP) [清风数学建模课程笔记] 文章目录 数学建模算法(一) 层次分析法 The analytic h ...
- 层次分析法matlab_建模开讲课程回放2:层次分析法及其MATLAB
建模开讲:层次分析法及其MATLAB实践 主讲人:于晶贤老师 课程回放地址如下,大家可以复制链接到地址栏即可观看,也可以直接点击左下角的观看: https://ke.qq.com/webcourse/ ...
- matlab层次分析法代码_基于主成分分析法和层次分析法的工程项目经理胜任力评价研究...
摘 要:根据工程项目经理胜任力评价指标,运用主成分分析法和层次分析法相结合的数学方法对工程项目经理的胜任力进行合理公正的评价.首先运用主成分分析法筛选重要指标,再运用层次分析法对工程项目经理进行定量与 ...
- 层次分析法(matlab实现)
层次分析: 层次分析法的基本思路与人对一个复杂的决策问题的思维.判断过程大体上是一样的.不妨用假期旅游为例:假如有3个旅游胜地A.B.C供你选择,你会根据诸如景色.费用和居住.饮食.旅途条件等一些准则 ...
- 层次分析法之matlab
目录 1.简介 2.算法解析 3.实例分析 3.1 构造矩阵 3.2 查看行数和列数 3.3 求特征向量 3.4 找到最大特征值和最大特征向量 3.5 计算权重 3.6 一致性检验 3.7 计算评分 ...
- yaahp层次分析法步骤_综合评价方法之层次分析法,选择再也难不倒你!
在日常生活中, 我们常常面临着各种各样的选择. 比如你想去北京.上海.广州旅游, 但是由于种种原因, 你只能选择一个地点去旅游, 那么哪一种选择是最优的呢? 有没有较为科学的方法帮助我们更好地选择呢? ...
- 层次分析法之matlab代码实现
clear;clc disp('请输入判断矩阵A: ') A = input('判断矩阵A=') % 输入判断矩阵% 方法1:算术平均法求权重%第一步:将判断矩阵按列归一化(每个元素除以其所在列的和) ...
- 方根法公式_(完整word版)层次分析法中用方根法计算权重在Excel中的具体操作
Exce l 表 A B C D E F G H I J K L M N 1 总 目 标 子 目 标 1 子 目 标 2 子 目 标 3 子 目 标 4 M ij 几何平均 数 权重 W i AW i ...
最新文章
- LeetCode简单题之到目标元素的最小距离
- Linux的DNS配置2-主从服务器
- [html] Google map的地理编码javascript例子 -- Google map geocoder example
- 使用FFmpeg进行视频抽取音频,之后进行语音识别转为文字
- PHP中类明明存在 但class_exists 确检测不到的坑: 使用完整命名空间
- 数据结构(一)线性表链式存储实现
- 设计模式之_动态代理_03
- javaone_JavaOne 2012:JavaOne技术主题演讲
- 计算(a+b)/c的值(信息学奥赛一本通-T1008)
- STP/RSTP/MSTP经典分析与对比
- MySQL数据库优化技术之数据库表的设计
- 【codeforces 709C】Letters Cyclic Shift
- 设计模式7------装饰者模式(Decorator Pattern)-------结构模式
- Failed installing tomcat9 service
- Wagtail 教程 2:简单博客实现
- 浙江计算机软件考试官网,浙江:全国计算机软件考试开始报名 11月8日开考
- C++关键字protected的作用详解
- 来嘉兴培训的第一天——整顿与准备
- mysql 存储过程
- 怎样黑进Microsoft:循序渐进指南 (转)
热门文章
- Java使用 PDFBox创建 PDF 文件并将文本写入其中
- maven 项目打包war文件 xml配置
- 重点本科(985 211),普通本科,专科有什么区别?
- Cassandra 3.0 导入导出文本(cqlsh+copy)
- 《机房收费系统》可行性分析报告
- 第二十五章 Caché 变量大全 $ZB 变量
- docsify 构建文档网站之定制功能(全网最全)
- 百度地图API调用实例之地址标注与位置显示
- iphone开发每日一练【2011-10-09】
- bluestacks android 文件夹,蓝叠安卓模拟器怎么传文件?Bluestacks与PC电脑文件传输方法介绍...