一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】层次分析法 层次分析法主要用于解决评价类问题 例如 选择哪种方案更好 哪位员工 运动员等表现得更优秀 评价类问题 分析问题得出评判问题的子标 分别给不同子标赋予权重 权重和要为 1 ahp 判断矩阵

大家好,欢迎来到IT知识分享网。

目录

层次分析法(AHP):

解决评价列问题三个方面:

评价类问题权重表格:

一致矩阵

一致性检验(用到高代知识)

一致矩阵计算权重

若判断矩阵为一致矩阵:

矩阵为非一致矩阵

 方法1算术平均法求权重:

 方法二几何平均法求权重:

方法3特征值法求权重

 得出结果         

层次分析法做题步骤: 

层次分析法局限性

代码讲解

代码可以优化的地方

模型拓展​


层次分析法(AHP):

层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀【确定评价指标、形成评价体系】)

解决评价列问题三个方面:

  1. 我们评价的目标是什么?(分析题目)
  2. 我们为了达到这个目标有哪几种可选择方案?(分析题目)
  3. 评价的准则或指标是什么?(题目中的背景材料、常识、参考文献以及搜索)

评价类问题权重表格

  1. 分析问题得出评判问题的子标
  2. 分别给不同子标赋予权重(权重和要为1
  3. 给不同方案对应不同子标给予打分(不同方案对于每个子标打分和要为1) 

例如选择某个学校:

指标权重 华科 武大
学习氛围 0.4 0.7 0.3
就业前景 0.3 0.5 0.5
男女比例 0.2 0.3 0.7
校园景色 0.1 0.25 0.75

华科最终得分:0.515

0.7 * 0.4 * + 0.5 * 0.3 + 0.3 * 0.2 + 0.25 * 0.1

武大最终得分:0.485

0.3 * 0.4 + 0.5 * 0.3 + 0.7 * 0.2 + 0.75 * 0.1

 那如何得出指标权重?(层次分析法思想登场)

有多个指标的时候,我们一次性考虑五个指标之间的关系,往往考虑不周,为了更加准确的得出五个指标的权重,我们采用两两比较的方法,最终根据两两比较的结果推算出权重。这时就用到了下方的重要程度表(重要程度也可以理解为满意度)

重要程度表
标度 含义
1 表示两个个因素相比,具有同样重要性
3 表示两个因素相比,一个因素比另一个因素稍微重要
5 表示两个因素相比,一个因素比另一个因素明显重要
7 表示两个因素相比,一个因素比另一个因素强烈重要
9 表示两个因素相比,一个因素比另一个因素极端重要
2,4,6,8 上述两相邻判断的中值
倒数 A和B相比如果标度为3,那么B和A相比就是1/3

 例如选择某个旅游景点:

共五个指标【两两相比组合数C(5,2)】,后面会介绍具体如何填写这张表

指标
景色  花费 居住 饮食 交通
景色  1 1/2 4 3 3
花费 2 1 7 5 5
居住 1/4 1/7 1 1/2 1/3
饮食 1/3 1/5 2 1 1
交通 1/3 1/5 3 1 1
标度 含义
1 同样重要性
3 稍微重要
5 明显重要
7 强烈重要
9 极端重要
2,4,6,8 上述两相邻判断的中值
倒数 A和B相比如果标度为3,那么B和A相比就是1/3

上述左表中的数据部分是一个5 * 5的方阵,我们计为A,对应元素为a_{ij}

方阵特点:

(1)a_{ij}表示的意义是,与指标j相比,i的重要程度。

(2)当i = j时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1.

(3)a_{ij} > 0 且满足a_{ij} * a_{ji} = 1(我们称满足这一条件的矩阵为正互反矩阵)

 实际上这个矩阵就是层次分析法中的判断矩阵

 同样的我们可以得到如下表格

 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】一、数学建模层次分析法(AHP)【清风数学建模个人笔记】一、数学建模层次分析法(AHP)【清风数学建模个人笔记】一、数学建模层次分析法(AHP)【清风数学建模个人笔记】一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

一个可能出现问题的地方:

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

此时引入一个概念——一致矩阵(绝对一致是不太好实现的,我们要把一致性控制在一个程度内)

一致矩阵

若矩阵中每个元素 a_{ij} > 0 且满足a_{ij} * a_{ji} = 1 ,则我们称该矩阵为正互反矩阵。 在层次分析法中,我们构造的判断矩阵均是正互反矩阵。 若正互反矩阵满足一、数学建模层次分析法(AHP)【清风数学建模个人笔记】,则我们称其为一致矩阵。推导如下:

 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】    一、数学建模层次分析法(AHP)【清风数学建模个人笔记】   一、数学建模层次分析法(AHP)【清风数学建模个人笔记】 

特点:各行(各列)成倍数关系【判断一致矩阵方法】,只要各行(各列)成倍数关系就是一致矩阵

例如下图:图中一致矩阵a_{11} = 2a_{12} , a_{21} = 2a_{22}以此类推都满足倍数关系

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

在使用判断矩阵求权重之前,必须对其进行一致性检验,若不一致程度太大,判断矩阵失效

下面给出两个矩阵,左表为不一致矩阵,右表为一致矩阵

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

可见这两者的区别有a13从5变成了4,呢么如何判断5和4的差距大不大呢?这是就需要用到一致性检验。

一致性检验(用到高代知识)

原理:检验我们构造的判断矩阵和一致矩阵是否有太大的差别

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】为一致性矩阵的充要条件:一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

引理1:

A为n阶方阵,且r(A) = 1,则A有一个特征值为tr(A),其余特征值均为0

因为一致矩阵有一个特征值为n,所以一致矩阵的秩一定为1

由引理可知:一致矩阵有一个特征值为n,其余特征值均为0.

另外,易知,特征值为n时,对应的特征向量为一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

 引理2:

n阶正互反矩阵A为一致矩阵时当且仅当最大特征值一、数学建模层次分析法(AHP)【清风数学建模个人笔记】,且当正互反矩阵A非一致时,一定满足一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

如下图,我们设要检验的变量为a,由右表知当判断矩阵越不一致的时,最大特征值与n相差就越大(检验矩阵与一致矩阵相差大不大其实就是检验最大特征值与n相差大不大)

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

一致性检验步骤:

  1. 计算一致性指标CI一、数学建模层次分析法(AHP)【清风数学建模个人笔记】
  2. 查找对应的平均随机一致性指标RI
    注:在实际应用中,n很少超过10,若指标个数超过10,则可以考虑建立二级指标体系
    n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    RI 0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59
  3. 计算一致性比例CR一、数学建模层次分析法(AHP)【清风数学建模个人笔记】,如果CR<0.1,则可以认为矩阵的一致性可以接受;否则需要对判断矩阵进行修正(手动往倍数方面改)

至于一致性指标RI是怎么计算来的,为什么这样构造CI以及为什么一0.1为划分依据并不需要了解透彻,实际做题中不需要知道为什么。

一致矩阵计算权重

若判断矩阵为一致矩阵:

例如:

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

 有由此图可知,苏杭在景色方面重要程度为1,北戴河在景色方面重要程度为1/2,桂林在景色方面重要程度为1/4.

注意,权重处理一定要进行归一化理:

苏杭 = 1/(1+0.5+0.25)

北戴河= 0.5/(1+0.5+0.25)

桂林= 0.25/(1+0.5+0.25)

 因为是一致性矩阵,所以用第一列和用其他列计算结果是一样的

矩阵为非一致矩阵

 方法1算术平均法求权重:

  1. 将判断矩阵按照列归一化(每一个元素除以其所在列的和后得到的新的判断矩阵)
  2. 将归一化后的矩阵按行求和得到一个列向量
  3. 将第二部中的列向量中的每个元素除以n即可得到权重向量

数学描述 :

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

例如:

 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

归一化:

苏杭 = 1/(1+0.5+0.2) = 0.5882

北戴河 = 0.5/(1+0.5+0.2) = 0.2941

桂林 = 0.2/(1+0.5+0.2) = 0.1177

同样的方法将整个表格归一化

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

 方法二几何平均法求权重:

步骤(和方法一步骤大致相同):

  1. 将A的元素按照行相乘得到一个新的列向量
  2. 将新的向量的每个分量开n次方
  3. 对该列向量进行归一化即可得到权重向量

 数学描述

 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

方法3特征值法求权重

一致矩阵有一个特征值n,其余特征值均为0.

另外,我们很容易得到,特征值为n时,对应的特征向量刚好为一、数学建模层次分析法(AHP)【清风数学建模个人笔记】(k!=0),这一特征向量刚好就是一致矩阵的第一列。

步骤

  1. 求出矩阵A的最大特征值以及对应的特征向量
  2. 对求出的特征向量进行归一化即可得到我们的权重

 一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

 得出结果         

计算 出各个表格的权重后,得到如下表格

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

通过Excel计算得出各个景点的的得分(F4锁定单元格)

层次分析法做题步骤: 

  1. 分析系统中个因素之间的关系,建立系统的递阶层次结构(层次结构图要放到论文里)一、数学建模层次分析法(AHP)【清风数学建模个人笔记】
  2. 对于同一层次的各元素关于上一层次中某一准则的重要性两两比较,构造两两比较矩阵(判断矩阵)【任何评价类模型都具有主观性,现实中都是自己填写判断表】
  3. 由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验通过之后权重才能使用)【最好三种检验方法都算一下】一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

