📄 anp.m
字号:
% 网络层次法(ANP)中的矩阵求解的主函数
% 矩阵文件的(*.txt)格式要求(共4条)
% 1 空格开头的行,回车行,注释行(见第3条)在读取时都是被忽略的.
%
% 2 每个矩阵要有维数(Dimension)和序号(Sequence),其次序可以颠倒,但是不能缺项,
% 且关键字及其取值要各占一行(共4行,中间可以有空格行或空行),但关键字行尾不能有空格.
%
% 3 竖线"|"是注释,要独自占一行,但是不要在有用的矩阵元素行之后加竖线.
%
% 4 矩阵的元素只能用空格分开,每个元素后都可以跟空格,且空格的数量可以是任意多个.
% 但是,需要强调的是,每一行第一个元素的前面不能有空格(参照第1条)!
% 主函数 ANP 开始
function ANP
clc;
% 读取多个数据文件中的比较矩阵,形成归一化的判断矩阵
disp('————从文件 AA.txt 中构造判断矩阵————');
[fid_AA, message] = fopen('AA.txt','r');
if fid_AA == -1
error('!文件打开失败!');
end
[Waa,flag] = JudgementMatrix(fid_AA);
if flag == -1
warning('文件中的比较矩阵有问题,!!!构造失败!!!');
else
disp('!!!构造成功!!!');
end
fclose(fid_AA);
disp('————从文件 BB.txt 中构造判断矩阵————');
[fid_BB, message] = fopen('BB.txt','r');
if fid_BB == -1
error('文件打开失败!');
end
[Wbb,flag] = JudgementMatrix(fid_BB);
if flag == -1
warning('文件中的比较矩阵有问题,!!!构造失败!!!');
else
disp('!!!构造成功!!!');
end
fclose(fid_BB);
disp('————从文件 CC.txt 中构造判断矩阵————');
[fid_CC, message] = fopen('CC.txt','r');
if fid_CC == -1
error('文件打开失败!');
end
[Wcc,flag] = JudgementMatrix(fid_CC);
if flag == -1
warning('文件中的比较矩阵有问题,!!!构造失败!!!');
else
disp('!!!构造成功!!!');
end
fclose(fid_CC);
disp('————从文件 DD.txt 中构造判断矩阵————');
[fid_DD, message] = fopen('DD.txt','r');
if fid_DD == -1
error('文件打开失败!');
end
[Wdd,flag] = JudgementMatrix(fid_DD);
if flag == -1
warning('文件中的比较矩阵有问题,!!!构造失败!!!');
else
disp('!!!构造成功!!!');
end
fclose(fid_DD);
% 由于 Wdb Wad 不是方阵,此处对 Wdb Wad 的一组原始数据进行单位化
disp('————从文件 DB.txt 中构造判断矩阵————');
[fid_DB, message] = fopen('DB.txt','r');
if fid_DB == -1
error('文件打开失败!');
end
[Wdb,flag] = JudgementMatrix(fid_DB);
fclose(fid_DB);
disp('————从文件 AD.txt 中构造判断矩阵————');
[fid_AD, message] = fopen('AD.txt','r');
if fid_AD == -1
error('文件打开失败!');
end
[Wad,flag] = JudgementMatrix(fid_AD);
fclose(fid_AD);
disp('————从文件 CA.txt 中构造判断矩阵————');
[fid_CA, message] = fopen('CA.txt','r');
if fid_CA == -1
error('文件打开失败!');
end
[Wca,flag] = JudgementMatrix(fid_CA);
if flag == -1
warning('文件中的比较矩阵有问题,!!!构造失败!!!');
else
disp('!!!构造成功!!!');
end
fclose(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.txt','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 = 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);
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;
end
disp('————将加权超矩阵的无穷次幂的解写入 WW.txt 文件中————');
fid_WW = fopen('WW.txt','w+');
if fid_WW == -1
error('文件打开失败!');
end
for i = 1:1:37
for j = 1:1:37
fprintf(fid_WW,'%.4f ',weighted_supermatrix_infpower(i,j));
end
fprintf(fid_WW,'\r\n');
end
fclose(fid_WW);
disp('————!!!写入成功!!!————');
% 主函数ANP结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -