数学建模之评价类问题


前言

我最近在学习数学建模,希望把我学到的东西都记录下来。尤其是记录一些模型的思路和代码,这样以后比赛的时候就能拿过来直接用了。由于本人水平有限,所以文章侧重于模型的应用,而模型背后的原理将不会加以证明。
我最近在做2021年国赛的C题,这道题是一道典型的评价类问题。本文将主要针对此题展开研究,介绍一下评价类问题常用的几种方法。


问题的提出

假设有m家公司,n个指标(假设均为正向化指标)。给出这m家公司关于这n个指标的所有数据,这些数据构成一个m行n列的矩阵,记为 A A A A = ( a i j ) m ∗ n A=(a_{ij})_{m*n} A=(aij)mn。现要求对这m家公司进行排名。

公司指标1指标2……指标n
公司1 a 11 a_{11} a11 a 12 a_{12} a12…… a 1 n a_{1n} a1n
公司2 a 21 a_{21} a21 a 22 a_{22} a22…… a 2 n a_{2n} a2n
…………………………
公司m a m 1 a_{m1} am1 a m 2 a_{m2} am2…… a m n a_{mn} amn

评价类模型

题干描述非常简单,就是要依赖给出的这些数据,建立一个评价类模型,来评价这些公司。而评价类问题的重中之重,则是确定各个指标之间权重。评价类的模型主要有层次分析法,熵权法,TOPSIS法,模糊综合评价法,灰色关联分析等方法。前三种算法在此题中应用较好,后两种算法不太适合这道题。接下来重点介绍一下前三种算法。

层次分析法

层次分析法介绍

层次分析法,又叫AHP。层次分析法得名是因为其需要构造一个层次结构。AHP对目标的各个指标之间逐一进行比较,得到权重。若各个指标的具体数据(即题干中的矩阵A)没有明确给出,也可以两两比较,从而得到具体数据矩阵。该方法的核心是层次结构和两两比较的方法。

层次分析法步骤

构建层次结构

层次结构分为目标层、准则层和方案层。目标层就是我们最终要达到的目标和结果。在此题中,我们的目标就是对这m家公司进行一个排序,那么目标也可以写成选择最强的公司。准则层就是我们达成目标层的判断依据,自然就是这n个指标了。方案层是和目标层相对应的,目标层就是要在方案层中选择一个方案。方案层也可以理解为是研究对象,我们的研究对象就是这m个公司。根据题意,画出下面的层次结构。

目标层
准则层
方案层
选择最强的公司
指标1
指标2
指标3
指标4
指标n
公司1
公司2
公司m
构造判断矩阵

这n个指标的重要程度肯定是不一样的,我们需要定出这n个指标的权重。由于指标比较多,直接定权重难度较大,且主观因素太强,故我们采用的方法是对这些指标两两进行比较,从而在一定程度上削弱主观因素。设判断矩阵为B,B= ( b i j ) n ∗ n (b_{ij})_{n*n} (bij)nn。定义 b i j b_{ij} bij为与指标j相比,i的重要程度。 b i j b_{ij} bij具体的定法参见下表。

标度含义
1表示两个因素相比,具有同样的重要性
3表示两个因素相比,一个因素比另一个因素稍微重要
5表示两个因素相比,一个因素比另一个因素明显重要
7表示两个因素相比,一个因素比另一个因素强烈重要
9表示两个因素相比,一个因素比另一个因素极端重要
2,4,6,8上述两相邻判断的中值
倒数A和B相比,如果标度为3,那么B和A相比就是 1 3 \frac{1}{3} 31
人为构造的矩阵B就是层次分析法中的判断矩阵。
一致性检验

根据定义, b i j = i 的重要程度 j 的重要程度 b_{ij}=\frac{i的重要程度}{j的重要程度} bij=j的重要程度i的重要程度 b j k = j 的重要程度 k 的重要程度 b_{jk}=\frac{j的重要程度}{k的重要程度} bjk=k的重要程度j的重要程度 b i k = i 的重要程度 k 的重要程度 b_{ik}=\frac{i的重要程度}{k的重要程度} bik=k的重要程度i的重要程度,那么就应该有 b i k = b i j ∗ b j k b_{ik}=b_{ij}*b_{jk} bik=bijbjk成立。但是,实际上,这些值都是我们人为设定的,所以这个式子不一定成立。我们允许判断矩阵B不那么完美,但是误差也不能太大。这个时候就要进行一致性检验,看看这个矩阵的一致性误差是否在我们允许的范围内。矩阵的一致性检验有一套固定的流程,接下来不加证明地给出这一套流程。

计算一致性指标CI

λ m a x \lambda_{max} λmax为B的最大特征根, C I = λ m a x − n n − 1 CI=\frac{\lambda_{max}-n}{n-1} CI=n1λmaxn

