赞
踩
资料来源:清风建模
目录
层次分析法处理问题类型:决策、评价、分析、预测等
AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因
素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重
要度的比较上面。在许多情况下,决策者可以直接使用AHP进行决策,极大
地提高了决策的有效性、可靠性和可行性,但其本质是一种思维方式,它把
复杂问题分解成多个组成因素,又将这些因素按支配关系分别形成递阶层次
结构,通过两两比较的方法确定决策方案相对重要度的总排序。整个过程体
现了人类决策思维的基本特征,即分解、判断、综合,克服了其他方法回避
决策者主观判断的缺点。
PS:在论文中用到层次分析法时一定要引入层次结构图。
整个过程流程图:
基本步骤:
(1)建立层次分析结构模型(将有关因素自上而下分层(目标—准则或指标—方案或对象),上层受下层影响,而层内各因素基本上相对独立)
(2)构造成对比较阵(用成对比较法和1~9标度,构造各层对上一层某一准则的重要性进行两两比较,构造判断矩阵)
(3)计算权向量并作一致性检验(计算最大特征根和特征向量)
(4)计算组合权向量(并进行排序)
思维过程:(定性分析与定量分析结合起来)
(1)将决策问题分为3个层次;每层有若干元素,各层元素间的关系用相连的直线表示;
(2)通过相互比较确定各准则对目标的权重,及各方案对每一准则的权重;
将上述两组权重进行综合,确定各方案对目标的权重。
三个问题:
(1)评价的目标是什么?
(2)为了达到这个目标有几种可选的方案?
(3)评价的准则(指标)是什么?
重要程度表格:
标度(定量结果) | 含义(定性结果) |
1 | 两个因素相比,具有同样重要性 |
3 | 一个因素比另一个因素稍微重要 |
5 | 一个因素比另一个因素明显重要 |
7 | 一个因素比另一个因素强烈重要 |
9 | 一个因素比另一个因素极端重要 |
2,4,6,8 | 两相邻判断的中值 |
倒数 | 若因素i与因素j的重要性之比为aij,那么因素j与因素i重要性之比为aij=1/aij |
如果写作,建议翻看《lingo培训基础教程》第P176~P179
如何科学地设定权重?(相对权重向量的确定)
对指标的重要性进行两两比较,构造判断矩阵,从而求出权重。矩阵中aij的意义是第i个指标相对于第j个指标的重要程度。
设想把一块大石头Z分成n个小块c1,c2,…,cn,其重量分别为w1,w2,…,wn,则将n块小石头作两两比较,记ci,cj的相对重量为
要注意比较的逻辑关系,如:A<B,B=C,那么C>A
(1)判断矩阵A对应最大特征值λmax的特征向量W,经归一化后即为同一层次相应因素对于上一层次某因素相对重要性的排序权值,这一过程称为层次单排序。
归一化处理方法:
对正向序列x1,x2,x3…,xn进行变换,
则新序列y1,y2,…,yn∈[0,1]且无量纲,并且显然有
若A的最大特征值λmax对应的特征向量W=[w1,w2,…,wn],则aij=wi/wj,任意i,j=1,2,…,n,即(也为正互反矩阵)
(2)检验过程
①计算一致性指标CI,CI定义如下式所示:
②查找相应的平均随机一致性指标RI。对于n=1,…,9,Saay给出了RI的值,如下表:
不同n值对应的RI值
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
RI | 0 | 0 | 0.58 | 0.9 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 |
注:在实际运用中,n很少超过10,如果指标的个数大于10,则可以考虑建立二级指标体系。
如上表所示,RI值是通过统计计算而得,用随机方法构造1000个样本矩阵:随机从1~9及其倒数中抽取数字构造正互反矩阵,求得最大特征根的平均值λmax',并定义:
补充:当n的阶数较大也就是指标较多时,
不同n值对应的RI值
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
RI | 0 | 0 | 0.52 | 0.89 | 1.12 | 1.26 | 1.36 | 1.41 | 1.46 |
10 | 11 | 12 | 13 | 14 | 15 | ||||
1.49 | 1.52 | 1.54 | 1.56 | 1.58 | 1.59 |
注:在实际运用中,n很少超过10,如果指标的个数大于10,则可以考虑建立二级指标体系。
如上表所示,RI值是通过统计计算而得,用随机方法构造1000个样本矩阵:随机从1~9及其倒数中抽取数字构造正互反矩阵,求得最大特征根的平均值λmax',并定义:
③计算一致性比例CR,CR定义如下式所示:
当CR<0.1时,认为判断矩阵的一致性是可以接受的,否则应对判断矩阵做适当修正。
在判断矩阵具有完全一致性的条件下,我们可以通过解特征值问题
A*W=λmax*W
例题:lingo求解最大特征根,进行一致性检验[2]P175
- model:
-
- sets:
-
- num/1..4/:w;!w表示权重
-
- link(num,num):a;
-
- endsets
-
- data:
-
- a=
-
- 1 0.5 0.33333 0.2
-
- 2 1 0.5 0.33333
-
- 3 2 1 0.5
-
- 5 3 2 1;
-
- enddata
-
- max=lambda;!最大特征根
-
- @for(num(i):@sum(num(j):a(i,j)*w(j))=lambda*w(i));
-
- @sum(num:w)=1;
-
- CI=(lambda-4)/3;CR=CI/0.9;
-
- end

