Matlab笔记层次分析法020Word格式.docx
- 文档编号:3455748
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:16
- 大小:721.48KB
Matlab笔记层次分析法020Word格式.docx
《Matlab笔记层次分析法020Word格式.docx》由会员分享,可在线阅读,更多相关《Matlab笔记层次分析法020Word格式.docx(16页珍藏版)》请在冰点文库上搜索。
称为判断矩阵(或成对比较矩阵)。
Saaty根据绝大多数人认知事物的心理习惯,建议用1~9及其倒数作为标度来确定aij的值。
其中,2,4,6,8分别介于1,3,5,7,9对应的重要程度之间。
显然,A中的元素满足:
i)aij>
0;
ii)aji=1/aij;
iii)aii=1
称为正互反矩阵。
例如,选购笔记本电脑模型中,可以根据实际三台电脑的重量得到电脑对准则层B3的判断矩阵(aij可以取笔记本电脑j与i的重量之比,重量越轻越好):
3、层次单排序及判断矩阵的一致性检验
通常用特征根法从判断矩阵导出,单一准则下元素相对排序权重。
定义若n阶正互反矩阵(aij)n×
n满足aikakj=aij(对应aij=wi/wj,故需要aikakj=(wi/wk)/(wk/wj)=aij),则称(aij)n×
n为一致性矩阵。
特征根法的基本思想就是,当正互反矩阵(aij)n×
n为一致性矩阵时,对应于判断矩阵的最大特征根λmax的特征向量,经归一化后(使向量中各元素之与等于1)即为排序权向量,记为w,w的元素为同一层次因素对于上一层次某因素相对重要性的排序权值,这一过程称为层次单排序。
能否进行层次单排序,就瞧判断矩阵就是否为一致性矩阵,有如下定理:
定理n阶正互反矩阵A为一致性矩阵的充要条件就是,A的最大特征值λmax=n、
在实际操作中,由于客观事物的复杂性以及人们对事物判断比较时的模糊性,很难构造出完全一致的判断矩阵。
因此,Satty在构造层次分析法时,提出了一致性检验,所谓一致性检验就是指判断矩阵允许有一定不一致的范围。
一致性检验步骤如下:
1)计算判断矩阵A的最大特征值λmax;
2)求出一致性指标(ConsistenceyIndex):
C、I、=0表示完全一致,C、I、越大越不一致;
3)用随机模拟取平均的方法,求相应的平均随机一致性指标R、I、,或者直接用Satty模拟1000次得到的R、I、表:
4)计算一致性比率:
5)判断,当C、R、<
0、1时,认为判断矩阵A有满意的一致性;
若C、R、≥0、1,应考虑修正判断矩阵A、
4、计算各元素对目标层的合成权重(层次总排序)
为了实现层次分析法的最终目的,需要从上而下逐层进行各层元素对目标合成权重的计算。
设已计算出第k-1层nk-1个元素相对于目标的合成权重为:
再设第k层的nk个元素关于第k-1层第j个元素(j=1,…,nk-1)的单一准则排序权重向量为:
上式对k层的nk个元素就是完全的,若某些元素不受k-1层第j个元素支配,相应位置用0补充,于就是得到nk×
nk-1阶矩阵:
从而可以得到第k层的nk个元素关于目标层的合成权重向量:
按递归展开得
写成分量形式为
各层元素对目标层的合成排序权重向量就是否可以满意接受,与单一准则下的排序问题一样,需要进行综合一致性检验:
当C、R、(k)<
0、1时,则认为层次结构在第k层以上的判断具有整体满意的一致性。
注:
实际应用中,整体一致性检验常不予进行。
主要原因就是,整体考虑十分困难;
其次若每个单一准则下的判断矩阵具有满意的一致性,而整体达不到满意的一致性时,调整起来非常困难。
另外,整体一致性的背景也不如单一准则下的背景清晰,它的必要性有待进一步研究。
三、Matlab实现
实现层次分析法的Matlab函数:
ahp、m
function[W,ahpResult]=ahp(C)
%层次分析法
%C为n×
1的元胞数组,存储整个层次模型结构:
第2层对第1层、第3层对第2层、、、、第n+1层对第n层
%假设第k层有m_k个元素,从左到右依次编号1,、、、,m_k
%C{k}也就是元胞数组,k=1,、、、,n
%C{k}{1,j}存储受第j元素支配的第k+1层各元素的判断矩阵(j=1,2,、、、,m_k)
%C{k}{2,j}存储第k+1层各元素就是否受第k层第j元素支配的(m_k+1)*1的逻辑数组,1表示支配,0表示不受支配
%W返回方案层对目标层的最终权重向量
%ahpResult为n×
1的元胞数组,存储层次分析过程各层的结果信息,ahpResult{k}也就是元胞数组
%ahpResult{k}{1,j}返回第k+1层所有元素相对第k层j元素的权重向量,第k+1层元素不受第k层j元素支配的权重为0
%ahpResult{k}{2,j}返回第k+1层所有元素相对于第k层第j元素的判断矩阵的最大特征值
%ahpResult{k}{3,j}返回第k+1层所有元素相对于第k层第j元素的判断矩阵的一致性比率C、R、
RI=[000、580、901、121、241、321、411、451、491、51];
%平均随机一致性指标
n=length(C);
%得到C的长度n,于就是知道模型总层数为n+1
ahpResult=cell(n,1);
%´
存储各层结果信息
fork=1:
n
m_k=size(C{k},2);
%k层的元素个数
ahpResult{k}=cell(m_k,1);
forkk=1:
m_k
%求第k+1层各元素对第k层kk元素的成对比较矩阵的特征值与特征向量
[V,D]=eig(C{k}{1,kk});
[maxD,ind]=max(diag(D));
%求最大特征值与其位置
%为存储第k+1层所有元素相对k层kk元素的权重预留出空间,长度应等于C{k}{2,kk}的长度
ahpResult{k}{1,kk}=zeros(length(C{k}{2,kk}),1);
%将相应正互反矩阵属于最大特征值的特征向量归一化后赋给ahpResult{k}{1,kk}中相应位置
%这些位置由逻辑数组C{k}{2,kk}决定
ahpResult{k}{1,kk}(C{k}{2,kk})=V(:
ind)/sum(V(:
ind));
ahpResult{k}{2,kk}=maxD;
%C{k}{1,kk}正互反矩阵的最大特征值
nn=size(C{k}{1,kk},1);
%C{k}{1,kk}的阶数
ahpResult{k}{3,kk}=(maxD-nn)/(nn-1)/RI(nn);
%相应的一致性比率C、R、
end
W=ahpResult{1}{1,1};
fork=2:
%cat(2,ahpResult{k}{1,:
})把k+1层所有元素相对k层各个元素的权重向量横向排在一起生成权重矩阵U^(k)
W=cat(2,ahpResult{k}{1,:
})*W;
用该函数实现层次分析法的关键就是,把整个层次结构存入嵌套元胞数组C中(见程序注释):
C{k}——存储第k+1层与第k层的结构(k=1,…,n);
设第k层有mk个元素,其中第j元素与第k+1层的结构关系存储到C{k}{…,j}中(j=1,…,mk),需要存储的信息有:
1受第j元素支配的第k+1层各元素的判断矩阵
2第k+1层各元素就是否受第k层第j元素支配(即有没有连线)
所以需要两个位置,即C{k}{1,j}与C{k}{2,j}、
例1某工厂有一笔企业留成利润,需要决定如何分配使用。
已经决定有三种用途:
奖金、集体福利措施、引进技术设备。
考察准则也有三个:
就是否能调动职工的积极性、就是否有利于提高技术水平、考虑改善职工生活条件。
建立如下层次模型:
经过工厂决策人员讨论,得到如下判断矩阵:
1、第2层对第1层
三个元素C1,C2,C3都受A支配,判断矩阵C{1}{1,1}为
相应的逻辑数组C{1}{2,1}为[truetruetrue]、
2、第3层对第2层
(1)第3层对第2层第1个元素C1
受C1支配的只有两个元素P1与P2,判断矩阵C{2}{1,1}为
相应的逻辑数组C{2}{2,1}为[truetruefalse]、
(2)第3层对第2层第2个元素C2
受C2支配的只有两个元素P2与P3,判断矩阵C{2}{1,2}为
相应的逻辑数组C{2}{2,2}为[falsetruetrue]、
(3)第3层对第2层第3个元素C3
受C3支配的只有两个元素P1与P2,判断矩阵C{2}{1,3}为
相应的逻辑数组C{2}{2,3}为[truetruefalse]、
3、有了上面的分析,层次模型的元胞数组表示C已经确定,调用函数ahp、m即可
C=cell(2,1);
%共n+1=3层,故n=2
C{1}{1,1}=[11/51/3;
513;
31/31];
%第2层(C层)关于第1层(目标层A)的判断矩阵
C{1}{2,1}=[truetruetrue];
%相应的逻辑数组
C{2}{1,1}=[11/3;
31];
%第3层(P层)关于第2层第1元素C1的判断矩阵
C{2}{2,1}=[truetruefalse];
C{2}{1,2}=[11/5;
51];
%第3层(P层)关于第2层第2元素C2的判断矩阵
C{2}{2,2}=[falsetruetrue];
C{2}{1,3}=[12;
1/21];
%第3层(P层)关于第2层第3元素C3的判断矩阵
C{2}{2,3}=[truetruefalse];
[W,ahpResult]=ahp(C);
%调用ahp求解
W%输出总排序的权重向量
运行结果:
W=0、19840、27080、5308
W就就是方案层各个方案所占的比重,可见引进技术设备所占比重最大,改善员工福利次之。
体现在奖金分配上,即用全部留成利润的53、08%引进技术设备,27、08%改善员工福利,19、84%发奖金。
例2假设某人在制定食谱时有三类食品可选:
肉、面包、蔬菜。
这三类食品所含营养成分及单价如下表所示:
假设该人体重为55kg,每天对各类营养的最小需求为
维生素A7500IU
维生素B21、6338mg
热量Q8548、5kJ
问题就是:
应如何制定食谱使得在保证营养的前提下支出最小?
单纯考虑问题条件,容易建立如下的线性规划模型:
设选择肉x1,面包x2,蔬菜x3,则有
用Matlab求解线性规划问题的函数linprog,可以求出最优解:
f=[0、0275;
0、006;
0、007];
A=-[0、35270、000525;
0、00210、00060、002;
11、9311、511、04];
b=-[7500;
1、6338;
8548、5];
options=optimset('
LargeScale'
'
off'
Simplex'
on'
);
[x,fval,flag]=linprog(f,A,b,[],[],[0;
0;
0],[infinfinf],[],options)
x=0687、5267610、6420
fval=8、3997
flag=1%表示算法成功
求解出的结果就是,每天不吃肉,吃面包687、5267g,蔬菜610、642g,最低支出为8、40元。
但实际考虑的话,这个方案就是难以让人接受的,只考虑了营养够、价格低,没有考虑到营养均衡(需要吃一定量的肉)。
为此,我们先用层次分析法确定每天需要肉、面包、蔬菜的比重,再重新线性规划。
建立如下的层次模型:
注意:
由于第2层支出因素D2直接支配第4层,需要在第3层补上一个因素“补项B”(仍当作“支出”瞧待),它只受D2支配,并且支配D2的每个支配因素(第4层的肉Me,面包Br,蔬菜Ve)。
有了上面的层次结构,再根据偏好建立判断矩阵(当然偏好因人而异):
判断矩阵:
逻辑数组:
C{1}{2,1}=[truetrue]、
(1)第3层对第2层第1元素D1
C{2}{2,1}=[truetruetruefalse]、
(2)第3层对第2层第2元素D2
C{2}{1,2}=[1]
C{2}{2,2}=[falsefalsefalseture]、
3、第4层对第3层
(1)第4层对第3层第1元素A
判断矩阵(用数据直接做比得到):
C{3}{2,1}=[truetruetrue]、
(2)第4层对第3层第2元素B2
C{3}{2,2}=[truetruetrue]、
(3)第4层对第3层第3元素Q
C{3}{2,3}=[truetruetrue]、
(4)第4层对第3层第4元素B
判断矩阵(用单价比的倒数,因为单价越高越不重要):
C{3}{2,4}=[truetruetrue]、
4、有了上面的分析,层次模型的元胞数组表示C已经确定,调用函数ahp、m即可
C=cell(3,1);
C{1}{1,1}=[11/3;
C{1}{2,1}=true(2,1);
C{2}{1,1}=[112;
112;
1/21/21];
C{2}{2,1}=[truetruetruefalse];
C{2}{1,2}=1;
C{2}{2,2}=[false,false,false,true];
C{3}{1,1}=[1,0、3527/0、0005,0、3527/25;
0、0005/0、3527,1,0、0005/25;
25/0、3527,25/0、0005,1];
C{3}{2,1}=true(3,1);
C{3}{1,2}=[1,0、0021/0、0006,0、0021/0、002;
0、0006/0、0021,1,0、0006/0、002;
0、002/0、0021,0、002/0、0006,1];
C{3}{2,2}=true(3,1);
C{3}{1,3}=[1,11、93/11、51,11、93/1、04;
11、51/11、93,1,11、51/1、04;
1、04/11、93,1、04/11、51,1];
C{3}{2,3}=true(3,1);
C{3}{1,4}=[1,0、006/0、0275,0、007/0、0275;
0、0275/0、006,1,0、007/0、006;
0、0275/0、007,0、006/0、007,1];
C{3}{2,4}=true(3,1);
W
W=0、23760、22930、5331
该结果表明,按这个人的情况,肉、面包、蔬菜的比例取0、2376,0、2293,0、5331比较合适。
引入参变量k,令x1=0、2376k,x2=0、2293k,x3=0、5331k,将其代入前文的线性规划模型,得到
用linprog求解:
f=[0、0116];
A=-[13、4116;
0、0017;
6、0282];
W=[0、23760、22930、5331];
[k,fval,flag]=linprog(f,A,b,[],[],[0],[inf],[],options)
x=k*W
k=1、4181e+03
fval=16、4498
flag=1
x=336、9370325、1669755、9811
故k=1418、1,x1=336、94,x2=325、17,x3=755、98、每天食品支出16、45元。
对于不同的人可以有不同的判断矩阵C{1}{1,1},即营养与支出的相对重要程度,例如,修改为[11/3;
31],可以得到x1=188、88,x2=497、82,x3=567、04、每天食品支出12、14元。
主要参考文献:
吴鹏,《Matlab高效编程技巧与应用:
25个案例分析》第11章。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 笔记 层次 分析 020