引入平均一致性指标RI

查阅下表可获得平均一致性指标RI的值。

n123456789
RI000.580.901.121.241.321.411.45
计算一致性比例CR

C R = C I R I CR=\frac{CI}{RI} CR=RICI
当CR < 0.10时,认为判断矩阵的一致性是可以接受的,否则应对判断矩阵作适当修正。

求权重

构造出一个能通过一致性检验的判断矩阵之后,就可以利用这个矩阵求权重了。求权重有三种方法,接下来依次介绍。一般用第三种方法会多一些,但在实际应用中,也可以把三种方法得到的结果取平均值,得到最终的权重。

算术平均法求权重

如果光看判断矩阵的每一列的话,我们不难发现,其实每一列归一化(每个元素除以其所在列的和)之后就是一个权重向量。但是每一列求得的权重向量不一定相同,所以对这n列求算术平均值就可以得到权重向量了。
那么算术平均值求得的第i个指标的权重 ω i = 1 n ∑ j = 1 n a i j ∑ k = 1 n a k j \omega_{i}=\frac{1}{n} \sum_{j=1}^{n}{\frac{a_{ij}}{\sum_{k=1}^{n}{a_{kj}}}} ωi=n1j=1nk=1nakjaij

几何平均法求权重

在算术平均法求权重中,我们对于各列是采用算术平均的,那么其实也可以采用几何平均。
用几何平均值求得的第i个指标的权重 ω i = ( ∏ j = 1 n a i j ) 1 n ∑ k = 1 n ( ∏ j = 1 n a k j ) 1 n \omega_{i}=\frac{(\prod_{j=1}^{n}{a_{ij}})^{\frac{1}{n}}}{\sum_{k=1}^{n}(\prod_{j=1}^{n}{a_{kj}})^{\frac{1}{n}}} ωi=k=1n(j=1nakj)n1(j=1naij)n1

特征值法求权重

由于我们的判断矩阵通过了一致性检验,故可以用一致矩阵求权重的方法来做。我们求出矩阵B的最大特征值 λ m a x \lambda_{max} λmax及其对应的特征向量,并对该特征向量进行归一化就可以得到我们的权重了。

代码

