⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anp.m

📁 网络分析法(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 + -