用Matlab实现AHP的算法Word下载.docx

上传人:b****5 文档编号:20360093 上传时间:2023-01-22 格式:DOCX 页数:24 大小:87.49KB
下载 相关 举报
用Matlab实现AHP的算法Word下载.docx_第1页
第1页 / 共24页
用Matlab实现AHP的算法Word下载.docx_第2页
第2页 / 共24页
用Matlab实现AHP的算法Word下载.docx_第3页
第3页 / 共24页
用Matlab实现AHP的算法Word下载.docx_第4页
第4页 / 共24页
用Matlab实现AHP的算法Word下载.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

用Matlab实现AHP的算法Word下载.docx

《用Matlab实现AHP的算法Word下载.docx》由会员分享,可在线阅读,更多相关《用Matlab实现AHP的算法Word下载.docx(24页珍藏版)》请在冰豆网上搜索。

用Matlab实现AHP的算法Word下载.docx

0.72120.44430.5315

-0.68630.56210.4615

-0.0937-0.69760.7103

D=

-0.016600

01.48010

002.5365

求得的3个特征值是-0.0166、1.4801和2.5365,各特征值对应的特征向量为V的各列构成的向量。

1.2MATLAB的M文件

用MATLAB语言编写的程序称为M文件。

M文件是由若干MATLAB命令组成在一起构成的,它可以完成某些操作,也可以实现某种算法。

M文件可以根据调用方式的不同分为两类:

命令文件(ScriptFile)和函数文件(FunctionFile)。

它们的扩展名均为.m。

函数文件由function语句引导,其基本结构为:

function输出形参表=函数名(输入形参表)

注释说明部分

函数体语句

我们通过举例说明如下:

例2-2分别建立命令文件和函数文件,将求矩阵的一致性指标CI:

CI=(λmax-n)/(n-1)

程序1建立命令文件并以文件名CI.m存盘:

max=input('

pleaseinputmax:

'

);

