数学建模条记——TOPSIS[优劣解距离]法

打印 上一主题 下一主题

主题 970|帖子 970|积分 2910

TOPSIS(优劣解距离)法

1. 基本概念

C. L.Hwang和 K.Yoon于1981年首次提出 TOPSIS(Technique for Order Preference by Similarity to an Ideal Solution),可翻译为逼近理想解排序法,国内常简称为优劣解距离法。
TOPSIS法是一种常用的综合评价方法,能充实利用原始数据的信息,其效果能正确地反映各评价方案之间的差距。
TOPSIS法引入了两个基本概念:


  • 理想解:假想的最优的解(方案),它的各个属性值都达到各备选方案中的最好的值;
  • 负理想解:假想的最劣的解(方案),它的各个属性值都达到各备选方案中的最坏的值。方案排序的规则是把各备选方案与理想解和负理想解做比较,若此中有一个方案最接近理想解,而同时又远离负理想解,则该方案是备选方案中最好的方案。TOPSIS通过最接近理想解且最远离负理想解来确定最优选择。
2. 模型原理

TOPSIS法是一种理想目标相似性的次序选优技能,在多目标决策分析中是一种非常有效的方法。它通过归一化后(去量纲化)的数据规范化矩阵,找出多个目标中最优目标和最劣目标(分别用理归想一解化和反理想解表示),分别计算各评价目标与理想解和反理想解的距离,得到各目标与理想解的贴近度,按理想解贴近度的大小排序,以此作为评价目标优劣的依据。贴近度取值在0~1之间,该值愈接近1,表示相应的评价目标越接近最优水平;反之,该值愈接近0,表示评价目标越接近最劣水平。
3. 基本步调


  • 将原始矩阵正向化
    将原始矩阵正向化,就是要将全部的指标范例同一转化为极大型指标
  • 将正向化矩阵尺度化
    尺度化的方法有很多种,其重要目的就是去除量纲的影响,保证差别评价指标在同一数目级,且数据大小排序不
  • 计算得分并归一化
                                                              S                                  i                                          =                                                        D                                     i                                     −                                                                         D                                        i                                        +                                                  +                                                   D                                        i                                        −                                                                          S_{i}=\frac{D_{i}^{-}}{D_{i}^{+}+D_{i}^{-}}                        Si​=Di+​+Di−​Di−​​,此中                                                         S                                  i                                                 S_{i}                        Si​为得分,                                                         D                                  i                                  +                                                 {D_{i}^{+}}                        Di+​为评价对象与最大值的距离,                                                         D                                  i                                  −                                                 D_{i}^{-}                        Di−​
为评价对象与最小值的距离。
4. 典范例题

   明星Kun想找一个对象,但喜欢他的人太多,不知道怎么选,颠末层层考察,留下三个候选人。他认为身高165是最好的,体重在90-100斤是最好的。
  候选人颜值牌气(争吵次数)身高体重A910175120B8716480C6315790  4.1 矩阵正向化

