【Matlab数学建模】层次分析法

一、通过权重表格求解评价类问题

  层次分析法主要用于评价类问题,比如说小明要去旅游,纠结去苏航还是北戴河、还是桂林。

  我们可以弄这样一张权重表格。
【Matlab数学建模】层次分析法_第1张图片
  将这张表格记作矩阵:
A = ( a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 a 51 a 52 a 53 a 54 ) A = \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14}\\ a_{21} & a_{22} & a_{23} & a_{24}\\ a_{31} & a_{32} & a_{33} & a_{34}\\ a_{41} & a_{42} & a_{43} & a_{44}\\ a_{51} & a_{52} & a_{53} & a_{54} \end{pmatrix} A=a11a21a31a41a51a12a22a32a42a52a13a23a33a43a53a14a24a34a44a54
  取m为权重表矩阵的行数,n为权重表矩阵的列数,则对于权重矩阵而言,需满足:
∑ i = 1 m a i 1 = 1 对 于 ∀ i ∈ [ 1 , m ] , 有 ∑ j = 2 n a i j = 1 \sum\limits_{i = 1}^{m}a_{i1} = 1\\ 对于\forall i \in \left[1, m\right],有\sum\limits_{j = 2}^{n}a_{ij}=1 i=1mai1=1i[1,m]j=2naij=1
  而我们计算权重值也很简单,例如计算第j列对应的权重值。
w j = ( a 11 , a 21 … a m 1 ) × ( a 1 j , a 2 j … a m j ) T w_{j}=\left(a_{11}, a_{21}\dots a_{m1}\right) \times \left(a_{1j}, a_{2j}\dots a_{mj}\right)^T wj=(a11,a21am1)×(a1j,a2jamj)T
  然后我们比较w2、w3……wn。获得其中的最大值,即是最终答案。

  例如在上面那个例子中
A = ( a 11 a 12 a 13 a 14 a 21 a 22 a 23 a 24 a 31 a 32 a 33 a 34 a 41 a 42 a 43 a 44 a 51 a 52 a 53 a 54 ) w 苏 杭 = ( a 11 , a 21 , a 31 , a 41 , a 51 ) × ( a 12 , a 22 , a 32 , a 42 , a 52 ) T w 北 戴 河 = ( a 11 , a 21 , a 31 , a 41 , a 51 ) × ( a 13 , a 23 , a 33 , a 43 , a 53 ) T w 桂 林 = ( a 11 , a 21 , a 31 , a 41 , a 51 ) × ( a 14 , a 24 , a 34 , a 44 , a 54 ) T A = \begin{pmatrix} a_{11} & a_{12} & a_{13} & a_{14}\\ a_{21} & a_{22} & a_{23} & a_{24}\\ a_{31} & a_{32} & a_{33} & a_{34}\\ a_{41} & a_{42} & a_{43} & a_{44}\\ a_{51} & a_{52} & a_{53} & a_{54} \end{pmatrix}\\ w_{苏杭} = (a_{11}, a_{21}, a_{31}, a_{41}, a_{51}) \times (a_{12}, a_{22}, a_{32}, a_{42}, a_{52})^T\\ w_{北戴河} = (a_{11}, a_{21}, a_{31}, a_{41}, a_{51}) \times (a_{13}, a_{23}, a_{33}, a_{43}, a_{53})^T\\ w_{桂林} = (a_{11}, a_{21}, a_{31}, a_{41}, a_{51}) \times (a_{14}, a_{24}, a_{34}, a_{44}, a_{54})^T A=a11a21a31a41a51a12a22a32a42a52a13a23a33a43a53a14a24a34a44a54w=(a11,a21,a31,a41,a51)×(a12,a22,a32,a42,a52)Tw=(a11,a21,a31,a41,a51)×(a13,a23,a33,a43,a53)Tw=(a11,a21,a31,a41,a51)×(a14,a24,a34,a44,a54)T
  计算完成后,比较三者大小选最大的。

  用matlab程序可以表示为:

function res = func(mat)
	[~, n] = size(mat);
	a = sum(repmat(mat(:, 1), 1, n - 1) .* mat(:, 2 : n));
	res = find(a == max(a));
end

二、如何获得权重表

  首先,例子评价的指标有五个:景色、花费、居住、饮食、交通。构建一个五行五列方阵:
【Matlab数学建模】层次分析法_第2张图片
  我们问问小明觉得景色和花费哪个重要,小明说觉得景色比花费重要两倍,所以 a 12 = 1 a 21 = 2 a_{12} = \frac{1}{a_{21}} = 2 a12=a211=2,小明还说居住比景色重要四倍。那么 a 31 = 1 a 13 = 4 a_{31} = \frac{1}{a_{13}} = 4 a31=a131=4

  显然地,对于我们构建的这个矩阵,满足:
对 于 ∀ i , j ∈ [ 1 , n ] , 有 a i j × a j i = 1 对于\forall i, j\in[1, n],有a_{ij} \times a_{ji} = 1 i,j[1,n]aij×aji=1
  所有满足这个条件的矩阵都被成为正互反矩阵。可以用下面的的程序来判断:

function res = func(mat)
	a = mat .* mat';
	a = a(:);
	res = all(a == 1);
end

  对于某个正互反矩阵,若满足秩为一,即:
{ a i j > 0 a 11 = a 22 = ⋯ = a n n = 1 [ a i 1 , a i 2 , … , a i n ] = k i [ a 11 , a 12 , … , a 1 n ] \left\{ \begin{aligned} a_{ij}>0 \\ a_{11} = a_{22} = \dots = a_{nn} = 1\\ [a_{i1}, a_{i2}, \dots, a_{in}] = k_i[a_{11}, a_{12}, \dots, a_{1n}] \end{aligned} \right. aij>0a11=a22==ann=1[ai1,ai2,,ain]=ki[a11,a12,,a1n]
  则称该矩阵为一致性矩阵。

  而检验一个正互反矩阵是否接近于一致性矩阵的过程叫做一致性检验。其过程如下:
【Matlab数学建模】层次分析法_第3张图片

function [res, CR] = func(mat)
	RI =	[0.00	0.00	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];
	[n, ~] = size(mat);
	lambda = max(eig(mat));
	CI = (lambda - n) / (n - 1);
	CR = CI / RI(n);
	res = CR < 0.1;	
end

三、求权重的三种方法

  假设对于景色这一评判标准,对应的矩阵是:
【Matlab数学建模】层次分析法_第4张图片

① 算术平均法求权重

【Matlab数学建模】层次分析法_第5张图片
【Matlab数学建模】层次分析法_第6张图片

function res = func(mat)
	[n, ~] = size(mat);
	res = sum((mat ./ repmat(sum(mat), n, 1)), 2) / n;
end

② 几何平均法

【Matlab数学建模】层次分析法_第7张图片

function res = func(mat)
	[n, ~] = size(mat);
	res = prod(mat, 2) .^ (1 / n);
	res = res / sum(res);
end

③ 特征值法(最常用)

【Matlab数学建模】层次分析法_第8张图片

function res = func(mat)
	[v, d] = eig(mat);
	d = diag(d);
	a = v(:, d == max(d));
	res = a / sum(a);
end

你可能感兴趣的:(数学建模,matlab,线性代数,矩阵)