注:矩阵的数字不能用分数表示
求解结果
利用lingo软件,求得矩阵A的最大特征值为λmax=4.0145,求得的权重向量为
w=[0.0882,0.1570,0.22720,0.4829]T(转置)
资料来源:清风建模
size(A)函数是用来求矩阵大小的,它返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数。
如:
A=[1,2,3;4,5,6]
B=[1,2,3,4,5,6]
size(A)
ans=2 3 %表示2行3列
或者[r,c]=size(A)得出r=2,c=3
%将矩阵A的行数返回到第一个变量r,将矩阵的列数返回到第二个变量c
注意区分矩阵和行向量
2.repmat函数
B=repmat(A,m,n),即把A作为B的函数,B由m行×n列个A平铺而成
3.矩阵的运算
在matlab的矩阵运算中,“*”和“/”代表矩阵之间的乘法和除法(A/B=A*inv(B))
两个形状相同的矩阵对应元素之间的乘除法需要用“.*”“./”
矩阵中每个元素和常数相乘或相除两种方法都可以使用
矩阵的加法就是把对应的元素相加,矩阵的减法就是把对应的元素相减
注意:A^2表示A*A,而A.^2表示把矩阵中的元素进行平方
4.求特征值和特征向量
函数eig(A)
两种常见用法:
(1)A=[1,2,3;4,5,6;7,8,9]; E=eig(A)
求A的全部特征值,构成向量E
(2)[V,D]=eig(A)
求A的全部特征值,构成对角矩阵D,并求A的特征向量构成V的列向量
V的每一列都是D中与之相同列的特征值的特征向量
5.输出和输入函数
disp(a)屏幕输出函数,相当于c语言中的printf函数(后面的分号有无都可)
input(a)输入函数
如:disp('请输入判断矩阵A:')—>请输入判断矩阵A:
6.sum求和函数
(139条消息) Matlab函数学习---sum函数(计算矩阵、数组和向量元素总和)_亦我飞也的博客-CSDN博客_matlab中sum函数用法
S=sum(A,dim)沿维度计算A的所有元素的总和
如:S=sum(A,2)是包含每一列总和的列向量
7.if判断语句
Matlab的判断语句,if所在行后面不需要冒号,但最后一定要以end结尾,中间语句注意缩进
如:
a=input('请输入考试分数:')
请输入考试分数:100
if a>=90
disp('成绩优秀')
elseif a>=60
disp('成绩良好')
else
disp('成绩挂科')
end
输出:成绩优秀
8.for循环
不用repmat函数而用for循环n次,按行复制已经求和好的行向量
SUM_A=[]; for i=1:n %n指的是判断矩阵的行数或列数 SUM_A=[SUM_A;sum_A] end |
9.find函数
可以用来返回向量或矩阵中不为0的元素的位置索引
10.提取矩阵中指定位置的元素
判断矩阵的由来:一般由专家填写或者问卷调查
- disp('请输入判断矩阵A:')
-
- A=[1 0.5 0.3 0.2;
-
- 2 1 0.5 0.3;
-
- 3 2 1 0.5;
-
- 5 3 2 1]
-
- %算数平均法求权重
-
- %①:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
-
- % 方法一:
-
- sum_A=sum(A);
-
- [n,n]=size(A);
-
- SUM_A=repmat(sum_A,n,1);
-
- % 方法二:初始化SUM_A,再用for循环按行复制已经进行过按列求和的行向量
-
- % SUM_A=[];
-
- % for i=1:n %n指的是判断矩阵的行数或列数
-
- % SUM_A=[SUM_A;sum_A]
-
- % end
-
- B=A./SUM_A;
-
- % ②:将归一化的各列按行求和得到列向量,然后每个元素除以n即可得到权重向量
-
- disp('算数平均法求权重的结果为:')
-
- disp(sum(B,2)/n)