使用SmartArt画层次结构图 ,使用亿图图示画层次结构图

层次分析法局限性

(1)评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大

(2)如果决策层中指标的数据是已知的,就不能用层次分析法了

代码讲解

%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。 %% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。 %% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。 %% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。 %% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。 %% 输入判断矩阵 clear;clc disp('请输入判断矩阵A: ') %1、输入前可以判断A的维度是否大于1或是否为方阵 % % A = input('判断矩阵A=') A =[1 1 4 1/3 3; 1 1 4 1/3 3; 1/4 1/4 1 1/3 1/2; 3 3 3 1 3; 1/3 1/3 2 1/3 1] % matlab矩阵有两种写法,可以直接写到一行: % [1 1 4 1/3 3;1 1 4 1/3 3;1/4 1/4 1 1/3 1/2;3 3 3 1 3;1/3 1/3 2 1/3 1] % 也可以写成多行: [1 1 4 1/3 3; 1 1 4 1/3 3; 1/4 1/4 1 1/3 1/2; 3 3 3 1 3; 1/3 1/3 2 1/3 1] % 两行之间以分号结尾(最后一行的分号可加可不加),同行元素之间以空格(或者逗号)分开。 %% 方法1:算术平均法求权重 % 第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和) Sum_A = sum(A) [n,n] = size(A) % 也可以写成n = size(A,1) % 因为我们的判断矩阵A是一个方阵,所以这里的r和c相同,我们可以就用同一个字母n表示 SUM_A = repmat(Sum_A,n,1) %repeat matrix的缩写 % 另外一种替代的方法如下: '''SUM_A = []; for i = 1:n %循环哦,这一行后面不能加冒号(和Python不同),这里表示循环n次 SUM_A = [SUM_A; Sum_A] end''' clc;A SUM_A Stand_A = A ./ SUM_A % 这里我们直接将两个矩阵对应的元素相除即可 % 第二步:将归一化的各列相加(按行求和) sum(Stand_A,2) % 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量 disp('算术平均法求权重的结果为:'); disp(sum(Stand_A,2) / n) % 首先对标准化后的矩阵按照行求和,得到一个列向量 % 然后再将这个列向量的每个元素同时除以n即可(注意这里也可以用./哦) %% 方法2:几何平均法求权重 % 第一步:将A的元素按照行相乘得到一个新的列向量 clc;A Prduct_A = prod(A,2) % prod函数和sum函数类似,一个用于乘,一个用于加 dim = 2 维度是行 % 第二步:将新的向量的每个分量开n次方 Prduct_n_A = Prduct_A .^ (1/n) % 这里对每个元素进行乘方操作,因此要加.号哦。 ^符号表示乘方哦 这里是开n次方,所以我们等价求1/n次方 % 第三步:对该列向量进行归一化即可得到权重向量 % 将这个列向量中的每一个元素除以这一个向量的和即可 disp('几何平均法求权重的结果为:'); disp(Prduct_n_A ./ sum(Prduct_n_A)) %% 方法3:特征值法求权重 % 第一步:求出矩阵A的最大特征值以及其对应的特征向量 clc [V,D] = eig(A) %V是特征向量, D是由特征值构成的对角矩阵(除了对角线元素外,其余位置元素全为0) Max_eig = max(max(D)) %也可以写成max(D(:))哦~【max(D)得到每一列的最大值】 % 那么怎么找到最大特征值所在的位置了? 需要用到find函数,它可以用来返回向量或者矩阵中不为0的元素的位置索引。 % 那么问题来了,我们要得到最大特征值的位置,就需要将包含所有特征值的这个对角矩阵D中,不等于最大特征值的位置全变为0 % 这时候可以用到矩阵与常数的大小判断运算 D == Max_eig [r,c] = find(D == Max_eig , 1)%【D == Max_eig(判断语句),返回一个逻辑及矩阵,将最大特征值所在位置变为1,其余位置为0】 % 找到D中第一个与最大特征值相等的元素的位置,记录它的行和列。 % 第二步:对求出的特征向量进行归一化即可得到我们的权重 V(:,c) disp('特征值法求权重的结果为:'); disp( V(:,c) ./ sum(V(:,c)) ) % 我们先根据上面找到的最大特征值的列数c找到对应的特征向量,然后再进行标准化。 %% 计算一致性比例CR clc CI = (Max_eig - n) / (n-1); RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; %注意哦,这里的RI最多支持 n = 15【RI为已知表】 %当n=2时,该表一定是一致矩阵,但是因为RI为0.此时计算CR时分母为0,按照步骤一致性检验时会显示不通过,所以我们可以把RI表中的前两位改为很接近0的正数(0.00001) CR=CI/RI(n);%RI(n)代表RI中第n个元素 disp('一致性指标CI=');disp(CI); disp('一致性比例CR=');disp(CR); if CR<0.10 disp('因为CR < 0.10,所以该判断矩阵A的一致性可以接受!'); else disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!'); end

