【数学建模学习】matlab实现评价模型——层次分析法(AHP)
时间:2024-04-26 14:35:22 来源:网络cs 作者:璐璐 栏目:数据分析 阅读:
目录
1概述
2算法实现流程
3实例
4matlab实现层次分析法
5计算结果
1概述
层次分析法,简称AHP,是评价模型中的一种算法,指将与决策总是有关的元素分解成目标、准则、方案等层次,在此基础之上进行定性和定量分析的决策方法。层次分析法的缺陷在于判断矩阵是主观决定的,无法得到一个客观的评价,且指标的数量不可过多(不可大于15)。本文将展示使用层次分析法实现对旅游城市的选取。
matlab是建模的主流,其次为python,R等,matlab相较于python会更加方便,因为自带了很多函数,而python需要自己下载需要的库。但matlab缺陷在于软件过大,启动速度慢。但众所周知,matlab除了不能生孩子,其他功能他都有,下面让我们一起来看看怎么用matlab实现层次分析法吧。
2算法实现流程
首先需要确定评价体系,分为目标层,准则层,方案层,再根据重要程度(可参考以下表格)确定评判指标及方案的判断矩阵的,分别使用算术平均法、几何平均法、特征值法分别求解指标权重(重要程度)和各个方案的得分。将三种方法计算的权重和得分进行取平均,相较于只使用特征值法求权重和得分使得比赛论文更加完整。
标度 | 含义 |
1 | 同样重要性 |
3 | 稍微重要 |
5 | 明显重要 |
7 | 强烈重要 |
9 | 极端重要 |
2,4,6,8 | 上述两相邻判断的中值 |
倒数 | A和B相比是5,B与A相比是1/5 |
3实例
请选择合适的指标,为小明选取一个最适合他的旅游城市。
本题需要我们选取最优的旅游城市,首先上网搜集资料确定我主观认为最重要的几个指标,分别为,花费、景色、交通,选取想去的几个城市,分别为:武汉、厦门、南昌。主观确定判断矩阵并检验一致性,判断该矩阵是不是一致矩阵。使用算数平均法、几何平均法、特征值法求指标权重及各个城市得分。最后,根据指标权重及各个城市在各指标方面的得分进行打分。
Step1:建立指标判断矩阵
根据自己对这几个指标的判断确定x-y的权重,如景色-花费的相对权重(景色的重要程度/花费的要程度)为1/2,则花费-景色的相对权重(花费的重要程度/景色的要程度)为2
花费 | 景色 | 交通 | |
花费 | 1 | 2 | 1/3 |
景色 | 1/2 | 1 | 1/5 |
交通 | 3 | 5 | 1 |
根据上表观察到对角位置的两个权重相乘为1,这是由于景色相对花费的重要程度为1/2,而反过来花费相对景色的重要程度就为2
Step2:建立城市判断矩阵
在花费方面建立各个城市的判断矩阵如下:
花费 | 武汉 | 厦门 | 南昌 |
武汉 | 1 | 1/3 | 4 |
厦门 | 3 | 1 | 5 |
南昌 | 1/4 | 1/5 | 1 |
在景色方面建立各个城市的判断矩阵如下:
景色 | 武汉 | 厦门 | 南昌 |
武汉 | 1 | 1/3 | 2 |
厦门 | 3 | 1 | 5 |
南昌 | 1/2 | 1/5 | 1 |
在交通方面建立各个城市的判断矩阵如下:
交通 | 武汉 | 厦门 | 南昌 |
武汉 | 1 | 2 | 5 |
厦门 | 1/2 | 1 | 3 |
南昌 | 1/5 | 1/3 | 1 |
Step3:检验判断矩阵一致性
(1)计算一致性指标
表示判断矩阵最大特征值,n表示矩阵大小,即判断矩阵是n行n列的矩阵
(2)计算一致性指标CR
RI为平均随机一致性指标,由以下表规定,根据判断矩阵的大小确定RI的值
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
RI | 0 | 0 | 0.52 | 0.89 | 1.12 | 1.26 | 1.36 | 1.41 | 1.46 | 1.49 | 1.52 | 1.54 | 1.56 | 1.58 | 1.59 |
若CR小于<0.1则认为判断矩阵一致性可以接受,否则需要重新调整判断矩阵。若没有通过一致性检验可以通过一个很简单的方法调整,首先看各行各列两两之间是否成比例,若没有成比例按各行各列之间的比例调整即可
一个一致矩阵的例子如下:
景色 | 杭州 | 西安 | 桂林 |
杭州 | 1 | 2 | 4 |
西安 | 1/2 | 1 | 2 |
桂林 | 1/4 | 1/2 | 1 |
可以看到上面矩阵的各行各列是成比例的,如第二列的元素是第一列元素的两倍,如果不通过一致性检验需要往各行各列都是成比例的方向区调整
Step4:求指标权重及城市在各个指标上的得分
算数平均法第一步:将判断矩阵按行相加得到一个1*n的行向量
第二步:将判断矩阵第一行的所有元素除以上述1*n的行向量对应元素,直至最后一行都完成除以1*n的行向量操作,最后得到一个n*n的矩阵
第三步:将第二步得到的n*n的矩阵按列相加得到一个n*1的矩阵,再将每个元素除以n即可得到算术平均法计算的权重向量。
我举个例子给大家看:
计算花费的权重使用该公式计算为
分别使用花费与其他各个指标的比值除以其他指标所在列的和得到的权重
使用第一列元素计算权重:
1/(1+1/2+3)
使用第二列元素计算权重:
2/(2+1+5)
使用第三列元素计算权重:
1/3/(1/3+1/5+1)
再将这三个结果取平均值就得到归一化后的结果
(1/(1+1/2+3)+ 2/(2+1+5)+ 1/3/(1/3+1/5+1))/3
(2)几何平均法
第一步:将判断矩阵的元素按照行相乘得到一个新的列向量
第二步:将新的向量的每个分量开n次方
第三步:对该列向量进行归一化即可得到权重向量
表示将判断矩阵的元素按行相乘得到一个新的列向量并开n次方,随后除以新的列向量所有元素之和得到归一化后的权重向量
(3)特征值法
第一步:求出矩阵A的最大特征值以及其对应的特征向量
第二步:对求出的特征向量进行归一化即可得到我们的权重
使用matlab 的eig()函数可以求特征向量矩阵
4matlab实现层次分析法
注意,当只有两个指标或两个方案需要选择时不可以使用层次分析法。
%输入判断矩阵AA=[1 1/3 4; 3 1 5; 1/4 1/5 1]%判断判断矩阵A是否通过一致性检验,否则需要修改判断矩阵直到通过一致性检验[n,n]=size(A) [v,d]=eig(A) %求最大特征向量 %v表特征向量,d表示特征值构成的对角矩阵 max_v=max(max(d)) %求判断矩阵A是几行几列的矩阵 %计算一致性指标CI CI=(max_v-n)/(n-1) RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59] %计算一致性比例CR disp("一致性比例为") CR=CI/RI(n) disp(CR) if CR<0.10 disp("因为一致性比例CR<0.1,因此判断矩阵A通过一致性检验") else disp("因为一致性比例CR>0.1,因此判断矩阵A不通过一致性检验,请重新调整判断矩阵,直至通过一致性检验") end%算数平均法求权重%将判断矩阵按列求和%n表示判断矩阵A有n行n列%[n,n]=size(A)if CR<0.1 sum_a=sum(A,1) sum_A=repmat(sum_a,n,1) %计算未归一化的权重 weight=A./sum_A %计算归一化后的权重 sum_weight=sum(weight,2) weight=sum_weight/n disp("算数平均法求的权重或得分为:") disp(weight) %几何平均法求权重 %判断矩阵按行相乘 prod_A=prod(A,2) %将新的向量开n次方得到未归一化的权重 prod_A=prod_A.^(1/n) %权重归一化 disp("几何平均法求得权重或得分为:") weight_jihe=prod_A./sum(prod_A) %特征值法求权重 %v表特征向量,d表示特征值构成的对角矩阵 %[v,d]=eig(A) %max_v=max(max(d)) %将特征向量归一化 %find函数用于寻找最大特征值所在的位置 %max_v表示最大特征值 [max_r,max_c]=find(max_v,1) %v(:,max_c)找到最大特征值对应的列 e=v(:,max_c)/sum(v(:,max_c)) disp("特征值法求的权重或得分为:") disp(e)end%三种方法得出的平均权重disp("三种方法得出的平均权重或得分为")disp((e+ weight_jihe+weight)./3)
5计算结果
指标权重及各个城市在各方面的得分为:
指标权重 | 武汉 | 厦门 | 南昌 | |
花费 | 0.2297 | 0.2812 | 0.6424 | 0.0946 |
景色 | 0.1221 | 0.2297 | 0.6482 | 0.1221 |
交通 | 0.6482 | 0.5815 | 0.3090 | 0.1095 |
各个城市的最终得分为:
得分 | |
武汉 | 0.47 |
厦门 | 0.43 |
南昌 | 0.11 |
可以看到武汉得分最高,我主观认为最适合小明去的城市为武汉。
非常感谢各位小伙伴看到这里,有不对的地方欢迎各位小伙伴指正。我写到这里老辛苦了,可怜一下我给我个赞吧,谢谢各位大漂亮大帅逼~
本文链接:https://www.kjpai.cn/news/2024-04-26/162529.html,文章来源:网络cs,作者:璐璐,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:【javaSE】认识异常(1)
下一篇:返回列表