n=input('

pleaseinputn:

CI=(max-n)/(n-1)

然后在MATLAB的命令窗口中输入CI即可。

程序2建立函数文件CI.m。

functionc=CI(max,n)

c=(max-n)/(n-1)

然后在MATLAB的命令窗口调用该函数文件。

c=CI(max,n)

2.基于MATLAB的AHP实现

2.1AHP的MATLAB的计算流程框图

根据层次分析法的一般步骤我们得到在MATLAB工具上实现的计算程序流程框图,如图2所示[16]

图2以MATLAB实现的层次分析法的计算流程框图

通过流程框图,层次分析的基本步骤如下:

第一步:

准则层对目标层的判断矩阵归一化且判断是否满足一致性;

第二步:

第一步满足时,将方案层对准则层的判断矩阵归一化并判断其一致性;

第三步:

当第一、二步满足时,求方案层的总排序权值与总CR并判断一致性。

2.2平均随机一致性指标的MATLAB实现

运用层次分析法决策者需要通过反复地解决决策问题,将同一层次的各元素与上一层次中某一准则的重要性进行比较,从而构造出两两判断比较矩阵A=(aij)nn(称为成对比较矩阵)。

前面已经描述了九级标度法,此处运用其他描述,则这些成对比较矩阵应满足如下条件:

(l)

>

0

(2)

·

=l(3)

=l

按照事物逻辑要求,该矩阵还应具备一致性,即满足:

=

前面已经给出由于客观事物的复杂性与决策者的认识的多样性,实际问题的成对比较矩阵不可能做到严格上的一致性,因而,借助平均随机一致性指标RI来相对判定其一致性程度。

其中表1-4是已经计算好的1~15阶矩阵的RI值表,但未给出其实现过程,且各文献的RI值表不完全相同。

究其原因除没有太大必要介绍外,真正去实现它却有如下三个难度:

(1)随机两两判断矩阵中的元素要求是1~9和它们对应的倒数共17个整数与小数的均匀分布很难处理。

(2)一般高级编程语言实现成对比较矩阵及相关计算,非常复杂,且占用内存巨大,耗时多。

(3)随机种子源不能控制。

本文使用数学软件包MATLAB对其进行计算。

其设计解决思路为:

先用软件包中随机函数产生数1~17的均匀分布的n阶矩阵,然后在软件包中采用不同技巧将它转化为成对比较矩阵,最后用循环语句计算出RI值。

结果如下表:

表3-1计算的RI值

阶数

1

2

3

4

5

6

7

8

9

RI

0.5440

0.8980

1.1313

1.2515

1.3495

1.4190

1.4542

以n=4为例,过程详见如下程序清单,其中随机成对比较矩阵的实现见相应注释部分。

[15]

MATLAB的程序M文件:

functionri%计算RI值的命令文件

n=4;

ri=0;

m=100;

rand('

seed'

21)%控制随机发生器

fori=1:

m

a=ceil(17*rand(n));

%产生n阶l~17的随机阵

a(find(a=8))=8.1;

%消除0为分母

b=1./(a-8);

%产生一个辅助阵

a(find(a>

9))=b(find(a>

9));

%借助b,将9~17分别转化为

~

a(find(a=8.1))=8;

e=eye(n);

%产生一个4阶单位阵

c=1./a;

%将a中每个元素换成相应倒数

c=c'

;

%将c转置

c=tril(c,-1);

%抽取c的下三角(不含主对角线)

a=triu(a,1);

%抽取a的上三角(不含主对角线)

a=a+c+e;

%实现随机成对比较阵a

k=size(a,1);

%计算a的行维数

ri=ri+(max(abs(eig(a)))-k)/(k-1);

%计算100次RI值

end

ri/m%计算平均RI值

2.3AHP各环节的MATLAB实现

以目标矩阵A=

准则层矩阵为P1=

P2=

,P3=

为例,运用MATLAB进行数据处理。

2.3.1特征向量及其归一化的MATLAB实现

MATLAB中求矩阵特征值和特征向量的函数是eig,其调用的格式为[V,D]=eig(A),其中,V为特征向量矩阵,D为特征值矩阵。

层次分析法中需要求得是最大特征值及对应的归一化特征向量,而且考虑到eig函数在求得的特征值中可能会存在复数。

因此,运用直接输入程序代码会产生一定的误差。

在此需要对求得的V、D进行适当选择,定义一个M-filemaxeigvalvec.m来实现。

function[maxeigval,w]=maxeigvalvec(A)%求最大特征值及对应的归一化特征向量

%A为判断矩阵

[eigvec,eigval]=eig(A);

eigval=diag(eigval);

%特征向量

eigvalmag=imag(eigval);

realind=find(eigvalmag<

eps);

realeigval=eigval(realind);

%实特征根

maxeigval=max(realeigval)%最大特征值

index=find(eigval==maxeigval);

vecinit=eigvec(:

index);

%最大特征值对应的特征向量

w=vecinit./sum(vecinit)%特征向量归一化

在MATLAB中键入如下指令:

A=[1,3,5;

1/3,1,3;

1/5,1/3,1];

P1=[1,2;

1/2,1];

P2=[1,3,5;

P3=[1,2;

[max

(1),wA]=maxeigvalvec(A);

[max

(2)wP1]=maxeigvalvec(P1);

[max(3),wP2]=maxeigvalvec(P2);

[max(4),wP3]=maxeigvalvec(P3);

MATLAB运行结果如下:

maxeigval=

3.0385

w=

0.6370

0.2583

0.1047

2

w=

0.6667

0.3333

2.3.2一致性检验及单排序的MATLAB实现

由AHP的MATLAB的计算流程图知,必须对各层次间的判断矩阵进行层次单排序和一致性检验。

因此,定义sglsortexamine.m函数来实现层次单排序的一致性检验。

function[RI,CI]=sglsortexamine(maxeigval,A)

%层次分析法单排序一致性检验

%maxeigval为最大特征值,A为判断矩阵

n=size(A,1);

RIT=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49,1.51];

RI=RIT(n);

CI=(maxeigval-n)/(n-1);

CR=CI/RI;

ifCR>

=0.10

disp([input('

矩阵没通过一致性检验,请重新调整判断矩阵'

)]

else

矩阵通过一致性检验'

)]);

