ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:19.34KB ,
资源ID:7319405      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7319405.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(matlab层次分析法一致性.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

matlab层次分析法一致性.docx

1、matlab层次分析法一致性用了两周左右的时间,我编写了网络分析法(The Analytic Network Process,ANP)的Matlab源代码(将在下面给出),主要针对王莲芬老师的网络分析法(ANP)的理论与算法中的内部依存的递阶层次结构,而且假设 N = 4 的情形,所以如果要使用该程序,需要作修改,如果你不想改,我可以帮忙! ANP是美国匹兹堡大学的T.L.Saaty 教授于1996年提出了一种适应非独立的递阶层次结构的决策方法,它是在网络分析法(AHP)基础上发展而形成的一种新的实用决策方法。其关键步骤有以下几个:1 确定因素,并建立网络层和控制层模型。2 创建比较矩阵。3

2、按照指标类型针对每列进行规范化。4 求出每个比较矩阵的最大特征值和对应的特征向量。5 一致性检验。如果不满足,则调整相应的比较矩阵中的元素。6 将各个特征向量单位化(归一化),组成判断矩阵。7 将控制层的判断矩阵和网络层的判断矩阵相乘,得到加权超矩阵。8 将加权超矩阵单位化(归一化),求其K次幂收敛时的矩阵。其中第j列就是网络层中各元素对于元素j的极限排序向量。 % 第一个函数% 矩阵归一化(单位化)% Unitize 函数开始function Matrix_Unitize = Unitize(Matrix)line,colume = size(Matrix);for j = 1:1:colu

3、me fa = 0; for i = 1:1:line fa = fa + Matrix(i,j); end sum(j) = fa;endfor j = 1:1:colume for i = 1:1:line Matrix_Unitize(i,j) = Matrix(i,j) / sum(j); endend% Unitize 函数结束 % 第二个函数% 求一个方阵的最大特征值及其对应的特征向量% MAX_EigenV 函数开始function Max_Eigenvector,Max_Eigenvalue = Max_EigenV(Matrix)line,colume = size(Matr

4、ix);if line = colume message = 矩阵不是方阵,无法求解最大特征值及其对应的特征向量; disp(message); return;endEigenvector Eigenvalue = eigs(Matrix);Max_Eigenvalue = Eigenvalue(1);for i=1:1:line Max_Eigenvector(i) = Eigenvector(i,1);end% MAX_EigenV 函数结束% 第三个函数(此函数我没有用)% 根据给定的指标类型对矩阵的列进行规范化% Standardize 函数开始function Matrix_Stan

5、dardize = Standardize(Matrix, IndexType)% a 是需要规范化的矩阵% IndexType 是该矩阵各列的指标类型数组% IndexType(j) = 1 a 的第 j 列是效益型指标% IndexType(j) = 0 a 的第 j 列是成本型指标m n = size(Matrix);MAX = max(Matrix);MIN = min(Matrix);d = MAX - MIN;for j=1:1:n for i=1:1:m if IndexType(j) = 1 % 效益型指标规范化 Matrix_Standardize(i,j) = (Matri

6、x(i,j) - MIN(j) / d(j); elseif IndexType(j) = 0 % 成本型指标规范化 Matrix_Standardize(i,j) = (MAX(j) - Matrix(i,j) / d(j); end endend% Standardize 函数结束% 第四个函数% 读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵% 计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.% version 2.0% 矩阵文件的(*.txt)格式要求(共4条)% 1 空格开头的行,回车行,注释行(见第3条)在读取时都会被忽略.% % 2 每个矩阵要有维数(Dimen

7、sion)和序号(Sequence),其次序可以颠倒,但是不能缺项,% 且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.% % 3 竖线|是注释标记,要独自占一行,但是不要在有效的矩阵元素行之后加竖线.% % 4 矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.% 但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!% JudgementMatrix 函数开始function judge_matrix_unitize,flag = JudgementMatrix(fid)judge_matrix = 0;jud

8、ge_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 )

9、if strcmp(LineData, Sequence) LineData = IgnoreLine(fid); if LineData = -1 warning(已经到了文件末尾,无数据可读取!); flag = -1; return; end Sequence = str2num(LineData); Flag1 = Flag1 + 1; elseif strcmp(LineData, Dimension) LineData = IgnoreLine(fid); if LineData = -1 warning(已经到了文件末尾,无数据可读取!); flag = -1; return;

10、end DCount = DCount + 1; Dimension(DCount) = str2num(LineData); LastCount = DCount-1; if LastCount 0 & Dimension(DCount) = Dimension(LastCount) flag = -1; warning(矩阵的维数不等,比较矩阵弄错了吧!); end Flag2 = Flag2 + 1; end if ( Flag1 1 | Flag2 1 ) if Flag1 1 c = num2str(Sequence); c = strcat(第,c); message = strc

11、at(c, 个矩阵的上一个矩阵没有设置维数关键字Dimension!); flag = -1; warning(message); return; elseif Flag2 1 c = num2str(Sequence); c = strcat(第,c); message = strcat(c, 个矩阵的上一个矩阵没有设置序号关键字Sequence!); warning(message); flag = -1; return; end elseif ( Flag1 = 0 & Flag2 =0 ) warning(没有发现矩阵的序号或行数或列数关键字!请参考文件格式要求!); flag = -

12、1; return; elseif ( Flag1 = 1 & Flag2 = 1 ) Matrix = 0; % 为了读分数矩阵,逐行读取再变为数值类型 for i = 1:1:Dimension(DCount) LineData = IgnoreLine(fid); if LineData = -1 warning(已经到了文件末尾,无数据可读取!); flag = -1; judge_matrix_unitize = Unitize(Matrix); return; end DoubleLine = str2num(LineData); line_DoubleLine,colume_Do

13、ubleLine = size(DoubleLine); if colume_DoubleLine = Dimension(DCount) flag = -1; end for j = 1:1:colume_DoubleLine Matrix(i,j) = DoubleLine(j); end end if flag = -1 judge_matrix_unitize = Unitize(Matrix); return; end if isreal(Matrix) Count = Count + 1; if Sequence = Count c = num2str(Sequence); c =

14、 strcat(文件中编号为,c); message = strcat(c,的矩阵的序号没有按照顺序排列!); warning(message); end % 最大特征值及其对应的特征向量 vector_lmd_max,lmd_max(Count) = MaxEV(Matrix); for j = 1:1:Dimension(DCount) judge_matrix(Count,j) = vector_lmd_max(j); end % 一致性检验 CI(Count) = 0; % 一致性指标 % 当矩阵的阶数 n = 3 % 一致性指标 CI(Count) = ( lmd_max(Count

15、) - Dimension(DCount) ) / ( Dimension(DCount) - 1 ); if CI(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; warnin

16、g(message); return; end Matrix = 0; % 矩阵清零 Flag1 = 0; % 是否读取矩阵的开关复位 Flag2 = 0; % 是否读取矩阵的开关复位 end LineData = IgnoreLine(fid);endif flag = -1 | Dimension(DCount) = Count flag = -1; disp(未进行归一化的特征向量); judge_matrix = judge_matrix % 特征向量归一化 disp(归一化的特征向量); judge_matrix_unitize = Unitize(judge_matrix)else

17、 flag = 1; judge_matrix = judge_matrix; % 判断矩阵归一化 disp(归一化后的特征向量构成的判断矩阵); judge_matrix_unitize = Unitize(judge_matrix)end% JudgementMatrix 函数结束 % 第五个函数% 忽略一些特定的行% IgnoreLine 函数开始function a = IgnoreLine(fid)a = fgetl(fid);% 忽略|(竖线), (空格)开头的行,以及(回车)行while isempty(a) | strcmp(a(1), |) | strcmp(a(1), )

18、a = fgetl(fid);end% IgnoreLine 函数结束 % 第六个函数% 按如下图所示的方式连接各个矩阵,构造超矩阵% BB% DB DD% AD AA% CA CC% version 1.0% SuperMatrix 函数开始function super = 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

19、 = 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)

20、;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 开始function ANPclc;% 读取多个数据文件中的比较矩阵,形成归一化的判断矩阵disp(从文件 AA.txt 中构造判断矩阵);fid_AA, mes

21、sage = fopen(AA.txt,r);if fid_AA = -1 error(!文件打开失败!);endWaa,flag = JudgementMatrix(fid_AA);if flag = -1 warning(文件中的比较矩阵有问题,!构造失败!);else disp(!构造成功!);endfclose(fid_AA);disp(从文件 BB.txt 中构造判断矩阵);fid_BB, message = fopen(BB.txt,r);if fid_BB = -1 error(文件打开失败!);endWbb,flag = JudgementMatrix(fid_BB);if f

22、lag = -1 warning(文件中的比较矩阵有问题,!构造失败!);else disp(!构造成功!);endfclose(fid_BB);disp(从文件 CC.txt 中构造判断矩阵);fid_CC, message = fopen(CC.txt,r);if fid_CC = -1 error(文件打开失败!);endWcc,flag = JudgementMatrix(fid_CC);if flag = -1 warning(文件中的比较矩阵有问题,!构造失败!);else disp(!构造成功!);endfclose(fid_CC);disp(从文件 DD.txt 中构造判断矩阵

23、);fid_DD, message = fopen(DD.txt,r);if fid_DD = -1 error(文件打开失败!);endWdd,flag = JudgementMatrix(fid_DD);if flag = -1 warning(文件中的比较矩阵有问题,!构造失败!);else disp(!构造成功!);endfclose(fid_DD);% 由于 Wdb Wad 不是方阵,此处对 Wdb Wad 的一组原始数据进行单位化disp(从文件 DB.txt 中构造判断矩阵);fid_DB, message = fopen(DB.txt,r);if fid_DB = -1 err

24、or(文件打开失败!);endWdb,flag = JudgementMatrix(fid_DB);fclose(fid_DB);disp(从文件 AD.txt 中构造判断矩阵);fid_AD, message = fopen(AD.txt,r);if fid_AD = -1 error(文件打开失败!);endWad,flag = JudgementMatrix(fid_AD);fclose(fid_AD);disp(从文件 CA.txt 中构造判断矩阵);fid_CA, message = fopen(CA.txt,r);if fid_CA = -1 error(文件打开失败!);endW

25、ca,flag = JudgementMatrix(fid_CA);if flag = -1 warning(文件中的比较矩阵有问题,!构造失败!);else disp(!构造成功!);endfclose(fid_CA);% 加权矩阵Wzz = 0.6429 0 0 0 0.3571 0.5958 0 0 0 0.4042 0.5223 0 0 0 0.4777 1 ;% % 注意:矩阵 Wzz 也可通过读取文件 ZZ.txt 获得% % 可以用下面注释掉的代码代替上面的矩阵Wzz% disp(从文件 ZZ.txt 中构造判断矩阵);% fid_ZZ, message = fopen(ZZ.t

26、xt,r);% if fid_ZZ = -1% error(文件打开失败!);% end% Wzz,flag = JudgementMatrix(fid_ZZ);% if flag = -1% warning(!文件中的比较矩阵有问题,构造失败!);% else% disp(!构造成功!);% end% fclose(fid_ZZ);% 按照如下形式组合判断矩阵% W = % Wbb 0 0 0% Wdb Wdd 0 0% 0 Wad Waa 0% 0 0 Wca Wcc% ;% 加权超矩阵的各个元素Wbb = Wzz(1,1) * Wbb;Wdd = Wzz(2,2) * Wdd;Waa =

27、 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);if flag = 1 D4 = Wcc_infpower; lineA columeA = size(Waa

28、); IA = eye(lineA,columeA); D3 = D4 * Wca / ( IA - Waa ); lineD columeD = size(Wdd); ID = eye(lineD,columeD); D2 = D3 * Wad / ( ID - Wdd ); lineB columeB = size(Wbb); IB = eye(lineB,columeB); D1 = D2 * Wdb / ( IB - Wbb ); J = zeros(37, 37); disp(加权超矩阵的无穷次幂的解); weighted_supermatrix_infpower = J(1:25,1:37); D1 D2 D3 D4 elseif flag = 0 message = 加权超矩阵不收敛,奇数次幂不存在!; disp(message); return;enddisp(将加权超矩阵的无穷次幂的解写入 WW.txt 文件中);fid_WW = fopen(WW.txt,w+);if fid_WW = -1 error(文件打开失败!);endfor i = 1:1:37 for j = 1:1:37 fprintf(fid_WW,%.4f ,weighted_supermatrix_

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

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