1. 项目概述:从“拍脑袋”到“算距离”的决策革命
在数学建模和综合评价领域,我们常常面临一个经典难题:手头有一堆方案,每个方案都有一堆指标,有的指标越大越好(比如利润、效率),有的指标越小越好(比如成本、污染)。怎么才能科学、客观地给这些方案排个座次,选出最优的那个?过去很多决策依赖专家经验“拍脑袋”,或者简单加权平均,但前者主观性强,后者忽略了数据本身的分布和相对优劣。这时,TOPSIS法(Technique for Order Preference by Similarity to Ideal Solution,优劣解距离法)就闪亮登场了。它就像一个公正的裁判,不看你方案出身,只看你与“理想中最好方案”和“理想中最差方案”的距离,谁离“好”的更近,离“坏”的更远,谁就是赢家。这个方法自上世纪80年代被提出以来,因其概念清晰、计算简便、结果直观,迅速成为管理科学、系统工程、经济分析等领域最受欢迎的多属性决策方法之一。无论是大学生数学建模竞赛中解决城市评价、投资选择问题,还是企业里评估供应商、投资项目,甚至是科研中评价不同模型的性能,TOPSIS都提供了强有力的工具。它本质上是一种逼近理想解的排序方法,核心思想就是“优中选优”,通过数学计算将主观判断客观化,让决策过程有据可依。
2. TOPSIS法的核心原理与思想拆解
2.1 理想解与负理想解:设定评价的“天花板”和“地板”
要理解TOPSIS,首先要搞清楚两个核心概念:理想解(Positive Ideal Solution, PIS)和负理想解(Negative Ideal Solution, NIS),也有人称之为最优解和最劣解。
你可以把所有的备选方案(比如5个待评估的城市)想象成多维空间里的一些点,每个维度代表一个评价指标(如GDP、绿化率、PM2.5浓度、房价等)。理想解,就是这个多维空间中的一个“虚拟最优点”。它在每一个指标上的取值,都是所有备选方案在该指标上的最优值。对于效益型指标(越大越好),最优值就是最大值;对于成本型指标(越小越好),最优值就是最小值。这个点代表了理论上可能达到的“完美状态”,是所有方案努力靠近的标杆。
相反,负理想解则是这个空间中的“虚拟最差点”。它在每个指标上的取值,都是所有备选方案在该指标上的最劣值(效益型取最小值,成本型取最大值)。这个点代表了理论上最糟糕的情况,是所有方案希望远离的“雷区”。
TOPSIS认为,一个真正好的方案,应该同时满足两个条件:离理想解尽可能近,离负理想解尽可能远。这比单纯看离“好”的有多近更全面。想象一下赛跑,光跑得快(靠近终点)还不够,还得离起跑线足够远(远离起点),才能说明你领先优势大。
2.2 欧氏距离:衡量“远近”的尺子
定义了“天花板”和“地板”后,我们需要一把尺子来测量每个方案到这两个点的距离。TOPSIS默认使用的是欧几里得距离(Euclidean Distance),也就是我们最直观的“直线距离”。
在一个n维指标空间中,假设方案A的坐标是 (x₁, x₂, ..., xₙ),理想解PIS的坐标是 (x₁*, x₂*, ..., xₙ*),那么方案A到理想解的距离Dᵢ⁺计算公式为:Dᵢ⁺ = sqrt[ (x₁ - x₁*)² + (x₂ - x₂*)² + ... + (xₙ - xₙ*)² ]同理,到负理想解的距离Dᵢ⁻计算公式为:Dᵢ⁻ = sqrt[ (x₁ - x₁⁻)² + (x₂ - x₂⁻)² + ... + (xₙ - xₙ⁻)² ]其中 (x₁⁻, x₂⁻, ..., xₙ⁻) 是负理想解的坐标。
注意:这里使用的是经过标准化(或归一化)处理后的指标值,目的是消除不同指标量纲(单位)和数量级的影响。比如GDP是万亿级,绿化率是百分比,直接计算距离没有意义。
2.3 相对贴近度:最终的“得分”
计算出每个方案到理想解和负理想解的距离后,我们并不能直接比较Dᵢ⁺或Dᵢ⁻的大小来排序,因为一个方案可能离理想解近,但离负理想解也近。我们需要一个综合的度量。
TOPSIS引入了一个核心指标:相对贴近度Cᵢ。它的计算公式是:Cᵢ = Dᵢ⁻ / (Dᵢ⁺ + Dᵢ⁻)其中,0 ≤ Cᵢ ≤ 1。
这个公式的几何意义非常巧妙:
- 当一个方案就是理想解本身时,Dᵢ⁺ = 0, Dᵢ⁻ > 0, 则 Cᵢ = 1。
- 当一个方案就是负理想解本身时,Dᵢ⁻ = 0, Dᵢ⁺ > 0, 则 Cᵢ = 0。
- 对于其他方案,Cᵢ值越接近1,说明该方案离理想解越近,同时离负理想解越远,综合表现越好。
- Cᵢ值越接近0,则说明该方案表现越差。
最终,我们只需要对所有方案的Cᵢ值从大到小排序,就能得到方案的优劣次序。Cᵢ值最高者,即为最优方案。
3. TOPSIS法的标准计算步骤详解
理解了原理,我们来看如何一步步实现TOPSIS。整个过程可以分解为六个清晰的步骤,我们用一个简单的例子贯穿说明:假设要评估4个城市(A, B, C, D)的宜居性,指标为:人均GDP(万元,效益型)、房价收入比(成本型)、空气质量优良天数(天,效益型)。
原始决策矩阵X:
| 城市 | 人均GDP (x₁) | 房价收入比 (x₂) | 空气质量天数 (x₃) |
|---|---|---|---|
| A | 15 | 12 | 300 |
| B | 20 | 18 | 280 |
| C | 10 | 9 | 320 |
| D | 18 | 15 | 290 |
3.1 步骤一:构建原始决策矩阵并同趋势化
首先,将m个方案(城市)和n个指标(评价维度)的数据整理成m行n列的矩阵X。然后进行同趋势化,即将所有指标统一为“越大越好”的效益型。对于成本型指标(如房价收入比),常用的处理方法是取倒数或做减法转换。
这里我们对房价收入比(成本型)取倒数,使其变为“比值越小越好”转为“倒数越大越好”。 处理后的矩阵X‘:
| 城市 | 人均GDP | 1/房价收入比 | 空气质量天数 |
|---|---|---|---|
| A | 15 | 1/12≈0.0833 | 300 |
| B | 20 | 1/18≈0.0556 | 280 |
| C | 10 | 1/9≈0.1111 | 320 |
| D | 18 | 1/15≈0.0667 | 290 |
实操心得:同趋势化时,取倒数法简单,但若原数据有0值会出问题。另一种更稳健的方法是“减法转换”:对于成本型指标,用该指标的最大值减去每个原始值,这样转换后的新值也是效益型。例如,房价收入比最大为18,则城市A的新值=18-12=6,也是越大越好。
3.2 步骤二:数据标准化(归一化)
这是关键一步,目的是消除量纲影响。最常用的是向量归一化法(Vector Normalization)。对于矩阵X‘中的每一个元素xᵢⱼ(第i个方案的第j个指标值),其标准化值zᵢⱼ计算公式为:zᵢⱼ = xᵢⱼ / sqrt( Σᵢ (xᵢⱼ)² )即,每个元素除以其所在列所有元素的平方和的平方根。
以“人均GDP”列为例: 平方和 = 15² + 20² + 10² + 18² = 225 + 400 + 100 + 324 = 1049 开方 = sqrt(1049) ≈ 32.388 则城市A在该指标的标准化值 = 15 / 32.388 ≈ 0.463
对所有指标计算后,得到标准化矩阵Z。
计算后的标准化矩阵Z(近似值):
| 城市 | 人均GDP (z₁) | 1/房价比 (z₂) | 空气质量 (z₃) |
|---|---|---|---|
| A | 0.463 | 0.514 | 0.505 |
| B | 0.617 | 0.343 | 0.471 |
| C | 0.309 | 0.685 | 0.539 |
| D | 0.556 | 0.412 | 0.488 |
注意事项:标准化方法不止一种。除了向量归一化,还有极差归一化(Min-Max Scaling)、Z-score标准化等。向量归一化的优点是处理后各方案在同一指标下的平方和为1,几何意义明确,在TOPSIS中最为常用。选择哪种方法需要根据数据特性和问题背景决定,但在同一份分析中必须统一。
3.3 步骤三:构建加权标准化决策矩阵
不同的指标重要性不同。我们需要为每个指标赋予权重wⱼ(满足Σwⱼ=1),得到加权标准化矩阵V。vᵢⱼ = wⱼ * zᵢⱼ
假设我们通过专家打分或熵权法(后面会讲)确定三个指标的权重为:人均GDP: 0.4, 1/房价比: 0.3, 空气质量: 0.3。 则城市A的加权计算: v₁₁(人均GDP) = 0.4 * 0.463 = 0.1852 v₁₂(1/房价比) = 0.3 * 0.514 = 0.1542 v₁₃(空气质量) = 0.3 * 0.505 = 0.1515
加权标准化矩阵V(近似值):
| 城市 | 加权人均GDP | 加权1/房价比 | 加权空气质量 |
|---|---|---|---|
| A | 0.1852 | 0.1542 | 0.1515 |
| B | 0.2468 | 0.1029 | 0.1413 |
| C | 0.1236 | 0.2055 | 0.1617 |
| D | 0.2224 | 0.1236 | 0.1464 |
3.4 步骤四:确定理想解与负理想解
根据加权矩阵V,找出每个指标列上的最优值和最劣值。
- 理想解 V⁺:由每列的最大值构成。V⁺ = [ max(v₁), max(v₂), max(v₃) ] = [0.2468, 0.2055, 0.1617]
- 负理想解 V⁻:由每列的最小值构成。V⁻ = [ min(v₁), min(v₂), min(v₃) ] = [0.1236, 0.1029, 0.1413]
3.5 步骤五:计算各方案到理想解与负理想解的距离
使用欧氏距离公式。到理想解的距离 Dᵢ⁺: D_A⁺ = sqrt[ (0.1852-0.2468)² + (0.1542-0.2055)² + (0.1515-0.1617)² ] = sqrt(0.00379 + 0.00263 + 0.00010) ≈ sqrt(0.00652) ≈ 0.0807 同理计算: D_B⁺ = sqrt[ (0.2468-0.2468)² + (0.1029-0.2055)² + (0.1413-0.1617)² ] ≈ 0.1051 D_C⁺ = sqrt[ (0.1236-0.2468)² + (0.2055-0.2055)² + (0.1617-0.1617)² ] ≈ 0.1232 D_D⁺ = sqrt[ (0.2224-0.2468)² + (0.1236-0.2055)² + (0.1464-0.1617)² ] ≈ 0.0860
到负理想解的距离 Dᵢ⁻: D_A⁻ = sqrt[ (0.1852-0.1236)² + (0.1542-0.1029)² + (0.1515-0.1413)² ] ≈ 0.0813 D_B⁻ = sqrt[ (0.2468-0.1236)² + (0.1029-0.1029)² + (0.1413-0.1413)² ] ≈ 0.1232 D_C⁻ = sqrt[ (0.1236-0.1236)² + (0.2055-0.1029)² + (0.1617-0.1413)² ] ≈ 0.1051 D_D⁻ = sqrt[ (0.2224-0.1236)² + (0.1236-0.1029)² + (0.1464-0.1413)² ] ≈ 0.0991
3.6 步骤六:计算相对贴近度并排序
计算每个城市的相对贴近度 Cᵢ = Dᵢ⁻ / (Dᵢ⁺ + Dᵢ⁻) C_A = 0.0813 / (0.0807 + 0.0813) ≈ 0.502 C_B = 0.1232 / (0.1051 + 0.1232) ≈ 0.540 C_C = 0.1051 / (0.1232 + 0.1051) ≈ 0.460 C_D = 0.0991 / (0.0860 + 0.0991) ≈ 0.535
排序结果:C_B (0.540) > C_D (0.535) > C_A (0.502) > C_C (0.460) 因此,城市B的综合宜居性最好,其次是D、A,最差是C。
4. 权重确定:从主观赋权到客观的熵权法
在第三步中,我们假设了权重。但权重的确定本身就是一门学问,直接影响了结果的公正性。常见方法有主观赋权法(如AHP层次分析法、专家打分)和客观赋权法。这里重点介绍与TOPSIS堪称“黄金搭档”的熵权法。
熵权法的核心思想是:某个指标的数据差异越大,其包含的信息量就越大,在评价中应赋予更大的权重。如果所有方案在某个指标上得分几乎一样,那么这个指标对区分方案优劣的帮助就很小,权重应该降低。
4.1 熵权法计算步骤
假设我们有标准化后的矩阵Z(来自TOPSIS第二步,未加权)。
1. 计算比重pᵢⱼ:pᵢⱼ = zᵢⱼ / Σᵢ zᵢⱼ(对于第j列指标)
2. 计算第j项指标的熵值eⱼ:eⱼ = -k * Σᵢ [ pᵢⱼ * ln(pᵢⱼ) ]其中,k = 1 / ln(m), m为方案数,保证 0 ≤ eⱼ ≤ 1。
3. 计算差异系数gⱼ:gⱼ = 1 - eⱼ熵值eⱼ越小,差异系数gⱼ越大,说明该指标提供的信息量越大。
4. 计算权重wⱼ:wⱼ = gⱼ / Σⱼ gⱼ
实操心得:熵权法是完全基于数据自身波动性的客观赋权法,排除了人为主观干扰,特别适合数据充足、对权重确定缺乏先验知识的场景。但它也有局限:如果某项指标对所有方案都极其重要(但数据差异小),熵权法可能会给它很低的权重,这与实际认知不符。因此,在实际建模中,常采用“主客观结合”的方法,例如用AHP确定主观权重,用熵权法确定客观权重,再进行组合。
5. TOPSIS法的Python代码实现与解析
理论讲透了,我们来看如何用代码实现。这里提供一份清晰、注释完整的Python实现,涵盖标准TOPSIS和熵权法TOPSIS。
import numpy as np import pandas as pd def topsis(data, weight=None, benefit_columns=None): """ TOPSIS综合评价方法 :param data: DataFrame或二维数组,原始决策矩阵,行为方案,列为指标 :param weight: 一维数组,各指标权重。若为None,则使用等权重。 :param benefit_columns: list of bool或int,指示每列是否为效益型(True/1)或成本型(False/0)。 若为None,则默认所有列为效益型。 :return: 包含相对贴近度C和排序结果的DataFrame """ # 转换为numpy数组便于计算 X = np.array(data, dtype=float) m, n = X.shape # m个方案,n个指标 # 1. 同趋势化(成本型转效益型) if benefit_columns is None: benefit_columns = [True] * n # 确保benefit_columns是布尔列表 benefit_columns = np.array(benefit_columns, dtype=bool) # 对于成本型指标,采用减法转换:用最大值减去原值 for j in range(n): if not benefit_columns[j]: # 如果是成本型指标 max_val = np.max(X[:, j]) X[:, j] = max_val - X[:, j] # 此时X中所有指标都已转为效益型(越大越好) # 2. 数据标准化(向量归一化) norm_X = X / np.sqrt(np.sum(X ** 2, axis=0)) # 3. 确定权重 if weight is None: weight = np.ones(n) / n # 等权重 weight = np.array(weight, dtype=float) if weight.sum() != 1: weight = weight / weight.sum() # 归一化权重 # 构建加权标准化矩阵 weighted_norm_X = norm_X * weight # 4. 确定理想解和负理想解 ideal_best = np.max(weighted_norm_X, axis=0) # 理想解 ideal_worst = np.min(weighted_norm_X, axis=0) # 负理想解 # 5. 计算距离 # 到理想解的距离 dist_best = np.sqrt(np.sum((weighted_norm_X - ideal_best) ** 2, axis=1)) # 到负理想解的距离 dist_worst = np.sqrt(np.sum((weighted_norm_X - ideal_worst) ** 2, axis=1)) # 6. 计算相对贴近度 C = dist_worst / (dist_best + dist_worst) # 构建结果DataFrame result_df = pd.DataFrame({ '方案': [f'方案{i+1}' for i in range(m)], 'D+ (到理想解距离)': dist_best, 'D- (到负理想解距离)': dist_worst, '相对贴近度C': C, '排名': (-C).argsort().argsort() + 1 # 巧妙获取排名 }) result_df = result_df.sort_values('相对贴近度C', ascending=False).reset_index(drop=True) return result_df, weighted_norm_X, ideal_best, ideal_worst def entropy_weight(data): """ 熵权法计算指标权重 :param data: DataFrame或二维数组,原始决策矩阵(需为效益型同趋势) :return: 权重数组 """ X = np.array(data, dtype=float) m, n = X.shape # 1. 标准化(这里采用比重法,即每个值除以其列和) # 为避免0值导致对数计算错误,进行微小平移 X = X + 1e-10 P = X / np.sum(X, axis=0) # 2. 计算熵值 k = 1 / np.log(m) E = -k * np.sum(P * np.log(P), axis=0) # 3. 计算差异系数和权重 G = 1 - E W = G / np.sum(G) return W # ========== 示例:使用上文城市数据 ========== if __name__ == '__main__': # 原始数据 data = pd.DataFrame({ '人均GDP': [15, 20, 10, 18], '房价收入比': [12, 18, 9, 15], # 成本型 '空气质量天数': [300, 280, 320, 290] }, index=['城市A', '城市B', '城市C', '城市D']) print("原始数据:") print(data) print("\n" + "="*50) # 方法1:使用等权重,并指定成本型指标列(第二列) result_df1, _, _, _ = topsis(data, weight=None, benefit_columns=[True, False, True]) print("等权重TOPSIS结果:") print(result_df1) print("\n" + "="*50) # 方法2:先使用熵权法确定权重 # 注意:熵权法输入数据需为同趋势化后的效益型数据 # 我们先手动将成本型指标(房价收入比)转换为效益型(取倒数) data_for_entropy = data.copy() data_for_entropy['房价收入比'] = 1 / data_for_entropy['房价收入比'] weights = entropy_weight(data_for_entropy) print(f"熵权法计算得到的权重:{weights}") # 使用熵权法权重进行TOPSIS评价 result_df2, _, _, _ = topsis(data, weight=weights, benefit_columns=[True, False, True]) print("\n熵权法-TOPSIS结果:") print(result_df2)这段代码提供了完整的TOPSIS流程和熵权法实现。topsis函数是核心,它处理了同趋势化、标准化、加权、距离计算和排序。entropy_weight函数则独立实现了熵权法。在示例中,我们对比了等权重和熵权法权重下的不同结果,这在实际分析中非常有用,可以观察权重对最终排序的敏感性。
6. 数学建模实战:TOPSIS的典型应用场景与论文写作要点
TOPSIS在数学建模竞赛中应用极其广泛,几乎任何涉及多指标综合评价的问题都可以考虑它。
6.1 典型应用场景
- 综合评价类问题:如城市综合实力排名、企业竞争力评估、医院绩效评价、大学排行榜等。你需要构建包含经济、社会、环境等多维度的指标体系。
- 方案优选类问题:如投资方案选择、供应商选择、项目选址、产品设计方案优选等。每个方案对应一组属性指标。
- 资源分配类问题:结合其他方法,如先用TOPSIS对受评对象排序,再按排序结果分配资源。
- 动态评价:如果数据是时间序列,可以对每一年数据分别进行TOPSIS评价,再观察各对象排名随时间的变化趋势。
6.2 建模论文中TOPSIS部分的写作要点
在数学建模论文中,不能只扔出一个公式和结果,必须清晰地展示过程。
- 问题重述与指标构建:明确评价目标,阐述为什么选择TOPSIS方法。最关键的是指标体系的构建,要说明每个指标的含义、选取理由、以及是效益型还是成本型。这部分需要文献支撑和逻辑论证。
- 数据来源与预处理:说明数据来源(如统计年鉴、数据库、调查问卷),并对缺失值、异常值进行处理。明确写出同趋势化的方法(如“对成本型指标采用倒数法处理”)。
- 方法原理简述:用你自己的话简要描述TOPSIS的原理和步骤,引用关键公式。不必大段抄教科书,突出核心思想即可。
- 权重的确定:这是体现模型深度的关键。如果使用熵权法,需要写出计算过程(比重、熵值、差异系数、权重)。如果使用AHP等主观法,需要展示判断矩阵、一致性检验过程。最好能对比不同赋权方法的结果,进行稳健性分析。
- 计算过程与结果:可以给出关键中间结果(如标准化矩阵、理想解、距离值)的表格。最终结果(相对贴近度C和排名)必须清晰呈现。
- 结果分析与检验:
- 排序结果分析:为什么A排第一?结合其原始指标数据解释。
- 灵敏度分析:微调某个指标的权重,观察排名是否发生剧烈变化。如果变化大,说明模型对该指标权重敏感,结论需谨慎。
- 方法对比:可以将TOPSIS结果与简单加权平均法、灰色关联分析法等其他评价方法的结果进行对比,讨论差异及原因,体现模型的优越性。
- 模型优缺点评价:客观评价TOPSIS在本问题中的应用。优点如原理简单、计算方便、结果直观。缺点如对原始数据分布敏感、权重依赖性强、无法处理指标间相关性等。
避坑技巧:在论文中,切忌只调用工具箱(如MATLAB的
topsis函数)而不展示过程。评委希望看到你对方法的理解和应用能力。即使调用函数,也要在附录给出核心代码,并解释关键参数。对于熵权法,要特别注意处理标准化后可能出现的0值(代码中加了微小偏移1e-10),并在论文中说明。
7. 常见问题、误区与进阶讨论
7.1 指标相关性问题
TOPSIS的一个潜在假设是各评价指标相互独立。但如果指标间存在较强相关性(如“科研经费”和“论文数量”),信息会被重复计算,导致权重失真,影响评价结果公正性。
解决方法:
- 主观剔除:在构建指标体系时,利用专业知识或因子分析,剔除信息重叠严重的指标。
- 采用马氏距离:用马氏距离(Mahalanobis Distance)替代欧氏距离。马氏距离考虑了指标间的协方差结构,能消除相关性影响。计算公式为:
D = sqrt( (x - μ)' * Σ⁻¹ * (x - μ) ),其中Σ是协方差矩阵。但计算更复杂,且需要方案数大于指标数以保证协方差矩阵可逆。 - 结合主成分分析(PCA):先对原始指标进行PCA降维,得到几个互不相关的主成分,再用主成分得分进行TOPSIS评价。这是处理高维相关数据的有效手段。
7.2 权重敏感性与稳健性分析
权重对TOPSIS结果影响巨大。只说“采用熵权法”是不够的。
如何进行稳健性分析?
- 权重扰动法:将某个关键指标的权重在合理范围内变动(如±10%),观察排名顺序是否改变。如果排名稳定,说明模型稳健;如果轻微变动导致排名翻转,则需在结论中说明该不确定性。
- 多方法赋权对比:分别使用熵权法、AHP、专家打分法、均方差法确定权重,然后分别进行TOPSIS评价。比较不同权重体系下的排序结果。如果几种方法得出的最优方案一致,那么结论就非常可靠。
7.3 数据标准化方法的选择
我们一直用的是向量归一化。但还有其他选择:
- 极差归一化(Min-Max):
zᵢⱼ = (xᵢⱼ - minⱼ) / (maxⱼ - minⱼ)。将数据缩放到[0,1]区间,直观,但受极端值影响大。 - Z-score标准化:
zᵢⱼ = (xᵢⱼ - meanⱼ) / stdⱼ。处理后数据均值为0,标准差为1。适用于数据近似正态分布的情况。
个人经验:在数学建模中,如果没有特殊要求,向量归一化是TOPSIS的标准搭配,因为其几何意义(保持向量模长)与欧氏距离计算最契合。如果数据存在极端值,可以考虑使用极差归一化,但要在论文中说明选择理由。可以在灵敏度分析部分,尝试不同的标准化方法,看结果是否稳健。
7.4 TOPSIS的变体与扩展
- 模糊TOPSIS:当指标值难以用精确数字表示,而是用语言变量(如“好、中、差”)或模糊数表示时,可以使用模糊TOPSIS。它将三角模糊数或梯形模糊数引入计算过程。
- 灰色关联TOPSIS:结合灰色关联分析的思想,用灰色关联度替代欧氏距离来计算贴近度,适用于“小样本、贫信息”的不确定系统。
- 组合评价:TOPSIS很少单独使用,常与AHP(定权重)、熵权法(定权重)、灰色预测(处理时序数据)、DEA(效率评价)等方法组合,形成更强大的模型框架。
7.5 一个容易忽略的细节:理想解和负理想解的“虚拟性”
很多初学者会问:计算出的理想解和负理想解,在现实中可能不存在(没有一个方案在所有指标上都是最优/最劣),这样评价还有意义吗?非常有意义。这正是TOPSIS的巧妙之处。它设立的是一个绝对的、理论上的参照系。评价的不是方案与某个具体“榜样”的差距,而是与“绝对完美”和“绝对糟糕”的差距。这就像跳高比赛,衡量成绩的不是你超过了多少其他选手,而是你离地面的绝对高度。这使得评价标准统一且绝对。
最后,再分享一个在编程实现时的小技巧:在计算相对贴近度C时,分母是D+和D-的和。务必确保分母不为零。虽然在理论上,只有当某个方案同时是理想解和负理想解时才会出现(这几乎不可能),但在数值计算中,由于浮点数精度问题,两个距离可能同时非常接近零。一个稳健的做法是给分母加上一个极小的常数,如C = D- / (D+ + D- + 1e-10),可以避免除零错误,且对结果影响微乎其微。这个方法在编写通用性强的TOPSIS函数时非常实用。