[RIA,CIA]=sglsortexamine(max

(1),A);

[RIP1,CIP1]=sglsortexamine(max

(2),P1);

[RIP2,CIP2]=sglsortexamine(max(3),P2);

[RIP3,CIP3]=sglsortexamine(max(4),P3);

运行结果如下:

矩阵通过一致性检验

2.3.3一致性检验及总排序的MATLAB实现

通过层次单排序(权重)计算后,进行层次合成计算,在此本文定义tolsortvec.m函数计算层次总排序的权重并进行一致性检验。

functiontw=tolsortvec(utw,dw,CIC,RIC)

%求层次总排序权重并进行一致性检验

%utw为上一层因素的总排序权重行向量

%dw为下一层因素相对于上一层各因素的层次单排序权重矩阵

%CIC为一致性指标列向量

%RIC为随机一致性指标列向量

tw=dw*utw

CR=utw'

*CIC/(utw'

*RIC);

层次总排序没通过一致性检验,请重新调整判断矩阵'

层次总排序通过一致性检验'

在MATLAB中输入如下指令:

dw=zeros(7,3);

dw=(1:

2,1)=wP1;

dw=(3:

5,2)=Wp2;

dw=(6:

7,3)=wP3;

CIC=[CIP1;

CIP2;

CIP3];

RIC=[RIP1;

RIP2;

RIP3];

tw=tolsortvec(wA,dw,CIC,RIC)’;

tw=

0.4247

0.2123

0.0667

0.1646

0.0270

0.0698

0.0349

层次总排序通过一致性检验

其中tw是层次总排序结果。

因此,根据数据建立如下的层次总排序表。

表3-3层次总排序表(权重)

A

P

层次P的

总排序结果注

0.6370

0.2583

0.1047

P1

P2

 

0.6370

P3

注:

按概率乘法,P层次总排序指标的权重值为N—P层次指标的权重

与相应上一层次指标A—N层权重的积,且总排序权重值的和为1。

2.3.4选择最优排序

计算出层次总排序后,为了使决策者能迅速得出结果,本文对层次总排序进行最优排序。

运用MATLAB键入如下指令:

n=length(tw);

n

t=max(tw);

b(i)=t;

[mn]=find(a==t);

tw(n)=[];

b

b=

0.0276

利用MATLAB大大缩短了计算复杂矩阵的时间,为决策者节省了宝贵的时间,从而有更多的精力投入其他事务。

3.基于MATLAB的AHP应用

3.1挑选合适工作问题

某毕业生选择工作,经双方恳谈,假设已有三个单位C1,C2,C3表示愿意录用他。

该生对三个单位进行了解后,选取了一些中间指标进行考察,例如单位的研究课题,发展前途,待遇,同事情况,地理位置,单位名气等。

根据层次分析法,试求该生工作优先排序(给出权值、计算程序),并给出最终选择决策。

现以A、B、C表示选择工作的三个层次,建立如下结构模型:

图3选择单位层次结构图

根据成对比较法,得到相应判断矩阵如下表:

表4-1A-B判断矩阵

B1

B2

B3

B4

B5

B6

1/2

1/4

1/5

1/3

表4-2B1~C判断矩阵

表4-3B2~C判断矩阵

C1

C2

C3

表4-4B3~C判断矩阵

1/7

表4-5B4~C判断矩阵

表4-6B5~C判断矩阵

表4-7B6~C判断矩阵

1/9

现在在MATLAB中分别用直接输入程序法和M—文件方法求解。

1)、直接输入代码法:

在MATLAB中输入如下程序:

