matlab层次分析法一致性.docx

上传人:b****5 文档编号:7319405 上传时间:2023-01-22 格式:DOCX 页数:15 大小:19.34KB
下载 相关 举报
matlab层次分析法一致性.docx_第1页
第1页 / 共15页
matlab层次分析法一致性.docx_第2页
第2页 / 共15页
matlab层次分析法一致性.docx_第3页
第3页 / 共15页
matlab层次分析法一致性.docx_第4页
第4页 / 共15页
matlab层次分析法一致性.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

matlab层次分析法一致性.docx

《matlab层次分析法一致性.docx》由会员分享,可在线阅读,更多相关《matlab层次分析法一致性.docx(15页珍藏版)》请在冰豆网上搜索。

matlab层次分析法一致性.docx

matlab层次分析法一致性

用了两周左右的时间,我编写了网络分析法(TheAnalyticNetworkProcess,ANP)的Matlab源代码(将在下面给出),主要针对王莲芬老师的《网络分析法(ANP)的理论与算法》中的内部依存的递阶层次结构,而且假设N=4的情形,所以如果要使用该程序,需要作修改,如果你不想改,我可以帮忙!

ANP是美国匹兹堡大学的T.L.Saaty教授于1996年提出了一种适应非独立的递阶层次结构的决策方法,它是在网络分析法(AHP)基础上发展而形成的一种新的实用决策方法。

其关键步骤有以下几个:

1确定因素,并建立网络层和控制层模型。

2创建比较矩阵。

3按照指标类型针对每列进行规范化。

4求出每个比较矩阵的最大特征值和对应的特征向量。

5一致性检验。

如果不满足,则调整相应的比较矩阵中的元素。

6将各个特征向量单位化(归一化),组成判断矩阵。

7将控制层的判断矩阵和网络层的判断矩阵相乘,得到加权超矩阵。

8将加权超矩阵单位化(归一化),求其K次幂收敛时的矩阵。

其中第j列就是网络层中各元素对于元素j的极限排序向量。

%第一个函数

%矩阵归一化(单位化)

%Unitize函数开始

functionMatrix_Unitize=Unitize(Matrix)

[line,colume]=size(Matrix);

forj=1:

1:

colume

fa=0;

fori=1:

1:

line

fa=fa+Matrix(i,j);

end

sum(j)=fa;

end

forj=1:

1:

colume

fori=1:

1:

line

Matrix_Unitize(i,j)=Matrix(i,j)/sum(j);

end

end

%Unitize函数结束

%第二个函数

%求一个方阵的最大特征值及其对应的特征向量

%MAX_EigenV函数开始

function[Max_Eigenvector,Max_Eigenvalue]=Max_EigenV(Matrix)

[line,colume]=size(Matrix);

ifline~=colume

message='矩阵不是方阵,无法求解最大特征值及其对应的特征向量';

disp(message);

return;

end

[EigenvectorEigenvalue]=eigs(Matrix);

Max_Eigenvalue=Eigenvalue

(1);

fori=1:

1:

line

Max_Eigenvector(i)=Eigenvector(i,1);

end

%MAX_EigenV函数结束

%第三个函数(此函数我没有用)

%根据给定的指标类型对矩阵的列进行规范化

%Standardize函数开始

functionMatrix_Standardize=Standardize(Matrix,IndexType)

%a是需要规范化的矩阵

%IndexType是该矩阵各列的指标类型数组

%IndexType(j)=1a的第j列是效益型指标

%IndexType(j)=0a的第j列是成本型指标

[mn]=size(Matrix);

MAX=max(Matrix);

MIN=min(Matrix);

d=MAX-MIN;

forj=1:

1:

n

fori=1:

1:

m

ifIndexType(j)==1%效益型指标规范化

Matrix_Standardize(i,j)=(Matrix(i,j)-MIN(j))/d(j);

elseifIndexType(j)==0%成本型指标规范化

Matrix_Standardize(i,j)=(MAX(j)-Matrix(i,j))/d(j);

end

end

end

%Standardize函数结束

%第四个函数

%读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵

%计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.

%version2.0

%矩阵文件的(*.txt)格式要求(共4条)

