数学建模——层次分析法

前言

本文是笔者在B站的学习收获,B站教程:www.bilibili.com/video/BV1kC...

本文将通过案例详细介绍层次分析法,包括完整建模和编程(matlab编写)过程。

正文

介绍

层次分析法将定量分析与定性分析结合起来,用决策者的经验判断各衡量目标能否实现的标准之间的相对重要程度,并合理地给出每个决策方案的每个标准的权数,利用权数求出各方案的优劣次序,比较有效地应用于那些难以用定量方法解决的课题。

层次分析法的优点

(1)系统性。把所研究的问题看成一个 系统,按照分解、比较判断、综合分析的思维方式进行决策分析,也是实际中继机理分析方法、统计分析方法之后发展起来的又一个重要的系统分析工具。

(2)实用性。把定性与定量方法结合起来,能处理许多传统的优化方法无法处理的实际问题,应用范围广。而且将决策者和决策分析者联系起来,体现了决策者的主观意见,决策者可以直接应用它进行决策分析,增加了决策的有效性和实用性。

(3)简洁性。具有中等文化程度的人都可以学习掌握层次分析法的基本原理和步骤,计算也比较简便, 所得结果简单明确,容易被决策者了解和掌握。

层次分析法的局限性

局限性是粗略、 主观。首先是它的比较、判断及结果都是粗糙的,不适于精度要求很高的问题;

其次是从建 立层次结构图到给出两两比较矩阵,人的主观因素作用很大,使决策结果较大程度地依赖于决策人的主观意志,可能难以为众人所接受。

具体事例

问题:

现在有三个地方供旅游选择------苏杭、北戴河、桂林,应该如何选择?

求解:

1.建立层次结构模型

该结构层包括目标层准则层方案层

2.构造成对比较矩阵

使用1------9尺度构造成对比较矩阵

首先构造准则层的比较矩阵,即景色、费用、...、旅途相关性重要程度的权重矩阵,这一步很主观,因为矩阵是我们自己构造的,这里我构造的矩阵是A

然后构造准则层->方案层的比较矩阵,即在景色方面,这三个地方相比之下怎么样、在费用方面,这三个地方相比之下怎么样,...在旅途方面...最后构造出五个矩阵B1-B5

3.计算单排序权向量并做一致性检验

对每个成对比较矩阵计算最大特征值及其对应的特征向量,利用一致性指标、随机-致性指标和一致性比率做一致性检验。若检验通过,特征向量(归一化后)即为权向量;若不通过,需要重新构造成对比较矩阵。

实际操作就是把第二步得出的矩阵放入代码中,通过一致性检验则进行下一步,不通过则说明矩阵构造的不理想需要重新构建。matlab代码放在下面:

scss 复制代码
disp('请输入准则层判断矩阵A(n阶)');
A=input('A=');
[n,n]=size(A);
[V,D]=eig(A);%求得特征向量和特征值
            %求出最大特征值和它所对应的特征向量
tempNum=D(1,1);
pos=1;
for h=1:n
    if D(h,h)>tempNum
        tempNum=D(h,h);
        pos=h;
    end
end    
w=abs(V(:,pos));
w=w/sum(w);
t=D(pos,pos);
disp('准则层特征向量w=');disp(w);disp('准则层最大特征根t=');disp(t);
         %以下是一致性检验
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 1.60 1.61 1.615 1.62 1.63];
CR=CI/RI(n);
if CR<0.10
    disp('此矩阵的一致性可以接受!');
    disp('CI=');disp(CI);
    disp('CR=');disp(CR);
else disp('此矩阵的一致性验证失败,请重新进行评分!');
end

使用方法

(1)构造判断矩阵A

(2)将下文代码复制粘贴到Matlab中即可

例如:A=[1 3 5;0.33 1 3;0.2 0.33,1]

代码中的步骤就是根据输入的矩阵计算出最大特征值和其对应的特征向量,然后把特征向量归一化处理,利用最大特征值和矩阵的维数求出CI值,RI是固定的,根据矩阵维数拿出对应的RI,CI/RI求出CR,如果CR<0.1则通过一致性检验。

运行代码可以得到归一化的特征向量,以A矩阵为例,求出w(特征向量)、入(最大特征根)、CI、RI。

多次运行,再分别带入B1-B5,最后得出

并且都通过了一致性检验

4.计算总排序权向量并做一致性检验

苏杭的得分为A矩阵得出的特征向量和wk1行元素对应相乘:

(这里一些值和上面A矩阵的求出来的特征向量不太一致,但是很接近。原因在于A矩阵那个是在我自己的matlab上面运行的,这个里面的图片是我截的听课时候的图,所以有细微差别,但是不影响结果,毕竟学懂了就行。)

同样的道理可以求出北戴河和桂林的得分:0.2460.456

然后再进行一致性检验,这时候的检验方法为:一个分数,分子是A矩阵得出的特征向量和CIk行元素对应相乘,分母是A矩阵得出的特征向量和RIk行元素对应相乘,结果与0.1比较:

通过一致性检验,所以进行下一步。

根据得分情况算出桂林>苏杭>北戴河,所以最后的决策是选择桂林作为旅游目的地。

相关推荐
忍界英雄3 分钟前
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
算法·leetcode·机器人
Kenneth風车4 分钟前
【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·数据分析
C7211BA22 分钟前
使用knn算法对iris数据集进行分类
算法·分类·数据挖掘
Tisfy24 分钟前
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
算法·leetcode·机器人·题解·滑动窗口
程序猿练习生28 分钟前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode
Huazzi.32 分钟前
算法题解:斐波那契数列(C语言)
c语言·开发语言·算法
汉字萌萌哒33 分钟前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法
2301_8071805434 分钟前
icpc江西:L. campus(dij最短路)
算法
th新港34 分钟前
CCF201909_1
数据结构·c++·算法·ccf
Dola_Pan36 分钟前
字符串的KMP算法详解及C/C++代码实现
算法