下面是用matlab写的代码。(代码不是我写的,原文链接:https://blog.csdn.net/qq_52785473/article/details/122442010
data表示判断矩阵,可根据需要输入,或者从文件中获取。输出的是每个指标的权重 ω i \omega_{i} ωi。有了每个指标的权重之后,要比较公司的重要性,只需要加权平均,然后排序就可以了,这个工作非常简单,代码没有给出。

data = [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];%需要检验的一致性矩阵
[n,m]=size(data);

%求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(data);%求矩阵的特征值和特征向量,V为特征向量矩阵,D为特征值矩阵。
lenda=max(D);
lendada=max(lenda);%求对角线向量
col = find(D(1,:) == max(lenda));%求最大特征值
lenda_V = V(:, col);% 最大特征值的特征向量,能够用于计算特征权重
for i = 1:n
    w(i,1) = lenda_V(i,1)/sum(lenda_V);
end

%一致性检验
CI=(lendada-n)/(n-1);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
%判断是否通过一致性检验
CR=CI/RI(n);
if CR>=0.1
   fprintf('没有通过一致性检验\n');
else
  w
  fprintf('通过一致性检验\n');
end

熵权法

熵权法介绍

层次分析法的权重带有很重的主观色彩,而为了使权重更加客观,我们利用原始数据中的某些特性来确定权重。一列数据方差越小,所反映的信息量也越少,那么此时其权重就应该越低。而一列数据所反映的信息量越少,其信息熵就越大。所以指标的信息熵就是这样一个具有优良性质的特性。而且信息熵越大,权重就越低。
熵权法只是一个确定权重的方法,一般和别的方法(如TOPSIS法)一起使用。故这个方法就不给出代码了。

熵权法步骤

数据标准化

由于每一列数据可能代表不同类别,不同单位的信息,所以为了方便比较,我们需要对数据进行标准化处理。
我们令 x i j = a i j − m i n ( x i ) m a x ( x i ) − m i n ( x i ) x_{ij}=\frac{a_{ij}-min(x_i)}{max(x_i)-min(x_i)} xij=max(xi)min(xi)aijmin(xi)
那么 { x i j } \{x_{ij}\} {xij}就是我们对A进行标准化处理之后的矩阵。

计算信息熵

p i j = x i j ∑ i = 1 m x i j p_{ij}=\frac{x_{ij}}{\sum_{i=1}^m {x_{ij}}} pij=i=1mxijxij
对于第j个指标而言,其信息熵的计算公式为 E j = − 1 l n m ∑ i = 1 m p i j l n p i j E_j=-\frac{1}{lnm} \sum_{i=1}^m {p_{ij}lnp_{ij}} Ej=lnm1i=1mpijlnpij

计算指标权重

根据定义,信息熵是一个位于[0,1]的实数。由于信息熵和权重是负相关的,所以我们根据 1 − E j 1-E_j 1Ej来制定权重。
ω j = 1 − E j ∑ j = 1 n ( 1 − E j ) \omega_j=\frac{1-E_j}{\sum_{j=1}^n {(1-E_j)}} ωj=j=1n(1Ej)1Ej
ω j \omega_j ωj即为第j个指标的权重。

计算综合得分

第i家公司的综合得分为按照权重加权平均的结果,即 s i = ∑ j = 1 n ω j x i j s_i=\sum_{j=1}^n {\omega_j x_{ij}} si=j=1nωjxij
这样就能给出公司的排序啦

TOPSIS法

TOPSIS法介绍

层次分析法和熵权法都是得到权重的方法,而得到权重之后直接通过加权平均来计算每一家公司的得分,对于数据没有充分地利用。而TOPSIS法则充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。
TOPSIS法又称优劣解距离法。直观理解,就是在所有指标中选出最大值(最小值),组成一个最优方案(最劣方案)。距离最优方案越近、离最劣方案越远的那个方案就是最优方案。

TOPSIS法步骤

前期数据处理

由于涉及到最优解、距离等概念,所以有必要对各个指标的初始数据进行一些处理。先将所有指标转化为极大型指标,再对所有数据进行标准化处理。这里不做过多展开。

定义最大值和最小值

首先要找出每个指标的最优解和最劣解,即矩阵A每一列的最大值和最小值。
X j + = m a x { a 1 j , a 2 j , … , a m j } X_j^+ =max\{a_{1j},a_{2j},…,a_{mj}\} Xj+=max{a1j,a2j,,amj} X j − = m i n { a 1 j , a 2 j , … , a m j } X_j^- =min\{a_{1j},a_{2j},…,a_{mj}\} Xj=min{a1j,a2j,,amj}

定义距离

定义第i家公司距离最优解的距离 D i + = ∑ j = 1 n ( X j + − a i j ) 2 D_i^+=\sqrt{\sum_{j=1}^{n} {(X_j^+-a_{ij})^2}} Di+=j=1n(Xj+aij)2 ,其距离最最劣解的距离 D i − = ∑ j = 1 n ( X j − − a i j ) 2 D_i^-=\sqrt{\sum_{j=1}^{n} {(X_j^--a_{ij})^2}} Di=j=1n(Xjaij)2
这是假设每个指标权重相等的情况。如果第j个指标的权重为 ω j \omega_j ωj,那么可以更改上式为
{ D i + = ∑ j = 1 n ω j ( X j + − a i j ) 2 D i − = ∑ j = 1 n ω j ( X j − − a i j ) 2 \begin{cases} D_i^+=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^+-a_{ij})^2}} \\ D_i^-=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^--a_{ij})^2}} \end{cases} Di+=j=1nωj(Xj+aij)2 Di=j=1nωj(Xjaij)2

计算得分

S i = D i − D i + + D i − S_i=\frac{D_i^-}{D_i^++D_i^-} Si=Di++DiDi
S i S_i Si即为第i家公司的得分。

TOPSIS法总结

综上所述,TOPSIS法的公式可以用下面几个式子来描述:
{ X j + = m a x { a 1 j , a 2 j , … , a m j } X j − = m i n { a 1 j , a 2 j , … , a m j } D i + = ∑ j = 1 n ω j ( X j + − a i j ) 2 D i − = ∑ j = 1 n ω j ( X j − − a i j ) 2 S i = D i − D i + + D i − \begin{cases} X_j^+ =max\{a_{1j},a_{2j},…,a_{mj}\}\\ X_j^- =min\{a_{1j},a_{2j},…,a_{mj}\}\\ D_i^+=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^+-a_{ij})^2}} \\ D_i^-=\sqrt{\sum_{j=1}^{n} {\omega_j(X_j^--a_{ij})^2}}\\ S_i=\frac{D_i^-}{D_i^++D_i^-} \end{cases} Xj+=max{a1j,a2j,,amj}Xj=min{a1j,a2j,,amj}Di+=j=1nωj(Xj+aij)2 Di=j=1nωj(Xjaij)2 Si=Di++DiDi

总结

层次分析法和熵权法都是用来获取权重的方式,前者较为主观,后者则是基于数据性质的客观方法。TOPSIS法则是在给出权重后,利用和最优解最劣解之间的距离进行排名的一种方法。TOPSIS法一般可以和层次分析法或者熵权法结合使用,这样可以在给出权重后,充分利用原始数据进行排名。对于这道题而言,熵权-TOPSIS法是比较好的一种方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值