权重向量:
用两种方法得到的结果只有细微差别:
代码如下:
- disp('请输入判断矩阵A:')
- A=[1 0.5 0.3 0.2;
- 2 1 0.5 0.3;
- 3 2 1 0.5;
- 5 3 2 1]
- [n,n]=size(A);
- %几何平均法求权重
- %①:将A的元素按照行相乘得到一个新的列向量,prod用法类似sum
- multiply_A=prod(A,2);
- %②:将新向量的每个分量开n次方根
- multiply_n_A=multiply_A.^(1/n);
- %③:对该列向量进行归一化即可得到权重向量
- disp('几何平均法求权重的结果为:')
- disp(multiply_n_A./sum(multiply_n_A))
代码如下:
- disp('请输入判断矩阵A:')
-
- A=[1 0.5 0.3 0.2;
-
- 2 1 0.5 0.3;
-
- 3 2 1 0.5;
-
- 5 3 2 1]
-
- %①:求矩阵A的最大特征值及其对应的特征向量
-
- %特征值法求权重,V是特征向量,D是由特征值构成的对角矩阵
-
- [V,D]=eig(A)
-
- %找到最大特征值,先找D中每一列的最大值,然后再找最大特征值
-
- Max_eig=max(D(:)); %可改成max(max(D))
-
- %找出对角阵D中第一个和最大特征值相等的元素位置,记录它的行和列
-
- [r,c]=find(D==Max_eig,1); %最大特征值的位置记录为1
-
- %②:对求出的特征向量进行归一化处理即可得到权重
-
- disp('特征值法求权重的结果为:')
-
- disp(V(:,c)./sum(V(:,c)))

注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。一致性矩阵的特点:各行/各列之间成倍数关系。
代码如下:
- [n,n]=size(A);
-
- CI=(Max_eig-n)/(n-1);
-
- RI=[0 0 0.58 0.9 1.12 1.24 1.32 1.41 1.32 1.41 1.45];
-
- CR=CI/RI(n)
-
- disp('一致性指标CI=');disp(CI);
-
- disp('一致性比例CR=');disp(CR);
-
- if CR<0.1
-
- disp('因为CR<0.1,所以判断矩阵A的一致性可以接受!');
-
- else
-
- disp('注意CR<0.1,所以判断矩阵A需要进行修改');
-
- end

例题:
《Matlab数学建模经典案例实战》余胜威P200:食堂用餐满意度问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。