%1空格开头的行,回车行,注释行(见第3条)在读取时都会被忽略.

%

%2每个矩阵要有维数(Dimension)和序号(Sequence),其次序可以颠倒,但是不能缺项,

%且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.

%

%3竖线"|"是注释标记,要独自占一行,但是不要在有效的矩阵元素行之后加竖线.

%

%4矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.

%但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!

%JudgementMatrix函数开始

function[judge_matrix_unitize,flag]=JudgementMatrix(fid)

judge_matrix=0;

judge_matrix_unitize=0;

flag=0;%判断矩阵构造成功的标志

LineData=IgnoreLine(fid);%跳到第一行有效的数据

Count=0;%矩阵计数器

Flag1=0;%是否读取矩阵序号的开关

Flag2=0;%是否读取矩阵列数的开关

Flag3=0;%是否读取矩阵行数的开关

Sequence=0;%矩阵的序号

Dimension=0;%矩阵的阶

DCount=0;%同一文件中每个矩阵的阶数下标

LastCount=0;%同一文件中上一个矩阵的阶数下标

while(feof(fid)==0)

ifstrcmp(LineData,'Sequence')

LineData=IgnoreLine(fid);

ifLineData==-1

warning('已经到了文件末尾,无数据可读取!

');

flag=-1;

return;

end

Sequence=str2num(LineData);

Flag1=Flag1+1;

elseifstrcmp(LineData,'Dimension')

LineData=IgnoreLine(fid);

ifLineData==-1

warning('已经到了文件末尾,无数据可读取!

');

flag=-1;

return;

end

DCount=DCount+1;

Dimension(DCount)=str2num(LineData);

LastCount=DCount-1;

ifLastCount>0&&Dimension(DCount)~=Dimension(LastCount)

flag=-1;

warning('矩阵的维数不等,比较矩阵弄错了吧!

');

end

Flag2=Flag2+1;

end

if(Flag1>1||Flag2>1)

ifFlag1>1

c=num2str(Sequence);

c=strcat('第',c);

message=strcat(c,'个矩阵的上一个矩阵没有设置维数关键字"Dimension"!

');

flag=-1;

warning(message);

return;

elseifFlag2>1

c=num2str(Sequence);

c=strcat('第',c);

message=strcat(c,'个矩阵的上一个矩阵没有设置序号关键字"Sequence"!

');

warning(message);

flag=-1;

return;

end

elseif(Flag1==0&&Flag2==0)

warning('没有发现矩阵的序号或行数或列数关键字!

请参考文件格式要求!

');

flag=-1;

return;

elseif(Flag1==1&&Flag2==1)

Matrix=0;

%为了读分数矩阵,逐行读取再变为数值类型

fori=1:

1:

Dimension(DCount)

LineData=IgnoreLine(fid);

ifLineData==-1

warning('已经到了文件末尾,无数据可读取!

');

flag=-1;

judge_matrix_unitize=Unitize(Matrix);

return;

end

DoubleLine=str2num(LineData);

[line_DoubleLine,colume_DoubleLine]=size(DoubleLine);

ifcolume_DoubleLine~=Dimension(DCount)

flag=-1;

end

forj=1:

1:

colume_DoubleLine

Matrix(i,j)=DoubleLine(j);

end

end

ifflag==-1

judge_matrix_unitize=Unitize(Matrix);

return;

end

ifisreal(Matrix)

Count=Count+1;

ifSequence~=Count

c=num2str(Sequence);

c=strcat('文件中编号为',c);

message=strcat(c,'的矩阵的序号没有按照顺序排列!

');

warning(message);

end

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

[vector_lmd_max,lmd_max(Count)]=MaxEV(Matrix);

forj=1:

1:

Dimension(DCount)

judge_matrix(Count,j)=vector_lmd_max(j);

end

%一致性检验

CI(Count)=0;%一致性指标

%当矩阵的阶数n<3时,判断矩阵永远具有完全一致性。

ifDimension>=3

%一致性指标

CI(Count)=(lmd_max(Count)-Dimension(DCount))/(Dimension(DCount)-1);

ifCI(Count)>=0.1

c=num2str(Sequence);

c=strcat('第',c);

message=strcat(c,'个矩阵的一致性指标CI不满足条件,建议调整该矩阵元素!

');

warning(message);

flag=-1;

break;

end

end

else

c=num2str(Sequence);

c=strcat('第',c);

message=strcat(c,'个矩阵不是实矩阵吧?

');

flag=-1;

warning(message);

return;

end

Matrix=0;%矩阵清零

Flag1=0;%是否读取矩阵的开关复位

Flag2=0;%是否读取矩阵的开关复位

end

LineData=IgnoreLine(fid);

end

ifflag==-1||Dimension(DCount)~=Count

flag=-1;

disp('未进行归一化的特征向量');

judge_matrix=judge_matrix'

%特征向量归一化

disp('归一化的特征向量');

judge_matrix_unitize=Unitize(judge_matrix)

else

flag=1;

judge_matrix=judge_matrix';

%判断矩阵归一化

disp('归一化后的特征向量构成的判断矩阵');

judge_matrix_unitize=Unitize(judge_matrix)

end

%JudgementMatrix函数结束

%第五个函数

%忽略一些特定的行

%IgnoreLine函数开始

functiona=IgnoreLine(fid)

a=fgetl(fid);

%忽略'|'(竖线),''(空格)开头的行,以及''(回车)行

whileisempty(a)||strcmp(a

(1),'|')||strcmp(a

(1),'')

a=fgetl(fid);

end

%IgnoreLine函数结束

%第六个函数

%按如下图所示的方式连接各个矩阵,构造超矩阵

%BB

%DBDD

%ADAA

%CACC

%version1.0

%SuperMatrix函数开始

functionsuper=SuperMatrix(BB,DD,AA,CC,DB,AD,CA)

[lineBB,columeBB]=size(BB);

[lineDD,columeDD]=size(DD);

[lineAA,columeAA]=size(AA);

[lineCC,columeCC]=size(CC);

[lineDB,columeDB]=size(DB);

[lineAD,columeAD]=size(AD);

[lineCA,columeCA]=size(CA);

a=vertcat(BB,DB);

b=zeros(lineBB,columeDD);%补零

c=vertcat(b,DD);

d=horzcat(a,c);%方阵

e=zeros(lineAD,columeBB);%补零

f=horzcat(e,AD);

g=vertcat(d,f);

[lined,columed]=size(d);

h=zeros(lined,columeAA);%补零

i=vertcat(h,AA);

j=horzcat(g,i);%方阵

k=zeros(lineCA,columed);%补零

l=horzcat(k,CA);

m=vertcat(j,l);

[linej,columej]=size(j);

n=zeros(linej,columeCC);%补零

p=vertcat(n,CC);

super=horzcat(m,p);%超矩阵

%SuperMatrix函数结束

%主函数ANP开始

functionANP

clc;

%读取多个数据文件中的比较矩阵,形成归一化的判断矩阵

disp('————从文件AA.txt中构造判断矩阵————');

[fid_AA,message]=fopen('AA.txt','r');

iffid_AA==-1

error('!

文件打开失败!

');

end

[Waa,flag]=JudgementMatrix(fid_AA);

ifflag==-1

warning('文件中的比较矩阵有问题,!

构造失败!

');

else

disp('!

构造成功!

');

end

fclose(fid_AA);

disp('————从文件BB.txt中构造判断矩阵————');

[fid_BB,message]=fopen('BB.txt','r');

iffid_BB==-1

error('文件打开失败!

');

end

[Wbb,flag]=JudgementMatrix(fid_BB);

ifflag==-1

warning('文件中的比较矩阵有问题,!

构造失败!

');

else

disp('!

构造成功!

');

end

fclose(fid_BB);

disp('————从文件CC.txt中构造判断矩阵————');

[fid_CC,message]=fopen('CC.txt','r');

iffid_CC==-1

error('文件打开失败!

');

end

[Wcc,flag]=JudgementMatrix(fid_CC);

ifflag==-1

warning('文件中的比较矩阵有问题,!

构造失败!

');

else

disp('!

构造成功!

');

end

fclose(fid_CC);

disp('————从文件DD.txt中构造判断矩阵————');

[fid_DD,message]=fopen('DD.txt','r');

iffid_DD==-1

error('文件打开失败!

');

end

[Wdd,flag]=JudgementMatrix(fid_DD);

ifflag==-1

warning('文件中的比较矩阵有问题,!

构造失败!

');

else

disp('!

构造成功!

');

end

fclose(fid_DD);

%由于WdbWad不是方阵,此处对WdbWad的一组原始数据进行单位化

disp('————从文件DB.txt中构造判断矩阵————');

[fid_DB,message]=fopen('DB.txt','r');

iffid_DB==-1

error('文件打开失败!

');

end

[Wdb,flag]=JudgementMatrix(fid_DB);

fclose(fid_DB);

disp('————从文件AD.txt中构造判断矩阵————');

[fid_AD,message]=fopen('AD.txt','r');

iffid_AD==-1

error('文件打开失败!

');

end

[Wad,flag]=JudgementMatrix(fid_AD);

fclose(fid_AD);

disp('————从文件CA.txt中构造判断矩阵————');

[fid_CA,message]=fopen('CA.txt','r');

iffid_CA==-1

error('文件打开失败!

');

end

[Wca,flag]=JudgementMatrix(fid_CA);

ifflag==-1

warning('文件中的比较矩阵有问题,!

构造失败!

');

else

disp('!

构造成功!

');

end

fclose(fid_CA);

%加权矩阵

Wzz=[0.6429000

0.35710.595800

00.40420.52230

000.47771

];

%%注意:

矩阵Wzz也可通过读取文件ZZ.txt获得

%%可以用下面注释掉的代码代替上面的矩阵Wzz

%disp('————从文件ZZ.txt中构造判断矩阵————');

%[fid_ZZ,message]=fopen('ZZ.txt','r');

%iffid_ZZ==-1

%error('文件打开失败!

');

%end

%[Wzz,flag]=JudgementMatrix(fid_ZZ);

%ifflag==-1

%warning('!

文件中的比较矩阵有问题,构造失败!

');

%else

%disp('!

构造成功!

');

%end

%fclose(fid_ZZ);

%按照如下形式组合判断矩阵

%W=[

%Wbb000

%WdbWdd00

%0WadWaa0

%00WcaWcc

%];

%加权超矩阵的各个元素

Wbb=Wzz(1,1)*Wbb;

Wdd=Wzz(2,2)*Wdd;

Waa=Wzz(3,3)*Waa;

Wcc=Wzz(4,4)*Wcc;

Wdb=Wzz(2,1)*Wdb;

Wad=Wzz(3,2)*Wad;

Wca=Wzz(4,3)*Wca;

%disp('————加权超矩阵!

————');

%组成超矩阵

weighted_supermatrix=SuperMatrix(Wbb,Wdd,Waa,Wcc,Wdb,Wad,Wca);

%计算加权超矩阵收敛时的无穷次幂

[Wcc_infpower,flag]=PowerConvergence(Wcc);

ifflag==1

D4=Wcc_infpower;

[lineAcolumeA]=size(Waa);

IA=eye(lineA,columeA);

D3=D4*Wca/(IA-Waa);

[lineDcolumeD]=size(Wdd);

ID=eye(lineD,columeD);

D2=D3*Wad/(ID-Wdd);

[lineBcolumeB]=size(Wbb);

IB=eye(lineB,columeB);

D1=D2*Wdb/(IB-Wbb);

J=zeros(37,37);

disp('————加权超矩阵的无穷次幂的解————');

weighted_supermatrix_infpower=[J(1:

25,1:

37);D1D2D3D4]

elseifflag==0

message='加权超矩阵不收敛,奇数次幂不存在!

';

disp(message);

return;

end

disp('————将加权超矩阵的无穷次幂的解写入WW.txt文件中————');

fid_WW=fopen('WW.txt','w+');

iffid_WW==-1

error('文件打开失败!

');

end

fori=1:

1:

37

forj=1:

1:

37

fprintf(fid_WW,'%.4f',weighted_supermatrix_

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

当前位置:首页 > 解决方案 > 营销活动策划

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

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