A=[1,1,1,4,1,1/2;

1,1,2,4,1,1/2;

1,1/2,1,5,3,1/2;

1/4,1/4,1/5,1,1/3,1/3;

1,1,1/3,3,1,1;

2,2,2,3,3,1];

B1=[1,1/4,1/2;

4,1,3;

2,1/3,1];

B2=[1,1/4,1/5;

4,1,1/2;

5,2,1];

B3=[1,3,1/3;

1/3,1,1/7;

3,7,1];

B4=[1,1/3,5;

3,1,7;

1/5,1/7,1];

B5=[1,1,7;

1,1,7;

1/7,1/7,1];

B6=[1,7,9;

1/7,1,1;

1/9,1,1];

BS=[B1,B2,B3,B4,B5,B6];

m=length(B1);

n=length(A);

%随机一致性指标RI

RI=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45,1.49,1.51];

[Wa,LA]=eig(A)%求A的特征向量WA和特征根LA

Maxn=input('

pleaseinputlargesteigenvalue:

%输入最大特征根

CIn=(Maxn-n)/(n-1);

CRn=CIn/RI(n);

%A的一致性比率CRn

WA=Wa(:

1)/sum(Wa(:

1));

%特征向量归一化

ifCRn<

0.10

fprintf('

A的CR%f通过一致性检验!

\n'

CRn);

%控制文本格式

else

A的CR%f未通过一致性检验!

end

fork=1:

n%求B的特征向量WK和特征根LK

[WB,LK]=eig(BS(1:

3,(k-1)*m+1:

(k-1)*m+3))

Max(k)=input('

CIm(k)=(Max(k)-m)/(m-1);

RIm(k)=RI(m);

CRm(k)=CIm(k)/RIm(k);

%B的一致性比率CRm

WK(:

k)=WB(:

1)/sum(WB(:

n

ifCRm(k)<

B%d的CR%f通过一致性检验!

k,CRm(1,k));

B%d的CR%f未通过一致性检验!

disp('

准则层对目标层权向量'

disp(WA);

方案层对准则层权向量'

disp(WK);

E=WK*WA

方案层组合权向量'

disp(E);

CI=CIm*WA;

RI=RIm*WA;

CR=CI/RI;

%组合一致性比率CR

ifCR<

组合一致性比率CR%f通过一致性检验!

组合一致性比率CR%f未通过一致性检验!

[MAX,CHOICE]=max(E);

%最佳选择

CHOICE

MATLAB运行结果如下:

Wa=

-0.3396-0.1255-0.0563i-0.1255+0.0563i0.7354-0.1896+0.3838i-0.1896-0.3838i

-0.4038-0.1884-0.5736i-0.1884+0.5736i-0.6464-0.4476-0.2693i-0.4476+0.2693i

-0.42490.67240.67240.08340.3884-0.0605i0.3884+0.0605i

-0.1063-0.0138+0.0429i-0.0138-0.0429i-0.0405-0.0592-0.0922i-0.0592+0.0922i

-0.3298-0.1384+0.3417i-0.1384-0.3417i-0.12170.0035+0.1640i0.0035-0.1640i

-0.6488-0.1467-0.0710i-0.1467+0.0710i0.13370.59200.5920

LA=

6.617800000

0-0.1557+1.2808i0000

00-0.1557-1.2808i000

000-0.060300

0000-0.1230+0.5461i0

00000-0.1230-0.5461i

6.6178

A的CR0.099645通过一致性检验!

WB=

0.19990.1000+0.1731i0.1000-0.1731i

0.9154-0.9154-0.9154

0.34930.1747-0.3025i0.1747+0.3025i

LK=

3.018300

0-0.0091+0.2348i0

00-0.0091-0.2348i

0.1999

0.14600.0730+0.1265i0.0730-0.1265i

0.49940.2497-0.4325i0.2497+0.4325i

0.8540-0.8540-0.8540

3.024600

0-0.0

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

当前位置:首页 > 农林牧渔 > 林学

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

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