层次分析法
层次分析法是一种用于解决评价类问题的数学模型。
当面临n个选择对象和m个指标时需要根据这m个指标对n个指标进行打分,从中选择出一个分数最高的对象作为我们最终的选择。
引例
高考结束后,小明决定在天津理工,天津工业和天津师范中选择一所高校,那他该选择哪所学校呢?
在小明的心目中,比较重视大学的学习氛围,校园环境,就业率,男女比例这4个方面
对于评价类问题我们应该要注意的是三个问题:
1.我们评价的目标是什么?
答:我们要选择一所高校
2.我们为了达到这个目标有哪几种可选的方案?
答:三种。天津理工,天津师范和天津工业
3.评价的标准或者说指标是什么?
答:学习氛围,校园环境,就业率,男女比例
所以我们可以得到下面的这样一个表格
我们只需要将这个表格补充完整就可以实现对各个对象的打分了。
层次分析法的思想
层次分析法最重要的思想是分而治之的思想,一次性的考虑各个指标的关系,往往考虑不周到,所以每次只考虑两个指标之间的关系最终得到各个指标之间的关系(有点像孟德尔的杂交实验的思想)。
首先确定各个指标之间的关系,即确定各个指标在小明心目中的重要程度。
这个表一般由专家给出,但在实际操作中是学生根据所查到的资料所自己给出得分的。
后面的所有数据都是由我自己主观给出的,没有任何理论依据,就是瞎填的,哈哈哈。
上述矩阵叫做正反矩阵,因为题中所给的评判指标个数是n个,所以理论上应该有n+1个正反矩阵,第一个正反矩阵用来判断各个指标的权重,后面的n个矩阵用来给带选择的对象在n个指标下的得分。
但这些正反矩阵是由人为给出的,所以可能会出现逻辑混乱,比如:
A = 3B A=C
B = 3C
这样就出现了逻辑混乱,所以我们需要对所有的正反矩阵进行一致性检验。
一致性检验
-
计算一致性指标CI
-
查找对应的平均随机一致性指标RI
-
计算一致性比例CR
如果CR<0.1,则可以认为该矩阵通过了一致性检验可以接受,否则需要对该矩阵进行修改
这里给出进行一致性检验的代码。
clc;clear
A = [1,5,3,1/2;
1/5,1,1/2,1/3;
1/3,2,1,1/3;
2,3,3,1]; %等待检验的一致性矩阵
%A = [1,5,3;1/5,1,1/2;1/3,1/2,1];
%A = [1,1/3,1/2;3,1,3;2,1/3,1];
%A = [1,1/7,1/2;7,1,5;2,1/5,1];
%A = [1,3,1;1/3,1,1/3;1,3,1];
n = size(A,1); %记录矩阵的维度
[V,D] = eig(A) %D是特征值矩阵,V是特征值对应的特征向量
l = max(max(D)) %求出在特征值矩阵中的最大值
CI = (l-n)/(n-1) %计算出一致性检验指标
RI = [1,0;
2,0;
3,0.52;
4,0.89;
5,1.12;
6,1.26;
7,1.36;
8,1.41;
9,1.46;
10,1.49;
11,1.52;
12,1.54;
13,1.56;
14,1.58;
15,1.59]; %录入一致性指标RI
CR = CI/RI(n,2)
if CR<0.1
disp("通过一致性检验");
L = V(:,1); %取出最大特征值对应的特征向量
L = L./(sum(L)) %进行归一化处理
else
disp("未通过一致性检验,需要对矩阵中的值进行修改");
end
然后利用通过检验的矩阵来确定指标的权重以及各个对象在各个指标下的得分,这里有很多种方法,但我一般用的是最主流的特征值法求权重。
- 求出矩阵A的最大特征值以及其对应的特征向量
- 对求出的特征向量进行归一化即可得到我们的权重
利用上面的方法我们可以得到最上面的矩阵中我们需要的数据。
到此,我们可以得出每一个学校的得分,比如天津理工的得分为:
总结
层次分析法是一种针对评判类问题的数学模型,它的所有判断矩阵中的值都需要专家根据很多的理论依据去给出判断矩阵中的数值,这样最终的得分才有意义,但我们在实际操作中,都是自己给出得分,所以层次分析法主观性很严重,但也不妨碍我们将他作为学习数学建模的第一种方法。