matlab-层次分析法一致性

时间: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);

…… 此处隐藏:7409字,全部文档内容请下载后查看。喜欢就下载吧 ……

matlab-层次分析法一致性.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219