常见的指标范例:
指标名称指标特点例子极大型 (效益型) 指标越大(多)越好成绩、 GDP增速、 企业利润极小型 (本钱型) 指标越小(少)越好费用、 坏品率、污染程度中心型指标越接近某个值越好水质量评估时的PH值区间型指标落在某个区间最好体温、 水中植物性营养物量 在 TOPSIS 方法中,就是要将全部指标举行同一正向化,即同一转化为极大型指标。 那么就必要极小型、中心型以及区间型的指标举行转化为极大型指标。
指标名称公式极大型(效益型)指标/极小型(本钱型)指标                                                               x                                     ~                                              =                                  m                                  a                                  x                                  −                                  x                                          \tilde{x} = max-x                           x~=max−x,                                                                x                                     ~                                                      \tilde{x}                           x~为指标值,                                                  m                                  a                                  x                                          max                           max为指标最大值,                                                  x                                          x                           x为指标值中心型指标                                                  {                                               x                                     i                                              }                                          \{x_i\}                           {xi​} 是一组中心型序列,最优值是                                                                x                                                   b                                        e                                        s                                        t                                                                   x_{best}                           xbest​,$M = max{区间型指标                                                               x                                     i                                                      {x_i}                           xi​是一组区间型序列,最佳区间为                                                  [                                  a                                  ,                                  b                                  ]                                          [a,b]                           [a,b],正向化公式如下                                                  M                                  =                                  m                                  a                                  x                                  {                                  a                                  −                                  m                                  i                                  n                                  {                                               x                                     i                                              }                                  ,                                  m                                  a                                  x                                  {                                               x                                     i                                              }                                  −                                  b                                  }                                  ,                                                             x                                        ~                                                  i                                              =                                               {                                                                                                                     1                                                    −                                                                                           a                                                          −                                                                               x                                                             i                                                                                              M                                                                      ,                                                                       x                                                       i                                                                      <                                                    a                                                                                                                                                                        1                                                    ,                                                    a                                                    ≤                                                                       x                                                       i                                                                      ≤                                                    b                                                                                                                                                                        1                                                    −                                                                                                                x                                                             i                                                                              −                                                          b                                                                          M                                                                      ,                                                                       x                                                       i                                                                      >                                                    b                                                                                                                                 M=max\{a-min\{x_i\}, max\{x_i\}-b\}, \widetilde{x}_i=\begin{cases}1-\frac{a-x_i}{M}, x_i<a\\1, a\leq x_i\leq b\\1-\frac{x_i-b}{M}, x_i>b\end{cases}                           M=max{a−min{xi​},max{xi​}−b},x                i​=⎩                 ⎨                 ⎧​1−Ma−xi​​,xi​<a1,a≤xi​≤b1−Mxi​−b​,xi​>b​

  • 颜值为极大型指标
  • 脾气为极小型指标
       候选人颜值                                                            m                                        a                                        x                                                  max                                 max                                                            m                                        a                                        x                                        −                                        x                                                  max-x                                 max−xA10100B7103C3107
  • 身高为中心型指标
       候选人身高                                                                           x                                                           b                                              e                                              s                                              t                                                                               x_{best}                                 xbest​|                                                                           x                                           i                                                      −                                                       x                                                           b                                              e                                              s                                              t                                                                               x_i-x_{best}                                 xi​−xbest​|                                                                                           x                                              ^                                                          i                                                                \hat{x}_i                                 x^i​A175165101B16416511/10C15716588/10
  • 体重为区间型指标
       候选人体重                                                            M                                                  M                                 M                                                                                           x                                              ^                                                          i                                                                \hat{x}_i                                 x^i​A120200B80201/2C90201
正向化后的矩阵为
候选人颜值牌气(争吵次数)身高体重A9000B830.90.5C670.21 4.2 正向矩阵尺度化

尺度化的目的是消除差别指标量纲的影响
假设有n个要评价的对象,m个评价指标(已经正向化了)构成的正向化矩阵如下:
                                         X                            =                                       [                                                                                                     x                                              11                                                                                                                            x                                              12                                                                                                            ⋯                                                                                                             x                                                               1                                                 m                                                                                                                                                                  x                                              21                                                                                                                            x                                              22                                                                                                            ⋯                                                                                                             x                                                               2                                                 m                                                                                                                                                                  ⋮                                                                                                                                                                          ⋮                                                                                                                                                          ⋱                                                                                                             ⋮                                                                                                                                                                                                x                                                               n                                                 1                                                                                                                                            x                                                               n                                                 2                                                                                                                            ⋯                                                                                                             x                                                               n                                                 m                                                                                                                ]                                            X=\begin{bmatrix}x_{11}&x_{12}&\cdots&x_{1m}\\x_{21}&x_{22}&\cdots&x_{2m}\\\vdots&\vdots&\ddots&\vdots\\x_{n1}&x_{n2}&\cdots&x_{nm}\end{bmatrix}                     X=               ​x11​x21​⋮xn1​​x12​x22​⋮xn2​​⋯⋯⋱⋯​x1m​x2m​⋮xnm​​               ​
那么对其尺度化后的矩阵记为Z,Z的每一个元素:
                                                    z                                           i                                  j                                                 =                                                   x                                               i                                     j                                                                                             ∑                                                       i                                           =                                           1                                                      n                                                                x                                                       i                                           j                                                      2                                                                                z_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^nx_{ij}^2}}                     zij​=∑i=1n​xij2​                    ​xij​​
