层次分析法(AHP)
层次分析法(The analytic hierarchy process),主要用于解决数学建模中评价类问题。
评价类问题是数学建模中较为常见的一类问题,解决这一类问题的途径有很多,但我认为最简单而又高效的方式是以“评分”来解决。
但是评分的标准是什么呢?又该以怎样的方式评分?这就引申出了这一关键算法——层次分析法。
层次分析法的步骤:
Step 1:分析系统中各因素之间的关系,建立系统的“递阶层次结构”
这里需要说明的是,不同问题中,对于某一方案,对于决定的它的影响因素的个数可能是不一样的。
例如上图,影响方案1的因素有因素1,2,3…,但是影响方案2的因素只有因素1,3…,以此类推。
但是解决办法的核心思想是一致的,不一样只是最后求“总得分”的方式。
Step 2:对于同一层次的各元素关于上一层次中某一准则的重要性,进行两两比较,构造“判断矩阵”
在这一步骤中,我们需要思考,如何确定“对于同一层次的各元素”关于“上一层次中某一准则”的重要性,这里就要引入标度的概念。
“分而治之”的思想
问题:一次性考虑N个指标之间的关系,往往考虑不周
解决方法:每两个指标进行比较,最终根据两两比较的结果推算最终权重
进行全部的比较之后,便可以得到这样一个矩阵:
我们称这样的矩阵为判断矩阵,不难看出,这是一个“n×n”的方阵,记为A,对应元素为aij。
判断矩阵的特点:
1、aij表示的意义是,与j指标相比,i的重要程度;
2、当i=j时,两个指标相同,因而一样重要,记为1;
3、aij>0且满足aij×aji=1。
Matlab中的代码实现:
%判断矩阵
%判断一个矩阵是否为判断矩阵 正互反矩阵
a=0; %初始化矩阵的行数
b=0; %初始化矩阵的列数
a=input('请输入矩阵的行数:');
b=input('请输入矩阵的列数:');
if(a ~= b)
disp('不是判断矩阵!');
else
%初始化判断矩阵
c=zeros(a,b);
c=input('请依次输入矩阵的元素:');
k=0;
for i=1:a
for j=1:a
if(c(i,j) ~= c(j,i))
k=1;
end
end
end
if(k==0)
disp('是判断矩阵!');
else
disp('不是判断矩阵!');
end
end
Step 3:根据判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(一致性检验合格后,所求权重才可使用)
这里我们先引入一致矩阵的概念:
若判断矩阵满足aij×ajk=aik,则我们称其为“一致矩阵”。
例如:
可以发现,一致矩阵的每一行(列)的元素成比例。
(在实际的数学建模中,我们往往是以此来判断是否为“一致矩阵”)。
Matlab中的代码实现:
%一致矩阵
%判断一个“判断矩阵”是否为“一致矩阵”
a=0;
a=input('请输入判断矩阵的阶数:');
b=zeros(a,a);
b=input('请依次输入判断矩阵的每个元素:');
%判断变量 设定初始值为0
c=0;
% Step1 a(ij)>0
for i=1:a
for j=1:a
if(b(i,j) <= 0)
c=1;
end
end
end
% Step2 a(11)=a(22)=...a(nn)=1
for i=1:a
if(b(a,a) ~= 1)
c=1;
end
end
% Step3 [a(i1),a(i2)...a(in)]=k[a(11),a(22)...a(nn)]
for i=1:(a-2)
d=b(i,1)/b(i+1,1);
e=b(i+1,1)/b(i+2,1);
if(d ~= e)
c=1;
end
end
if(c==0)
disp('该判断矩阵为一致矩阵!');
else
disp('该判断矩阵不是一致矩阵!');
end
一致性检验的步骤:
注:
1、λmax是判断矩阵的最大特征值;
2、n是判断矩阵的迹;
Matlab中的代码实现:
%一致性检验
%一致矩阵为方阵“ 且r(A)=1” “ A有一个特征值为tr(A)” “ 其余全为0”
%前提准备
a=0;
a=input('请输入判断矩阵的阶数:');
b=zeros(a,a);
b=input('请输入判断矩阵的各个元素:');
% 计算判断矩阵的最大特征值
[x,y]=eig(b);
z=diag(y);
m=max(z);
%计算矩阵的迹 即tr(A) 函数trace(A)
t=trace(b);
%正式步骤
%Step1 计算“一致性指标 CI”
CI=(m-t)/(t-1);
%Step2 查找对应的“平均随机一致性指标RI”
if t==1
RI=0;
elseif t==2
RI=0;
elseif t==3
RI=0.52;
elseif t==4
RI=0.89;
elseif t==5
RI=1.12;
elseif t==6
RI=1.26;
elseif t==7
RI=1.36;
elseif t==8
RI=1.41;
elseif t==9
RI=1.46;
elseif t==10
RI=1.49;
elseif t==11
RI=1.52;
elseif t==12
RI=1.54;
elseif t==13
RI=1.56;
elseif t==14
RI=1.58;
elseif t==15
RI=1.59;
end
%Step3 计算一致性比例“CR” CR=CI/RI
CR=CI/RI;
if(CR<0.1)
disp('一致性比例CR:');
disp(CR);
disp('一致性可以接受');
else
disp('一致性比例CR:');
disp(CR);
disp('判断矩阵偏差过大,需要修改!');
end
如果判断矩阵的CR偏大,该如何修改呢?
答:根据“一致矩阵”的定义,修改个别数据。
计算“一致矩阵”中的权重:
例如:
Matlab中的代码实现:
%计算一致矩阵的权重
%进行归一化处理便可实现
a=0;
a=input('请输入一致矩阵的阶数:');
b=zeros(a,a);
b=input('请输入一致矩阵的各个元素:');
%原则上任何一行/列都可以实现
%我这里用第一列
s=0;
for i=1:a
s=s+b(i,1);
end
for i=1:a
c(i)=b(i,1)/s;
end
计算“判断矩阵”中的权重:
这里以这样的一个矩阵为例子:
方法1:算术平均法
Step1. 将判断矩阵按照列(行)进行归一化(每一个元素除以其所在列(行)的和);
Step2. 将归一化的各列相加(按行求和);
Step3. 将相加后得到的向量中每个元素除以n即可以得到权重。
例如:
Matlab中的代码实现:
%计算判断矩阵的权重
%第一种方法 “算术平均法求权重”
%分别根据第1-n列/行的权重,求平均值。
a=0;
a=input('请输入判断矩阵的阶数:');
b=zeros(a,a);
b=input('请输入判断矩阵的各个元素:');
%Step1 计算每一列的总和
for i=1:a
c(i)=0;
for j=1:a
c(i)=c(i)+b(j,i);
end
end
%Step2 计算每一列的权重
for i=1:a
for j=1:a
d(j,i)=b(j,i)/c(i);
end
end
%Step3 计算算术平均权重
for i=1:a
e(i)=0;
for j=1:a
e(i)=e(i)+d(i,j);
end
f(i)=e(i)/a;
end
方法2:几何平均法
Step1. 将判断矩阵的元素按照行相乘得到一个新的列向量;
Step2. 将新的向量每个分量开n次方;
Step3. 对该列向量进行归一化即可得到权重向量。
例如:
Matlab中的代码实现:
%计算判断矩阵的权重
%第二种方法 几何平均法求权重
a=0;
a=input('请输入判断矩阵的阶数:');
b=zeros(a,a);
b=input('请输入判断矩阵的各个元素:');
%Step1 将A的元素按照行相乘得到一个新的列向量
for i=1:a
c(i)=1;
for j=1:a
c(i)=b(i,j)*c(i);
end
end
%Step2 将新的列向量的每个分量开n次方 (n为A的阶数)
for i=1:a
c(i)=power(c(i),1/a);
end
%Step3 进行归一化处理
s=0;
for i=1:a
s=c(i)+s;
end
for i=1:a
d(i)=c(i)/s;
end
方法3:特征值法
Step1. 求出判断矩阵的特征向量;
Step2. 对求出的特征向量进行归一化处理即可得到权重向量。
例如:
Matlab中的代码实现:
%计算判断矩阵的权重
%第三种方法 特征值法求权重(使用最多)
a=0;
a=input('请输入判断矩阵的阶数:');
b=zeros(a,a);
b=input('请输入判断矩阵的各个元素:');
%Step1 求出A对应的特征向量
[x,y]=eig(b);
%x为对应的特征向量 y为对应的特征值
%Step2 对求出的特征向量进行归一化处理
s=0;
for i=1:a
s=s+x(i);
end
for i=1:a
t(i)=x(i)/s;
end
对比3种方法求得的结果:
Step 4:计算各层元素元素对系统目标的合成权重,并进行排序
将最终所得的结果填入表中,然后进行“算分”,便实现了用“层次分析法”实现评价问题。
例如:
层次分析方法的局限性:
1、评价的决策层不能太多,太多的话,导致n会很大,因而判断矩阵和一致矩阵的差异可能会很大;
2、如果决策层中指标的数据是已知的,那么便不能用“层次分析法”来评价,需要用TOPSIS法来评价。