matlab-层次分析法一致性
时间:2026-01-19
时间:2026-01-19
用了两周左右的时间,我编写了网络分析法(The Analytic Network Process,ANP)的Matlab源代码(将在下面给出),主要针对王莲芬老师的《网络分析法(ANP)的理论与算法》中的内部依存的递阶层次结构,而且假设 N = 4 的情形,所以如果要使用该程序,需要作修改,如果你不想改,我可以帮忙!
ANP是美国匹兹堡大学的T.L.Saaty 教授于1996年提出了一种适应非独立的递阶层次结构的决策方法,它是在网络分析法(AHP)基础上发展而形成的一种新的实用决策方法。其关键步骤有以下几个:
1 确定因素,并建立网络层和控制层模型。
2 创建比较矩阵。
3 按照指标类型针对每列进行规范化。
4 求出每个比较矩阵的最大特征值和对应的特征向量。
5 一致性检验。如果不满足,则调整相应的比较矩阵中的元素。
6 将各个特征向量单位化(归一化),组成判断矩阵。
7 将控制层的判断矩阵和网络层的判断矩阵相乘,得到加权超矩阵。
8 将加权超矩阵单位化(归一化),求其K次幂收敛时的矩阵。其中第j列就是网络层中各元素对于元素j的极限排序向量。
% 第一个函数
% 矩阵归一化(单位化)
% Unitize 函数开始
function Matrix_Unitize = Unitize(Matrix)
[line,colume] = size(Matrix);
for j = 1:1:colume
fa = 0;
for i = 1:1:line
fa = fa + Matrix(i,j);
end
sum(j) = fa;
end
for j = 1:1:colume
for i = 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);
if line ~= colume
message = '矩阵不是方阵,无法求解最大特征值及其对应的特征向量';
disp(message);
return;
end
[Eigenvector Eigenvalue] = eigs(Matrix);
Max_Eigenvalue = Eigenvalue(1);
for i=1:1:line
Max_Eigenvector(i) = Eigenvector(i,1);
end
% MAX_EigenV 函数结束
% 第三个函数(此函数我没有用)
% 根据给定的指标类型对矩阵的列进行规范化
% Standardize 函数开始
function Matrix_Standardize = 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) = (Matrix(i,j) - MIN(j)) / d(j);
elseif IndexType(j) == 0 % 成本型指标规范化
Matrix_Standardize(i,j) = (MAX(j) - Matrix(i,j)) / d(j);
end
end
end
% Standardize 函数结束
% 第四个函数
% 读取一个格式化文件中所有矩阵,连接成归一化的判断矩阵
% 计算最大特征值对应的特征向量,进行一致性检验,构造判断矩阵.
% version 2.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 )
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;
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);
下一篇:计算机网络基础6章-路由概念