即(每一个元素/根号下地点列元素的平方和)得到尺度化矩阵Z:
                                         Z                            =                                       [                                                                                                     z                                              11                                                                                                                            z                                              12                                                                                                            ⋯                                                                                                             z                                                               1                                                 m                                                                                                                                                                  z                                              21                                                                                                                            z                                              22                                                                                                            ⋯                                                                                                             z                                                               2                                                 m                                                                                                                                                                  ⋮                                                                                                                                                                          ⋮                                                                                                                                                          ⋱                                                                                                             ⋮                                                                                                                                                                                                z                                                               n                                                 1                                                                                                                                            z                                                               n                                                 2                                                                                                                            ⋯                                                                                                             z                                                               n                                                 m                                                                                                                ]                                            Z=\begin{bmatrix}z_{11}&z_{12}&\cdots&z_{1m}\\z_{21}&z_{22}&\cdots&z_{2m}\\\vdots&\vdots&\ddots&\vdots\\z_{n1}&z_{n2}&\cdots&z_{nm}\end{bmatrix}                     Z=               ​z11​z21​⋮zn1​​z12​z22​⋮zn2​​⋯⋯⋱⋯​z1m​z2m​⋮znm​​               ​
尺度化后,还必要给差别指标加上权重,接纳的权重确定方法有层次分析法、熵权法、Delphi法、对数最小二乘法。这里认为各个指标权重雷同。
对上述矩阵举行尺度化,得
候选人颜值牌气(争吵次数)身高体重A0.669000B0.5950.3940.9760.447C0.4460.9190.2170.894 4.3 计算得分并归一化

定义最大值:
                                                    Z                               +                                      =                            (                            m                            a                            x                            {                                       z                               11                                      ,                                       z                               21                                      ,                            ⋯                             ,                                       z                                           n                                  1                                                 }                            ,                            m                            a                            x                            {                                       z                               12                                      ,                                       z                               22                                      ,                            ⋯                             ,                                       z                                           n                                  2                                                 }                            ,                            ⋯                             ,                            m                            a                            x                            {                                       z                                           1                                  m                                                 ,                                       z                                           2                                  m                                                 ,                            ⋯                             ,                                       z                                           n                                  m                                                 }                            )                                  Z^+=(max\{z_{11},z_{21},\cdots,z_{n1}\},max\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,max\{z_{1m},z_{2m},\cdots,z_{nm}\})                     Z+=(max{z11​,z21​,⋯,zn1​},max{z12​,z22​,⋯,zn2​},⋯,max{z1m​,z2m​,⋯,znm​})
定义最小值:
                                                    Z                               −                                      =                            (                            m                            i                            n                            {                                       z                               11                                      ,                                       z                               21                                      ,                            ⋯                             ,                                       z                                           n                                  1                                                 }                            ,                            m                            i                            n                            {                                       z                               12                                      ,                                       z                               22                                      ,                            ⋯                             ,                                       z                                           n                                  2                                                 }                            ,                            ⋯                             ,                            m                            i                            n                            {                                       z                                           1                                  m                                                 ,                                       z                                           2                                  m                                                 ,                            ⋯                             ,                                       z                                           n                                  m                                                 }                            )                                  Z^-=(min\{z_{11},z_{21},\cdots,z_{n1}\},min\{z_{12},z_{22},\cdots,z_{n2}\},\cdots,min\{z_{1m},z_{2m},\cdots,z_{nm}\})                     Z−=(min{z11​,z21​,⋯,zn1​},min{z12​,z22​,⋯,zn2​},⋯,min{z1m​,z2m​,⋯,znm​})
