数学建模方法-层次分析法
一、引言
为了准备9月份的华为杯-数学建模比赛,在这个过程中,博主在网上学习了十种数学建模的方法。并根据自己的理解写下来。在这一篇章中,要讲述的是“层次分析法”。首先在讲解“层次分析法”之间,需要讲解的一个概念是由Santy提出的“一致矩阵法”。那么什么是“一致矩阵法”呢,大家好好看咯,我们要开始了。。
二、一致矩阵法
一致矩阵法,听起来好像很难的样子,其实不然,实际上就是一种将人们对事物的主观感觉用数学的形式表达的方法。比如说有三种水果,苹果、香蕉和芒果。对博主而言,我觉得芒果是我的最爱,香蕉其次,苹果排最后,那么根据我的喜好程度可以列出芒果>香蕉>苹果的顺序。但是在数学建模中,我们总不能直接这样讲,这样讲没有数字出现,别人不愿意接受。因此,一致矩阵法就是针对这种情况而产生的。好了,接下来是枯燥的内容了,大家要准备好了哦。
一致矩阵法的核心思想有两个:
- 不把所有的因素放在一起比较,而是两两互相比较
- 采用相对尺度,以尽可能减少性质不同的诸因素相互比较的困难,以提高准确度。
以上两点是什么意思呢。别急,接下来就要深入浅出的讲解了,包你看懂。。
首先大家要了解一个表,叫成对比较阵标度表,如下图所示:
1 | 表示两个因素相比,具有同样重要性 |
3 | 表示两个因素相比,一个因素比另一个因素稍微重要 |
5 | 表示两个因素相比,一个因素比另一个因素明显重要 |
7 | 表示两个因素相比,一个因素比另一个因素强烈重要 |
9 | 表示两个因素相比,一个因素比另一个因素极端重要 |
2, 4, 6, 8 | 上述两相移判断的中值 |
倒数 | 因素i与j比较的判断a,则因素j与i比较的判断aji=1/aij |
这是什么意思呢,简单讲,像我前面说的,我自己觉得好吃程度是芒果 > 香蕉 > 苹果,那么,根据一致矩阵法,我需要创建一个3×3的矩阵,首先我先假定芒果= C1,香蕉= C2,苹果= C3,则
C1 | C2 | C3 | |
C1 | 1 | 3 | 7 |
C2 | 1/3 | 1 | 5 |
C3 | 1/7 | 1/5 | 1 |
上面那个表是什么意思呢,听我慢慢道来:
首先我们看第一行,1 3 7 分别表示:
1:C1跟C1相比,是具有同样重要(这不是废话吗,芒果跟芒果当然一样好吃啦);
3:C1跟C2相比,稍微重要(即我觉得芒果比香蕉好吃一些);
7:C1跟C3相比,强烈重要(即我觉得芒果比苹果好吃太多了);
接着看第二行:为什么有一个1/3呢,这是表示:
C2跟C1相比的值,应该等于C1跟C2相比的倒数(这是规定);
因此,在根据我们的主观意识给这个矩阵填好相应的系数后,再根据倒数规则补充剩下的空格。就能完成我们这个一致性矩阵。
也许大家会讲,那这个主观意识很重要诶。是的没错,层次分析法其实就是一种比较主观的方法。所以,在填入你所需要的标度数时,尽量查阅多一些文献,这样结果会更加准确。
好的,讲完层次分析法所需要的基础知识后,接下来我们要介绍层次分析法的使用了。大家不要跑神哦!
三、层次分析法
好了,现在我们来讲讲这个“层次分析法”是什么东东。我先抛出一个官方的定义,再举例说明。
官方定义:层次分析法根据问题的性质和要达到的总目标,将问题分解为不同的组成因素,并按照因素间的相互关联影响以及隶属关系将因素按不同层次聚集组合,形成一个多层次的分析结构模型,从而最终使问题归结为最底层(供决策的方案、措施等)相对于最高层(总目标)的相对重要权重的确定或相对优劣次序的排定。其中:
- 最高层:决策的目的、要解决的问题
- 最底层:决策时的备选方案
- 中间层:考虑的因素、决策的准则。
好了,现在我们来举例说明究竟这个“层次分析法”是什么以及如何构架一个层次结构模型吧。。
问题:【选择旅游地】如何在3个目的地按照景色、费用、居住条件等因素进行选择。
解法:
1.首先,在这个问题中,我们要解决的问题就是选择旅游地,不妨设为Z,这就是我们的最高层 = Z;
2.接着,在题目中,我们旅游地的可选择只有三个,分别设为B1,B2,B3。这就是我们的最底层;
3.最后就是我们的中间层,根据定义,中间层就该是景色、费用、居住、饮食、旅途这些条件,分别设为A1,A2,A3,A4,A5。
接下来我们就开始构建层次模型吧。如下图所示
大家这时候应该体会到了层次分析法是什么样的一种方法了吧。如果这时还不明白的请看回官方定义。
好了,也就是,通过计算出各个层之间的权重,根据权重来得出我们要的结果。
那么权重该怎么确定呢,大家还记得前面说的一致矩阵法吗,我们需要通过一致矩阵法写出成对比较矩阵,然后将成对比较矩阵代入我们的一个matlab的代码里面,就能算出权重了。
3.1 确定权重
disp('请输入判断矩阵A(n阶)');
A = input('A = ');
[n, n] = size(A);
x = ones(n, 100);
y = ones(n, 100);
m = zeros(1, 100);
m(1) = max(x(:, 1));
y(:, 1) = x(:, 1);
x(:, 2) = A * y(:, 1);
m(2) = max(x(:, 2));
y(:, 2) = x(:, 2)/m(2);
p = 0.0001;i = 2;k = abs(m(2) - m(1));
while k > p
i = i+1;
x(:, i) = A * y(:, i - 1);
m(i) = max(x(:, i));
y(:, i) = x(:, i)/m(i);
k = abs(m(i) - m(i - 1));
end
a = sum(y(:, i));
w = y(:, i)/a;
t = m(i);
disp(w);
%以下是一致性检验(暂时不讲解这个概念,下次再补充)
CI = (t - 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];
CR = CI/RI(n);
if CR < 0.10
disp('此矩阵的一致性可以接受!');
disp('CI = '); disp(CI);
disp('CR = '); disp(CR);
end
只要将成对检验理论输入我们的MATLAB代码,就能求解出权重。
就B1对总目标的权重来说,其计算公式应该为O1 = B1对A1的权重×A1对Z的权重+……+B1对A5的权重×A5对Z的权重(5项)。
接着我们只要分别也算出B2和B3对总目标的权重O2和O3。最后比较O1、O2和O3的大小即可。
我们假设最后算出的结果是O3 > O1 > O2。那么最后的决策应是去B3。