数学建模学习笔记之评价问题层次分析法
-
我们评价的目标是什么?
-
我们为了达到目标有哪几种可选的方案?
-
评价的准则或者指标是什么?(我们根据什么来评价好坏)
层次分析法(AHP)
模型建立
层次分析法比较简单,是一个入门级的评价算法模型,模型的建立过程如下。
-
建立层次结构模型
层次一般分为三种:
最高层,准则层和方案层
一般而言层次结构模型用软件亿图图示画出(强烈建议使用9.0版本,因为9.2,9.4版本破解存在bug,这软件安装还用了我挺久)
-
构造出判断矩阵
通俗点讲,判断矩阵是在准则层之间进行两两比较建立的比较矩阵。
需要了解以下概念:
成对比较矩阵:比较n个因子对于某因素的影响,每次取两个因子进行比较,全部比较结果用矩阵表示。
标度:一般而言比较结果分为1~9个层次,也可成为标度,用来度量两个比较因子的关系。
标度 含义 1 相同重要/满意度 3 稍重要 5 明显重要 7 强烈重要 9 极端重要 2、4、6、8 上述的中间部分 其实就是一个量化过程,同理有1/2、1/3表示稍微不重要、不明显重要等。
那么比较旅游地下面五个影响因子我们可以得到成对比较矩阵(一般来说自己有根据的判断,此处只为示例):
选择旅游地 景 色 费 用 居 住 饮 食 旅 途 景 色 1 3 5 4 6 费 用 1 / 3 1 4 6 7 居 住 1 / 5 1 / 4 1 1 / 5 3 饮 食 1 / 4 1 / 6 5 1 7 旅 游 1 / 6 1 / 4 1 / 3 1 / 7 1 \begin{array}{cc} \begin{array}{c|cccc} \text{选择旅游地}&景色&费用&居住&饮食&旅途\\ \hline 景色&1&3&5&4&6\\ 费用&1/3&1&4&6&7\\ 居住&1/5&1/4&1&1/5&3\\ 饮食&1/4&1/6&5&1&7\\ 旅游&1/6&1/4&1/3&1/7&1\\ \end{array} \end {array} 选择旅游地景色费用居住饮食旅游景色11/31/51/41/6费用311/41/61/4居住54151/3饮食461/511/7旅途67371
这是不是表示了五个因子之间的重要关系?像不像权重?
那么也应该有下面的矩阵来进行往下一层的判断:
景色 武 汉 南 京 上 海 武 汉 南 京 上 海 费用 武 汉 南 京 上 海 武 汉 南 京 上 海 \begin{array}{cc} \begin{array}{c|cccc} \text{景色}&武汉&南京&上海\\ \hline 武汉\\ 南京\\ 上海\\ \end{array} & \begin{array}{c|cccc} \text{费用}&武汉&南京&上海\\ \hline 武汉\\ 南京\\ 上海\\ \end{array} \end {array} 景色武汉南京上海武汉南京上海费用武汉南京上海武汉南京上海
现在应该大致可以判断出:构造判断矩阵本质上来讲就是在一层一层对因子进行加权的操作
-
对判断矩阵进行一致性检验
概念理解
正互反矩阵:我们构造的矩阵比较矩阵都是,特点是斜对称相应的值互为倒数
一致矩阵:必为正互反矩阵、任意两行成比例、秩为1、只有最大特征值等于矩阵的阶、因此只有一个相应的特征向量
定理: n 阶正互反矩阵 A 为一致矩阵当且仅当其最大特征根λ max = n ,且当正
互反矩阵 A 非一致时,必有λ max > n
当正互反矩阵的非一致性越大时,所得到的特征向量就越不能反应真实情况,也就是可信度较低。因此我们要对于建立的比较矩阵进行一致性检验,检验步骤如下:
-
计算一致性指标CI
C I = λ m a x − n n − 1 CI=\frac{\lambda_{max}-n}{n-1} CI=n−1λmax−n -
查找相应的平均随机一致性指标 RI,RI相当于官方给的标准一致性数值
-
计算移植性比例CR
C R = C I C R CR=\frac{CI}{CR} CR=CRCI
当CR<0.10是被认为可以接受,不然就回去修改比较矩阵吧,尽量往一致性矩阵靠拢
-
-
计算权值得出判断结果
我们已经有了判断矩阵和它的特征值,理论上来讲就可以一步步相乘来计算出最底层相对于最高层的权值了,事实上也正是如此。一般而言是建立一个层次总排序来表示比较好:
准则 景 色 费 用 居 住 饮 食 旅 途 总 排 序 准 则 层 权 值 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ 方 ∣ 武 汉 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ 武 汉 最 终 权 值 案 ∣ 南 京 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ 南 京 最 终 权 值 层 ∣ 上 海 ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ 上 海 最 终 权 值 \begin{array}{cc|ccccc|c} \hline \text{准则}&&景色&费用&居住&饮食&旅途&总排序\\ \hline 准则层权值&&**&**&**&**&**&\\ \hline 方|&武汉&**&**&**&**&**&武汉最终权值\\ 案|&南京&**&**&**&**&**&南京最终权值\\ 层|&上海&**&**&**&**&**&上海最终权值\\ \hline \end{array} 准则准则层权值方∣案∣层∣武汉南京上海景色∗∗∗∗∗∗∗∗费用∗∗∗∗∗∗∗∗居住∗∗∗∗∗∗∗∗饮食∗∗∗∗∗∗∗∗旅途∗∗∗∗∗∗∗∗总排序武汉最终权值南京最终权值上海最终权值通过最终权值的比较就可以得出最终评价结果。
代码实现
disp('请输入判断矩阵A') A=input('A='); [n,n] = size(A) %归一化,按行相加再除阶数 Sum_A = sum(A); SUM_A = repmat(Sum_A,n,1); Arm_A = A ./ SUM_A;%到此按列归一化结束 disp('算术平均法求权重的结果为:'); disp(sum(Arm_A,2)./n) %行相乘、再开方、最后归一化 Prduct_A = prod(A,2); Prduct_n_A = Prduct_A .^ (1/n); disp('几何平均法求权重的结果为:'); disp(Prduct_n_A ./ sum(Prduct_n_A)) %计算最大特征值对应特征向量 [V,D] = eig(A); Max_eig = max(max(D)); [r,c]=find(D == Max_eig , 1); disp('特征值法求权重的结果为:'); disp( V(:,c) ./ sum(V(:,c)) ) %选取特征值法来做一致性检验 CI = (Max_eig - n) / (n-1); RI=[0 0.0001 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]; %注意哦,这里的RI最多支持 n = 15 % 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数 CR=CI/RI(n); disp('一致性指标CI=');disp(CI); disp('一致性比例CR=');disp(CR); if CR<0.10 disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!'); else disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!'); end
总结
层次分析法属于比较简单的评价算法,所需步骤不多,而且由于很多判断都是自己主观臆断。并不推荐在比赛中使用,最多使用该算法对建模中的一小问回答。计算时,最好把三种方法计算结果都列写出来,再加一句考虑了模型适用性等。
整理了一点资料:https://download.csdn.net/download/yuanjiteng/11516969