Matlab笔记层次分析法020.docx

上传人:b****7 文档编号:9634236 上传时间:2023-02-05 格式:DOCX 页数:16 大小:721.31KB
下载 相关 举报
Matlab笔记层次分析法020.docx_第1页
第1页 / 共16页
Matlab笔记层次分析法020.docx_第2页
第2页 / 共16页
Matlab笔记层次分析法020.docx_第3页
第3页 / 共16页
Matlab笔记层次分析法020.docx_第4页
第4页 / 共16页
Matlab笔记层次分析法020.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

Matlab笔记层次分析法020.docx

《Matlab笔记层次分析法020.docx》由会员分享,可在线阅读,更多相关《Matlab笔记层次分析法020.docx(16页珍藏版)》请在冰豆网上搜索。

Matlab笔记层次分析法020.docx

Matlab笔记层次分析法020

20.层次分析法

一、概述

层次分析法(AnalyticHierarchyProcess,AHD)是将要决策的问题及其有关因素分解成目标、准则、方案等层次,进而进行定性和定量分析的决策方法。

它的特征是合理地将定性与定量决策结合起来,按照思维、心理的规律把决策过程细致化(层次化、数量化)。

层次分析法广泛地应用到处理复杂的决策问题,而决策是基于该方法计算出的权重,所以也常用来确定指标的权重。

层次分析法的基本思路与人们对一个决策问题的思维、判断过程大体上是一样的。

例如,选购一台笔记本电脑,假设有三种不同品牌款式的笔记本电脑A、B、C供选择。

我们一般会根据价格、外观、重量、用途、功耗、品牌等一些准则去反复比较这个三个候选。

首先,会确定这些准则在自己心目中各占多大比重,不同的人这种比重会有很大差异(喜欢玩游戏的人看重硬件性能和散热、预算有限的人看重价格等)。

其次,还会就每一个准则将A、B、C进行对比,比如A最便宜,B次之;C性能最好,B次之;C的品牌最知名等。

最后,将这两个层次的比较判断进行综合,在A、B、C中确定一台作为最符合自己需求的电脑。

二、算法步骤

1.将问题条理化、层次化,建立层次结构模型

1)最高层(目标层)——只有一个元素:

决策目标;

2)中间层(准则层)——考虑的因素,决策的准则、子准则;

3)最底层(方案层)——决策时的备选方案、措施。

层次分析法要解决的问题是,求出最底层对最高层的相对权重,以此对最底层的方案、措施进行排序,选择最优方案。

注1:

为了避免两两比较判断过于复杂,每层次中各元素所支配的元素一般不要超过9个,否则应划分为若干子层;

注2:

层次分析法只考虑相邻两个层次间自上向下的支配作用,认为同一层次的元素间相互独立,若考虑进来需要网络分析法(ANP)。

例如前文提到的选购笔记本电脑的决策模型,可以建立如下的层次结构:

2.构造判断矩阵(成对比较矩阵)

构造好层次模型后,针对某一层来讲,在比较第i个元素与第j个元素相对于上一层某个因素的重要性时,使用数量化的相对权重aij来表示,假设共有n个元素参与比较,则矩阵

称为判断矩阵(或成对比较矩阵)。

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

end

W=ahpResult{1}{1,1};

fork=2:

n

%cat(2,ahpResult{k}{1,:

})把k+1层所有元素相对k层各个元素的权重向量横向排在一起生成权重矩阵U^(k)

W=cat(2,ahpResult{k}{1,:

})*W;

end

用该函数实现层次分析法的关键是,把整个层次结构存入嵌套元胞数组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)。

有了上面的层次结构,再根据偏好建立判断矩阵(当然偏好因人而异):

1.第2层对第1层

判断矩阵:

逻辑数组:

C{1}{2,1}=[truetrue].

2.第3层对第2层

(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;31];

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,ahpResult]=ahp(C);

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];

b=-[7500;1.6338;8548.5];

W=[0.23760.22930.5331];

options=optimset('LargeScale','off','Simplex','on');

[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章。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1