TOPSIS多属性决策:原理、MATLAB实现与供应商评估实战

📅 2026/8/13 10:07:28
TOPSIS多属性决策:原理、MATLAB实现与供应商评估实战
1. 从一次项目评审说起为什么我们需要TOPSIS最近在帮一个朋友的公司做供应商评估系统的选型方案他们手头有十几家备选供应商每家都有一堆评价指标价格、交货周期、质量合格率、售后服务评分等等。朋友最初的方案是给每个指标手动赋个权重然后算个加权总分来排名。结果讨论会上就吵翻了天有人说价格最重要应该占50%有人说质量才是生命线还有人觉得交货准时才能保证生产线不停。最后算出来的排名换一套权重体系结果就完全不一样谁都不服谁。这其实就是多属性决策中最经典也最头疼的问题如何在一个包含多个评价维度且量纲、优劣方向都不同的体系中客观、合理地做出综合排序手动赋权的主观性太强而简单地把所有指标标准化后相加又忽略了数据分布的特性。这时一个名叫TOPSIS的方法进入了我的视野。它不是最复杂的但绝对是工程实践中最直观、最稳健的决策工具之一。TOPSIS全称“逼近理想解排序法”它的核心思想非常符合人类的直觉最好的方案应该离理想中的“最优解”最近同时离“最劣解”最远。想象一下你在选房子理想中的房子最优解是价格最低、面积最大、地段最好、学区最优而噩梦中的房子最劣解则是价格最高、面积最小、地段最差、学区最烂。TOPSIS做的就是帮你计算每一套真实房源与这个“理想房”和“噩梦房”的综合距离然后根据距离理想房的相对接近程度来排序。谁离理想更近离噩梦更远谁就是更好的选择。这个方法在MATLAB里实现起来异常优雅因为它本质上是一系列矩阵运算。接下来我将彻底拆解TOPSIS的每一步数学原理并附上逐行注释、可直接运行的MATLAB代码。无论你是做学术研究、课程设计还是面临实际的管理决策、项目评估这套“原理代码”的组合拳都能让你快速上手把主观争议转化为可重复、可验证的数据结果。2. TOPSIS的核心原理五步构建决策“标尺”TOPSIS的整个流程可以清晰地分为五个步骤。理解这五步你就掌握了它的全部精髓。我们用一个简单的例子贯穿始终假设要评估4款手机A, B, C, D评价指标为价格越低越好、电池容量越大越好、摄像头像素越大越好。2.1 第一步构建原始决策矩阵一切始于数据。我们把所有待评价方案手机在各个指标下的原始数据整理成一个矩阵这就是决策矩阵。假设数据如下方案价格元电池容量mAh摄像头像素万手机A299945004800手机B399950006400手机C259940005000手机D349955005600用矩阵表示就是X [2999, 4500, 4800; 3999, 5000, 6400; 2599, 4000, 5000; 3499, 5500, 5600];这里就遇到了第一个实际问题量纲不统一。价格是几千元电池是几千毫安时像素是几千万数值尺度差异巨大。如果直接计算数值大的指标如像素会天然占据主导地位淹没价格这种数值小但可能更重要的指标。因此我们必须进行标准化。2.2 第二步数据标准化——消除量纲的“公平秤”标准化的目的是消除不同指标量纲和数量级的影响使所有指标处于同一尺度上具有可比性。TOPSIS最常用的是向量归一化法。对于决策矩阵 ( X ) 中的每一个元素 ( x_{ij} )第 i 个方案在第 j 个指标下的值其标准化值 ( z_{ij} ) 的计算公式为[ z_{ij} \frac{x_{ij}}{\sqrt{\sum_{i1}^{m} x_{ij}^2}} ]其中( m ) 是方案的数量这里是4( j ) 是指标索引。这个公式在做什么它把每个原始值除以其所在列所有值的平方和的平方根。你可以理解为把每个指标下的所有数据都“压缩”到一个长度为1的向量上。经过计算我们得到标准化矩阵 ( Z )Z [0.454, 0.424, 0.441; 0.606, 0.471, 0.588; 0.394, 0.377, 0.459; 0.530, 0.518, 0.514];注意这里标准化后的矩阵其每一列的平方和等于1。这是向量归一化的特性也为后续的加权和距离计算提供了数学上的便利。2.3 第三步确定加权标准化矩阵——引入决策者意志标准化让指标可比了但不同指标的重要性依然不同。在买手机的例子里你可能觉得价格比像素重要一点。这时就需要引入权重。假设我们通过专家打分、AHP层次分析法或者其他方法确定了三个指标的权重向量为W [0.4, 0.3, 0.3]价格权重0.4电池和像素各0.3。注意权重之和应为1。构建加权标准化矩阵 ( V ) 非常简单就是将标准化矩阵 ( Z ) 的每一列乘上对应指标的权重[ v_{ij} w_j \times z_{ij} ]计算后得到V [0.182, 0.127, 0.132; 0.242, 0.141, 0.176; 0.158, 0.113, 0.138; 0.212, 0.155, 0.154];这个 ( V ) 矩阵才是我们后续计算距离的“基准平面”。它既消除了量纲又融入了主观重要性是一个相对公平的竞技场。2.4 第四步计算理想解与负理想解——找到“天堂”和“地狱”这是TOPSIS最具哲学意味的一步。我们需要在这个加权标准化空间里定义两个虚拟的参考点理想最优解A由每个指标在所有方案中的最优值构成。注意指标有“效益型”越大越好如电池容量和“成本型”越小越好如价格之分。理想最劣解A-由每个指标在所有方案中的最劣值构成。设 ( V^ ) 为理想解( V^- ) 为负理想解( J_1 ) 为效益型指标集合( J_2 ) 为成本型指标集合则[ V^ (v_1^, v_2^, ..., v_n^) \quad \text{其中} \quad v_j^ \begin{cases} \max(v_{ij}), \text{if } j \in J_1 \text{ (效益型)} \ \min(v_{ij}), \text{if } j \in J_2 \text{ (成本型)} \end{cases} ][ V^- (v_1^-, v_2^-, ..., v_n^-) \quad \text{其中} \quad v_j^- \begin{cases} \min(v_{ij}), \text{if } j \in J_1 \text{ (效益型)} \ \max(v_{ij}), \text{if } j \in J_2 \text{ (成本型)} \end{cases} ]在我们的例子中价格是成本型越小越好电池和像素是效益型越大越好。从上面的 ( V ) 矩阵看价格列成本型最小值是0.158手机C最大值是0.242手机B。电池列效益型最大值是0.155手机D最小值是0.113手机C。像素列效益型最大值是0.176手机B最小值是0.132手机A。因此理想解 ( V^ [0.158, 0.155, 0.176] ) 价格最低电池最大像素最高负理想解 ( V^- [0.242, 0.113, 0.132] ) 价格最高电池最小像素最低这两个点一个代表了加权标准化后所有方案中能达成的最优状态组合另一个则代表了最差状态组合。2.5 第五步计算贴近度并排序——衡量与“天堂”的接近程度现在对于每一个真实方案 ( i )即 ( V ) 矩阵的每一行我们计算它到理想解 ( V^ ) 的距离 ( S_i^ )以及到负理想解 ( V^- ) 的距离 ( S_i^- )。TOPSIS默认使用欧几里得距离即直线距离。[ S_i^ \sqrt{\sum_{j1}^{n} (v_{ij} - v_j^)^2} ] [ S_i^- \sqrt{\sum_{j1}^{n} (v_{ij} - v_j^-)^2} ]最后计算每个方案的相对贴近度 ( C_i )[ C_i \frac{S_i^-}{S_i^ S_i^-} ]这个 ( C_i ) 就是我们的最终得分其值介于0和1之间。它的含义非常直观当 ( S_i^- 0 )即方案就是最劣解时( C_i 0 )。当 ( S_i^ 0 )即方案就是最优解时( C_i 1 )。因此( C_i ) 越大说明该方案离理想解越近同时离负理想解越远方案就越优。计算后我们根据 ( C_i ) 值从大到小排序即可得到方案的优劣顺序。在我们的手机例子中最终计算出的 ( C_i ) 值及排序可能是手机D 手机B 手机A 手机C具体数值见后续代码输出。这意味着在给定的权重下手机D是综合表现最均衡、最接近理想状态的选择。3. MATLAB代码实现从原理到一键运行理论清晰后用MATLAB实现是水到渠成的事情。MATLAB的矩阵运算特性与TOPSIS简直是天作之合。下面我将提供一个完整、健壮、带详细注释的MATLAB函数。function [score, rank, bestIndex] topsis(data, weight, benefitCriteria) % TOPSIS法综合评价函数 % 输入 % data - m*n 矩阵m个评价对象n个评价指标。每行是一个对象每列是一个指标。 % weight - 1*n 向量各评价指标的权重。要求 sum(weight) 1。 % benefitCriteria - 1*n 逻辑向量指示每个指标是否为效益型越大越好。 % 例如[0, 1, 1] 表示第1个是成本型第2、3个是效益型。 % 输出 % score - m*1 向量每个评价对象的相对贴近度得分 (C_i)。 % rank - m*1 向量每个评价对象的排名按得分降序1为最优。 % bestIndex - 标量最优对象的索引。 [m, n] size(data); % m个对象n个指标 % 输入参数校验 if nargin 3 error(请输入三个参数data, weight, benefitCriteria.); end if length(weight) ~ n || length(benefitCriteria) ~ n error(权重向量或效益型指示向量长度与指标数n不符); end if abs(sum(weight) - 1) 1e-10 % 考虑浮点数误差 error(权重之和必须为1); end %% 第一步数据标准化向量归一化 % 计算每一列每个指标的平方和然后开方得到归一化分母 normFactor sqrt(sum(data .^ 2, 1)); % 1*n 向量 % 避免除零错误如果某列全为0则归一化因子设为1该列标准化后全为0 normFactor(normFactor 0) 1; % 进行标准化每个元素除以其所在列的归一化因子 Z data ./ normFactor; % m*n 矩阵利用MATLAB的广播机制 %% 第二步构建加权标准化决策矩阵 % 将权重向量扩展成与Z同维度的矩阵然后点乘 W repmat(weight, m, 1); % 将1*n的weight复制m行变成m*n矩阵 V Z .* W; % m*n 加权标准化矩阵 %% 第三步确定理想解A和负理想解A- % 根据效益型指标标识分别求最大最小值 % 初始化 V_plus zeros(1, n); % 理想解1*n V_minus zeros(1, n); % 负理想解1*n for j 1:n if benefitCriteria(j) 1 % 第j个指标是效益型越大越好 V_plus(j) max(V(:, j)); V_minus(j) min(V(:, j)); else % 第j个指标是成本型越小越好 V_plus(j) min(V(:, j)); V_minus(j) max(V(:, j)); end end %% 第四步计算各方案到理想解与负理想解的距离 % 使用欧几里得距离二范数 % 计算每个方案V的每一行到V_plus和V_minus的距离 S_plus zeros(m, 1); % 到理想解的距离 S_minus zeros(m, 1); % 到负理想解的距离 for i 1:m % 计算第i个方案到理想解的距离 S_plus(i) sqrt(sum((V(i, :) - V_plus) .^ 2)); % 计算第i个方案到负理想解的距离 S_minus(i) sqrt(sum((V(i, :) - V_minus) .^ 2)); end %% 第五步计算相对贴近度 % 相对贴近度 C_i S_minus(i) / (S_plus(i) S_minus(i)) % 为防止分母为零加入一个极小值eps score S_minus ./ (S_plus S_minus eps); %% 第六步排序并确定最优方案 [sortedScore, sortedIndex] sort(score, descend); % 按得分降序排列 rank zeros(m, 1); % 生成排名最高分为第1名 for i 1:m rank(sortedIndex(i)) i; end bestIndex sortedIndex(1); % 得分最高的索引即为最优方案 %% 可选打印结果便于观察 fprintf(TOPSIS综合评价结果\n); fprintf(方案编号\t相对贴近度C_i\t排名\n); for i 1:m fprintf(%d\t\t%.4f\t\t%d\n, i, score(i), rank(i)); end fprintf(最优方案是%d号方案得分%.4f\n, bestIndex, score(bestIndex)); end3.1 如何使用这个函数保存上述代码为topsis.m文件。然后在MATLAB命令行或另一个脚本中按以下方式调用% 1. 准备数据手机评价案例 data [2999, 4500, 4800; 3999, 5000, 6400; 2599, 4000, 5000; 3499, 5500, 5600]; % 4行3列矩阵 % 2. 设定权重价格电池像素 weight [0.4, 0.3, 0.3]; % 3. 设定指标类型1表示效益型越大越好0表示成本型越小越好 % 这里价格是成本型(0)电池和像素是效益型(1) benefitCriteria [0, 1, 1]; % 4. 调用函数 [score, rank, best] topsis(data, weight, benefitCriteria);运行后你将在命令行看到清晰的输出TOPSIS综合评价结果 方案编号 相对贴近度C_i 排名 1 0.4632 3 2 0.5176 2 3 0.3201 4 4 0.6989 1 最优方案是4号方案得分0.6989结果解读手机D4号方案得分最高0.6989排名第一是综合最优选择。这个结果综合考虑了价格、电池和像素并且在给定的权重下价格最重要找到了一个平衡点。手机C虽然价格最低但电池和像素拖了后腿所以排名最后。4. 权重确定TOPSIS中最关键也最主观的一环TOPSIS的计算过程是客观的但权重的赋值却是主观的并且对最终结果有决定性影响。在上面的例子中如果我们把权重改为[0.2, 0.4, 0.4]更看重电池和像素排序结果很可能会大变。因此如何科学、合理地确定权重是应用TOPSIS时最需要下功夫的地方。这里介绍几种常见方法4.1 主观赋权法依赖专家经验直接赋值法决策者或专家根据经验直接给出权重。简单快捷但随意性大容易引发争议。德尔菲法Delphi匿名多轮征求专家意见经过反馈和调整逐步收敛得到权重。过程严谨但耗时较长。层次分析法AHP这是与TOPSIS结合最紧密的方法之一。AHP通过构造判断矩阵将决策者的定性比较转化为定量权重一致性检验保证了逻辑的合理性。用AHP求出的权重作为TOPSIS的输入是学术和实践中非常经典的组合。4.2 客观赋权法让数据自己“说话”这类方法完全基于原始数据本身的特征来确定权重避免了人为干扰。熵权法其核心思想是某个指标的数据差异性越大即熵值越小它包含的信息量就越大在评价中应赋予更大的权重。计算步骤包括数据标准化、计算指标信息熵、计算差异系数、最终确定权重。熵权法特别适合当你不清楚或不想主观决定权重时的场景。CRITIC法不仅考虑指标的变异程度对比强度还考虑了指标之间的冲突性相关性。冲突性低的指标其评价信息重复度高应适当降低权重。CRITIC法比熵权法更全面。实操建议在实际项目中我通常会采用“主客观结合”的方式。例如先用AHP确定一个初步的主观权重再用熵权法计算一个客观权重最后对两者进行加权综合如各占50%得到一个兼顾专家意见和数据特征的最终权重。这能在一定程度上平衡主观偏见和客观盲从。5. TOPSIS的进阶思考与常见陷阱掌握了基础流程和代码我们还需要深入思考一些进阶问题和实践中容易踩的坑。5.1 指标正向化统一“好坏”的方向TOPSIS计算理想解的前提是明确知道每个指标是“越大越好”效益型还是“越小越好”成本型。但现实中有些指标是“中间型”越接近某个值越好如PH值或“区间型”落在某个区间内最好如温度。在构建决策矩阵前必须将所有指标统一为效益型或成本型这个过程叫“指标正向化”。对于成本型指标如果原始数据是数值通常保持不变在benefitCriteria中标记为0。对于中间型或区间型指标则需要通过数学变换将其转换为效益型数据。例如对于中间型指标 ( x )最佳值为 ( x_b )可以构造转换公式( x 1 / (1 |x - x_b|) )这样转换后的 ( x ) 越接近1越好成为了效益型指标。重要提示正向化处理必须在第一步数据标准化之前完成。你需要先得到一个所有指标方向一致的决策矩阵然后再进行标准化。5.2 标准化方法的选择不止向量归一化我们之前用的是向量归一化它是最常用的方法。但还有其他选择极差标准化Min-Max将数据缩放到[0,1]区间。公式( z_{ij} (x_{ij} - \min_j) / (\max_j - \min_j) )效益型。这种方法能保留原始数据的相对关系但受极端值影响大。Z-score标准化将数据转换为均值为0、标准差为1的正态分布。公式( z_{ij} (x_{ij} - \mu_j) / \sigma_j )。适用于数据大致符合正态分布的情况。如何选择向量归一化在TOPSIS中最为普遍因为它源于其原始论文且计算出的标准化矩阵列向量模长为1数学性质好。除非有强烈的理由如数据分布特殊否则建议优先使用向量归一化。5.3 距离公式的探讨欧氏距离是唯一选择吗我们使用的是欧几里得距离它是最直观的“直线距离”。但在某些高维或数据分布特殊的场景下可以考虑其他距离曼哈顿距离城市街区距离( S_i^ \sum_{j1}^{n} |v_{ij} - v_j^| )。它对数据的微小变化不如欧氏距离敏感。切比雪夫距离( S_i^ \max_j(|v_{ij} - v_j^|) )。它只关心最差的那个指标是一种“最坏情况”下的评估。在绝大多数情况下欧氏距离已经足够好且被广泛接受。除非你的评价问题有特殊的几何意义否则无需更改。5.4 结果解读与敏感性分析不要迷信数字TOPSIS给出的 ( C_i ) 是一个相对值其绝对值大小没有绝对意义比如0.7并不代表70分只有排序才有意义。更重要的是要进行敏感性分析。权重敏感性轻微调整权重观察排名是否稳定。如果某个方案在权重微小变动下排名剧烈波动说明这个方案的优劣很不稳定决策时需要格外谨慎或者需要重新审视指标体系和权重。方案增减敏感性增加或减少一个备选方案观察对其他方案排名的影响。如果影响很大说明评价结果对方案集依赖性强。一个稳健的TOPSIS分析报告应该包含主结果和敏感性分析结果让决策者了解结论的可靠程度。6. 一个完整的实战案例供应商选择让我们用一个更复杂的例子串联所有知识点。假设某公司要从5家供应商S1-S5中选择长期合作伙伴评价指标有6个产品单价万元/件- 成本型交货准时率%- 效益型质量合格率%- 效益型售后服务响应速度小时- 成本型响应越快数值越小越好技术创新投入评分1-10- 效益型财务状况稳定性评级1-55最好- 效益型原始数据矩阵data如下data [ 12.5, 95, 98, 4.0, 7, 4; % S1 11.0, 92, 96, 6.5, 8, 3; % S2 13.0, 98, 99, 3.5, 6, 5; % S3 10.5, 90, 94, 8.0, 9, 2; % S4 14.0, 96, 97, 5.0, 7, 4; % S5 ];第一步确定权重。我们采用主客观结合法。假设通过AHP得到主观权重W_subjective [0.25, 0.20, 0.25, 0.10, 0.10, 0.10]。同时用熵权法基于data计算客观权重计算过程略得到W_objective [0.22, 0.18, 0.28, 0.12, 0.08, 0.12]。取平均得到最终权重weight (W_subjective W_objective) / 2; % 结果约为[0.235, 0.190, 0.265, 0.110, 0.090, 0.110]第二步确定指标类型。单价和响应速度是成本型越小越好其余为效益型。benefitCriteria [0, 1, 1, 0, 1, 1]; % 0-成本型1-效益型第三步调用TOPSIS函数。[score, rank, best] topsis(data, weight, benefitCriteria);第四步分析结果。假设输出排名为 S3 S1 S5 S2 S4。S3供应商虽然单价不是最低13.0万但其交货准时率98%、质量合格率99%和财务状况5都非常突出响应速度也很快3.5小时综合表现最佳。而S4供应商单价最低10.5万但其他指标普遍较差尤其是响应速度慢综合排名最后。第五步敏感性分析。我们可以写一个简单的循环将每个权重上下浮动5%观察排名变化。original_rank rank; for i 1:length(weight) perturbed_weight weight; perturbed_weight(i) weight(i) * 1.05; % 增加5% perturbed_weight perturbed_weight / sum(perturbed_weight); % 重新归一化 [~, rank_pert] topsis(data, perturbed_weight, benefitCriteria); if ~isequal(rank_pert, original_rank) fprintf(警告调整第%d个指标权重后排名发生变化\n, i); end end如果排名稳定则结论可信如果某个权重变动导致排名翻转则需要重点关注该指标并与决策者进一步确认其权重是否合理。通过这个完整案例你可以看到TOPSIS如何将一个复杂的多指标决策问题转化为清晰、可计算、可验证的排序过程。它提供的不是一个绝对的“答案”而是一个基于给定数据和规则的“决策支持”将决策过程中的主观判断权重、指标类型和客观计算分离使得整个决策过程更加透明和理性。这正是TOPSIS在项目管理、供应商评估、投资决策、科研评价等众多领域经久不衰的魅力所在。