定义第i (i=1,2,…,n) 个评价对象与最大值的距离:
                                                    D                               i                               +                                      =                                                                ∑                                                   j                                        =                                        1                                                  m                                              (                                               Z                                     j                                     +                                              −                                               z                                                   i                                        j                                                                        )                                     2                                                                   D_i^+=\sqrt{\sum_{j=1}^m(Z_j^+-z_{ij})^2}                     Di+​=j=1∑m​(Zj+​−zij​)2             ​
定义第i (i=1,2,…,n) 个评价对象与最小值的距离:
                                                    D                               i                               −                                      =                                                                ∑                                                   j                                        =                                        1                                                  m                                              (                                               Z                                     j                                     −                                              −                                               z                                                   i                                        j                                                                        )                                     2                                                                   D_i^-=\sqrt{\sum_{j=1}^m(Z_j^--z_{ij})^2}                     Di−​=j=1∑m​(Zj−​−zij​)2             ​
那么,我们可以计算得出第 i( i=1,2,…,n) 个评价对象未归一化的得分:
                                                    S                               i                                      =                                                   D                                  i                                  −                                                                   D                                     i                                     +                                              +                                               D                                     i                                     −                                                                   S_i=\frac{D_i^-}{D_i^++D_i^-}                     Si​=Di+​+Di−​Di−​​
很显着 0≤Si≤1,且 Si 越大 Di+ 越小,即越接近最大值。
我们可以将得分归一化并换成百分制:
                                                                S                                  i                                          ~                                      =                                                   S                                  i                                                                   ∑                                                   i                                        =                                        1                                                  n                                                           S                                     i                                                             ×                            100                                  \widetilde{S_{\mathrm{i}}}=\frac{S_{\mathrm{i}}}{\sum_{i=1}^{n}S_{\mathrm{i}}}\times100                     Si​             ​=∑i=1n​Si​Si​​×100