代码可以优化的地方

%输入之前可以先判断一下输入是否正确 disp('请输入判断矩阵A') A=input('A=');% 这里输入的就是我们的判断矩阵,其为n阶方阵(行数和列数相同) % 在开始下面正式的步骤之前,我们有必要检验下A是否因为粗心而输入有误 ERROR = 0; % 默认输入是没有错误的 %(1)检查矩阵A的维数是否不大于1或不是方阵 [r,c]=size(A); %size(A)函数是用来求矩阵的大小的,返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数 %[r,c]=size(A) %将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c if r ~= c || r <= 1 % 注意哦,不等号是 ~= (~是键盘Tab上面那个键,要和Shift键同时按才会出来),别和C语言里面的!=搞混了 % ||表示逻辑运算符‘或’(在键盘Enter上面,也要和Shift键一起按) 逻辑运算符且是 && (&读and,连接符号,是and的缩写。 ) ERROR = 1; end %(2)检验是否为正互反矩阵 a_ij > 0 且 a_ij * a_ji = 1 if ERROR == 0 [n,n] = size(A); % 因为我们的判断矩阵A是一个非零方阵,所以这里的r和c相同,我们可以就用同一个字母n表示 % 判断是否有元素小于0 % for i = 1:n % for j = 1:n % if A(i,j)<=0 % ERROR = 2; % end % end % end if sum(sum(A <= 0)) > 0%用逻辑矩阵的方法更方便,逻辑矩阵中元素要么全为0,要么有若干个1 ERROR = 2; end end %顺便检验n是否超过了15,因为RI向量为15维 if ERROR == 0 if n > 15 ERROR = 3; end end if ERROR == 0 % 判断 a_ij * a_ji = 1 是否成立 if sum(sum(A' .* A ~= ones(n))) > 0 ERROR = 4; end % A' 表示求出 A 的转置矩阵,即将a_ij和a_ji互换位置 % ones(n)函数生成一个n*n的全为1的方阵, zeros(n)函数生成一个n*n的全为0的方阵 % ones(m,n)函数生成一个m*n的全为1的矩阵 % MATLAB在矩阵的运算中,“/”号和“*”号代表矩阵之间的乘法与除法,对应元素之间的乘除法需要使用“./”和“.*” % 如果a_ij * a_ji = 1 满足, 那么A和A'对应元素相乘应该为1 end if ERROR == 0 % % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % % ..... % % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % % ..... % % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % % ..... % % % % % % % % % % % % %计算一致性比例CR的环节% % % % % % % % % % % % % ..... elseif ERROR == 1 disp('请检查矩阵A的维数是否不大于1或不是方阵') elseif ERROR == 2 disp('请检查矩阵A中有元素小于等于0') elseif ERROR == 3 disp('A的维数n超过了15,请减少准则层的数量') elseif ERROR == 4 disp('请检查矩阵A中存在i、j不满足A_ij * A_ji = 1') end 

模型拓展一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

字太多了,不想写了

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124443.html

(0)
上一篇 2025-10-07 16:15
下一篇 2025-10-07 16:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信