4.4 python代码实现

  1. import numpy as np
  2. # 从用户输入参评数目和指标数目
  3. print("请输入参评数目:")
  4. n = int(input())
  5. print("请输入指标数目:")
  6. m = int(input())
  7. # 接受用户输入的类型矩阵
  8. print("请输入类型矩阵:1. 极大型 2. 极小型 3. 中间型 4.区间型")
  9. kind = input().split(" ")
  10. # 接受用户输入的矩阵并转化为向量
  11. print("请输入矩阵:")
  12. A = np.zeros(shape=(n, m))
  13. for i in range(n):
  14.     A[i] = input().split(" ")
  15.     A[i] = list(map(float, A[i]))
  16. print("输入矩阵为:\n{}".format(A))
  17. # 极小型指标转化为极大型指标的函数
  18. def minTomax(maxx, x):
  19.     x = list(x)
  20.     ans = [[(maxx-e) for e in x]]
  21.     return np.array(ans)
  22. # 中间型指标转化为极大型指标的函数
  23. def midTomax(bestx, x):
  24.     x = list(x)
  25.     h = [abs(e-bestx) for e in x]
  26.     M = max(h)
  27.     if M == 0:
  28.         M = 1  # 防止最大差值为0的情况
  29.     ans = [[1-(e/M) for e in h]]
  30.     return np.array(ans)
  31. # 区间型指标转化为极大型指标的函数
  32. def regTomax(lowx, highx, x):
  33.     x = list(x)
  34.     M = max(lowx-min(x), max(x)-highx)
  35.     if M == 0:
  36.         M = 1  # 防止最大差值为0的情况
  37.     ans = []
  38.     for i in range(len(x)):
  39.         if x[i] < lowx:
  40.             ans.append(1-(lowx-x[i])/M)
  41.         elif x[i] > highx:
  42.             ans.append(1-(x[i]-highx)/M)
  43.         else:
  44.             ans.append(1)
  45.     return np.array([ans])
  46. # 同一指标类型,将所有指标转化为极大型指标
  47. X = np.zeros(shape=(n, 1))
  48. for i in range(m):
  49.     if kind[i] == "1":
  50.         v = np.array(A[:, i])
  51.     elif kind[i] == "2":
  52.         maxA = max(A[:, i])
  53.         v = minTomax(maxA, A[:, i])
  54.     elif kind[i] == "3":
  55.         print("类型三,请输入最优值:")
  56.         bestA = eval(input())
  57.         v = midTomax(bestA, A[:, i])
  58.     elif kind[i] == "4":
  59.         print("类型四,请输入区间[a,b]值a:")
  60.         lowA = eval(input())
  61.         print("类型四,请输入区间[a,b]值b:")
  62.         highA = eval(input())
  63.         v = regTomax(lowA, highA, A[:, i])
  64.     if i == 0:
  65.         X = v.reshape(-1, 1)  # 如果是第一个指标,直接赋值
  66.     else:
  67.         X = np.hstack((X, v.reshape(-1, 1)))  # 如果不是第一个指标,横向拼接
  68. print("统一指标后矩阵为:\n{}".format(X))
  69. # 对统一指标后的矩阵进行标准化处理
  70. X = X.astype(float)  # 将X转化为浮点型
  71. for i in range(m):
  72.     X[:, i] = X[:, i]/np.sqrt(sum(X[:, i]**2))  # 对每一列进行归一化处理,即除以该列的欧几里得范数
  73. print("标准化后矩阵为:\n{}".format(X))
  74. # 最大值和最小值距离的计算
  75. x_max = np.max(X, axis=0)  # 计算每一列的最大值
  76. x_min = np.min(X, axis=0)  # 计算每一列的最小值
  77. # 计算每一个参评对象与最优情况的距离d+
  78. d_z = np.sqrt(np.sum(np.square(X-np.tile(x_max, (n, 1))), axis=1))
  79. # 计算每一个参评对象与最差情况的距离d-
  80. d_f = np.sqrt(np.sum(np.square(X-np.tile(x_min, (n, 1))), axis=1))
  81. print("每个指标的最大值为:{}".format(x_max))
  82. print("每个指标的最小值为:{}".format(x_min))
  83. # 计算每一个参评对象的综合得分
  84. s = d_f/(d_f+d_z)  # 根据d+和d-计算每一个参评对象的得分,其中s接近1表示越好,接近0表示越差
  85. Score = 100*s/sum(s)  # 将得分转换为百分制
  86. for i in range(n):
  87.     print(f"第{i+1}个参评对象的得分为:{Score[i]}")
复制代码
输入:
  1. 请输入参评数目:
  2. 3
  3. 请输入指标数目:
  4. 4
  5. 请输入类型矩阵:1. 极大型 2. 极小型 3. 中间型 4.区间型
  6. 1 2 3 4
  7. 请输入矩阵:
  8. 9 10 175 120
  9. 8 7 164 80
  10. 6 3 157 90
  11. 输入矩阵为:
  12. [[  9.  10. 175. 120.]
  13. [  8.   7. 164.  80.]
  14. [  6.   3. 157.  90.]]
  15. 类型三,请输入最优值:
  16. 165
  17. 类型四,请输入区间[a,b]值a:
  18. 90
  19. 类型四,请输入区间[a,b]值b:
  20. 100
复制代码
输出:
  1. 统一指标后矩阵为:
  2. [[9.  0.  0.  0. ]
  3. [8.  3.  0.9 0.5]
  4. [6.  7.  0.2 1. ]]
  5. 标准化后矩阵为:
  6. [[0.66896473 0.         0.         0.        ]
  7. [0.59463532 0.3939193  0.97618706 0.4472136 ]
  8. [0.44597649 0.91914503 0.21693046 0.89442719]]
  9. 每个指标的最大值为:[0.66896473 0.91914503 0.97618706 0.89442719]
  10. 每个指标的最小值为:[0.44597649 0.         0.         0.        ]
  11. 第1个参评对象的得分为:8.886366735657832
  12. 第2个参评对象的得分为:45.653341055701134
  13. 第3个参评对象的得分为:45.46029220864103
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表