TOPSIS(Technique for Order Preference by Similarity to Ideal Solution )简介与简单示例

前言

提醒:

文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。

其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
内容由AI辅助生成,仅经笔者审核整理,请甄别食用。

文章目录


TOPSIS方法:多准则决策的几何解析

TOPSIS(Technique for Order Preference by Similarity to Ideal Solution )由Yoon和Hwang于1981年提出,是经典多准则决策(MCDM)方法。其核心逻辑是:将决策问题映射到 n n n维空间( n n n为准则数量 ),通过计算方案与"正理想解""负理想解"的距离,筛选最接近正理想解、最远离负理想解的方案,实现复杂决策的量化排序。

一、核心步骤与公式(附变量解释)

1. 输入定义
  • 决策矩阵 :设方案数为 m m m、准则数为 n n n,原始矩阵记为 X = ( x i j ) m × n \mathbf{X} = (x_{ij}){m \times n} X=(xij)m×n。其中 x i j x{ij} xij表示第 i i i个方案第 j j j个准则下的原始值(如"方案1的成本值" )。
  • 准则权重 :记为 W = ( w 1 , w 2 , ... , w n ) \mathbf{W} = (w_1, w_2, \dots, w_n) W=(w1,w2,...,wn),满足 ∑ j = 1 n w j = 1 \sum_{j=1}^n w_j = 1 ∑j=1nwj=1。 w j w_j wj表示第 j j j个准则的重要性(如"成本准则权重0.3,说明成本占30%决策权重" )。
2. 步骤1:归一化决策矩阵(消除量纲)

通过向量归一化 统一量纲,公式:
x ˉ i j = x i j ∑ i = 1 m x i j 2 \bar{x}{ij} = \frac{x{ij}}{\sqrt{\sum_{i=1}^m x_{ij}^2}} xˉij=∑i=1mxij2 xij

  • 变量: x ˉ i j \bar{x}_{ij} xˉij是第 i i i个方案第 j j j个准则 下的归一化值,输出区间 [ 0 , 1 ] [0,1] [0,1],解决不同准则单位差异问题(如"成本(元)"与"效率(件/时)"无法直接比较 )。
3. 步骤2:加权归一化(融合准则权重)

结合准则权重调整归一化值,公式:
V i j = x ˉ i j × w j V_{ij} = \bar{x}_{ij} \times w_j Vij=xˉij×wj

  • 变量: V i j V_{ij} Vij是第 i i i个方案第 j j j个准则下的加权归一化值,体现"准则重要性对方案表现的放大/缩小"(如"高权重准则的方案值,对决策结果影响更强" )。
4. 步骤3:确定理想解(正/负)
  • 正理想解 A + A^+ A+ :各准则的最优值,公式:
    A j + = { max ⁡ i V i j (准则 j 为最大化目标,如"利润") min ⁡ i V i j (准则 j 为最小化目标,如"成本") A_j^+ = \begin{cases} \max_i V_{ij} & \text{(准则 } j \text{ 为最大化目标,如"利润")} \\ \min_i V_{ij} & \text{(准则 } j \text{ 为最小化目标,如"成本")} \end{cases} Aj+={maxiVijminiVij(准则 j 为最大化目标,如"利润")(准则 j 为最小化目标,如"成本")

    • 变量: A j + A_j^+ Aj+是第 j j j个准则下的"最优表现"(如"所有方案中成本最低值" )。
  • 负理想解 A − A^- A− :各准则的最劣值,与正理想解相反,公式:
    A j − = { min ⁡ i V i j (准则 j 为最大化目标) max ⁡ i V i j (准则 j 为最小化目标) A_j^- = \begin{cases} \min_i V_{ij} & \text{(准则 } j \text{ 为最大化目标)} \\ \max_i V_{ij} & \text{(准则 } j \text{ 为最小化目标)} \end{cases} Aj−={miniVijmaxiVij(准则 j 为最大化目标)(准则 j 为最小化目标)

    • 变量: A j − A_j^- Aj−是第 j j j个准则下的"最劣表现"(如"所有方案中成本最高值" )。
5. 步骤4:计算距离(理想解的远近)
  • 到正理想解的距离 d i + d_i^+ di+
    d i + = ∑ j = 1 n ( V i j − A j + ) 2 d_i^+ = \sqrt{\sum_{j=1}^n (V_{ij} - A_j^+)^2} di+=j=1∑n(Vij−Aj+)2

    • 变量: d i + d_i^+ di+是第 i i i个方案到正理想解的欧氏距离,距离越大,方案离"最优表现"越远。
  • 到负理想解的距离 d i − d_i^- di−
    d i − = ∑ j = 1 n ( V i j − A j − ) 2 d_i^- = \sqrt{\sum_{j=1}^n (V_{ij} - A_j^-)^2} di−=j=1∑n(Vij−Aj−)2

    • 变量: d i − d_i^- di−是第 i i i个方案到负理想解的欧氏距离,距离越大,方案离"最劣表现"越远。
6. 步骤5:计算贴近度(方案优劣排序)

贴近度反映方案与正理想解的相对接近程度,公式:
C i = d i − d i + + d i − C_i = \frac{d_i^-}{d_i^+ + d_i^-} Ci=di++di−di−

  • 变量: C i ∈ [ 0 , 1 ] C_i \in [0,1] Ci∈[0,1],值越大表示第 i i i个方案 越接近正理想解、越远离负理想解,方案越优。最终按 C i C_i Ci降序排序,确定方案优先级。

二、关键特点与优势

  1. 几何直观性 :将决策映射到 n n n维空间,用"距离理想解的远近"排序,逻辑清晰(如二维场景可类比平面上点与"最优/最劣点"的距离比较 )。
  2. 混合准则支持 :兼容最大化、最小化目标(仅需在确定 A + A^+ A+、 A − A^- A−时区分准则类型 ),覆盖"利润最大化+成本最小化"等复杂场景。
  3. 计算简洁性:基于欧氏距离和加权归一化,流程明确,手工或编程均可快速实现。

三、示例解析(简化场景:2方案×2准则)

假设场景:2个方案(桂林、黄山 )、2个准则(景色:最大化,权重0.6;费用:最小化,权重0.4 ),原始矩阵 X = [ 9 7 8 6 ] \mathbf{X} = \begin{bmatrix} 9 & 7 \\ 8 & 6 \end{bmatrix} X=[9876](桂林:景色9、费用7;黄山:景色8、费用6 )。

1. 归一化(消除量纲)

x ˉ 11 = 9 9 2 + 8 2 ≈ 0.676 , x ˉ 12 = 7 7 2 + 6 2 ≈ 0.714 x ˉ 21 = 8 9 2 + 8 2 ≈ 0.606 , x ˉ 22 = 6 7 2 + 6 2 ≈ 0.618 \bar{x}{11} = \frac{9}{\sqrt{9^2+8^2}} \approx 0.676,\ \bar{x}{12} = \frac{7}{\sqrt{7^2+6^2}} \approx 0.714 \\ \bar{x}{21} = \frac{8}{\sqrt{9^2+8^2}} \approx 0.606,\ \bar{x}{22} = \frac{6}{\sqrt{7^2+6^2}} \approx 0.618 xˉ11=92+82 9≈0.676, xˉ12=72+62 7≈0.714xˉ21=92+82 8≈0.606, xˉ22=72+62 6≈0.618

2. 加权归一化(融合权重)

V 11 = 0.676 × 0.6 ≈ 0.406 , V 12 = 0.714 × 0.4 ≈ 0.286 V 21 = 0.606 × 0.6 ≈ 0.364 , V 22 = 0.618 × 0.4 ≈ 0.247 V_{11} = 0.676×0.6 \approx 0.406,\ V_{12} = 0.714×0.4 \approx 0.286 \\ V_{21} = 0.606×0.6 \approx 0.364,\ V_{22} = 0.618×0.4 \approx 0.247 V11=0.676×0.6≈0.406, V12=0.714×0.4≈0.286V21=0.606×0.6≈0.364, V22=0.618×0.4≈0.247

3. 确定理想解
  • 景色(最大化): A 1 + = 0.406 A_1^+ = 0.406 A1+=0.406(桂林)、 A 1 − = 0.364 A_1^- = 0.364 A1−=0.364(黄山)
  • 费用(最小化): A 2 + = 0.247 A_2^+ = 0.247 A2+=0.247(黄山)、 A 2 − = 0.286 A_2^- = 0.286 A2−=0.286(桂林)
4. 计算距离与贴近度
  • 桂林: d 1 + ≈ 0.039 d_1^+ \approx 0.039 d1+≈0.039(到正理想解距离)、 d 1 − ≈ 0.042 d_1^- \approx 0.042 d1−≈0.042(到负理想解距离), C 1 ≈ 0.518 C_1 \approx 0.518 C1≈0.518
  • 黄山: d 2 + ≈ 0.042 d_2^+ \approx 0.042 d2+≈0.042(到正理想解距离)、 d 2 − ≈ 0.039 d_2^- \approx 0.039 d2−≈0.039(到负理想解距离), C 2 ≈ 0.482 C_2 \approx 0.482 C2≈0.482
5. 排序结论

因 C 1 > C 2 C_1 > C_2 C1>C2,桂林更接近正理想解,为更优方案。

四、方法对比与适用场景

方法 核心逻辑 适用场景 局限性
TOPSIS 距离理想解的相对接近度 数据分布均匀、混合准则场景 对异常值敏感
VIKOR 妥协解(平衡群体效用与遗憾) 需多方协商的复杂决策 计算稍复杂
AHP 成对比较确定权重 权重确定阶段 主观依赖强
COPRAS 区分准则类型的相对显著性 成本敏感型决策 最小化准则影响突出

五、总结

TOPSIS 以几何直观性、混合准则兼容性、计算简洁性 为核心优势,适合工程评估、项目优选等场景。其本质是将定性决策转化为"距离比较"的定量问题,通过 C i C_i Ci实现方案排序。需注意:若数据存在异常值(如极端大/小值 ),需预处理(如离群值修正 ),否则可能影响结果可靠性。

简单示例

下面是一个使用TOPSIS优化方法的MATLAB实现,包含完整计算流程和可视化功能。这个示例解决了一个经典的"供应商选择"问题,通过TOPSIS方法在多个准则下对备选方案进行排序和选择。

matlab 复制代码
%% TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)优化方法示例
clear; clc; close all;

%% 1. 定义问题数据
% 备选方案(供应商)
alternatives = {'供应商A', '供应商B', '供应商C', '供应商D', '供应商E'};
num_alternatives = length(alternatives);

% 评价准则
criteria = {'价格', '质量', '交货期', '服务水平', '环保性'};
num_criteria = length(criteria);

% 准则权重(可通过AHP等方法确定)
weights = [0.25, 0.20, 0.15, 0.20, 0.20];

% 决策矩阵(方案在各准则下的表现)
% 注:"价格"为最小化准则,其余为最大化准则
decision_matrix = [
    80, 7, 9, 8, 7;    % 供应商A
    90, 8, 7, 9, 8;    % 供应商B
    70, 9, 6, 7, 9;    % 供应商C
    60, 6, 8, 6, 6;    % 供应商D
    85, 7, 10, 8, 8;   % 供应商E
];

% 标记准则类型(1=最大化,0=最小化)
criteria_type = [0, 1, 1, 1, 1];

%% 2. TOPSIS计算流程
% 步骤1:归一化决策矩阵(向量归一化)
normalized_matrix = zeros(size(decision_matrix));
for j = 1:num_criteria
    if criteria_type(j) == 1  % 最大化准则
        normalized_matrix(:,j) = decision_matrix(:,j) / norm(decision_matrix(:,j));
    else  % 最小化准则
        normalized_matrix(:,j) = min(decision_matrix(:,j)) ./ decision_matrix(:,j);
        normalized_matrix(:,j) = normalized_matrix(:,j) / norm(normalized_matrix(:,j));
    end
end

% 步骤2:加权归一化矩阵
weighted_matrix = normalized_matrix .* repmat(weights, num_alternatives, 1);

% 步骤3:确定正理想解和负理想解
positive_ideal = zeros(1, num_criteria);
negative_ideal = zeros(1, num_criteria);
for j = 1:num_criteria
    if criteria_type(j) == 1  % 最大化准则
        positive_ideal(j) = max(weighted_matrix(:,j));
        negative_ideal(j) = min(weighted_matrix(:,j));
    else  % 最小化准则
        positive_ideal(j) = min(weighted_matrix(:,j));
        negative_ideal(j) = max(weighted_matrix(:,j));
    end
end

% 步骤4:计算到正理想解和负理想解的距离
d_plus = zeros(num_alternatives, 1);
d_minus = zeros(num_alternatives, 1);
for i = 1:num_alternatives
    d_plus(i) = norm(weighted_matrix(i,:) - positive_ideal);
    d_minus(i) = norm(weighted_matrix(i,:) - negative_ideal);
end

% 步骤5:计算相对贴近度
relative_closeness = d_minus ./ (d_plus + d_minus);

% 步骤6:排序
[closeness_sorted, sort_idx] = sort(relative_closeness, 'descend');

%% 3. 可视化结果
% 3.1 决策矩阵热图
figure('Position', [100, 100, 1000, 800]);
subplot(2, 2, 1);
imagesc(decision_matrix);
title('原始决策矩阵');
xlabel('准则');
ylabel('方案');
set(gca, 'XTick', 1:num_criteria, 'XTickLabel', criteria);
set(gca, 'YTick', 1:num_alternatives, 'YTickLabel', alternatives);
colorbar;
for i = 1:num_alternatives
    for j = 1:num_criteria
        text(j, i, num2str(decision_matrix(i,j)), 'HorizontalAlignment', 'center', 'FontSize', 10);
    end
end

% 3.2 准则权重饼图
subplot(2, 2, 2);
pie(weights, criteria);
title('准则权重分布');

% 3.3 距离和贴近度对比图
subplot(2, 2, 3);
bar_width = 0.25;
x = 1:num_alternatives;
bar(x - bar_width, d_plus, bar_width, 'r', 'DisplayName', '到正理想解的距离');
hold on;
bar(x, d_minus, bar_width, 'g', 'DisplayName', '到负理想解的距离');
bar(x + bar_width, relative_closeness, bar_width, 'b', 'DisplayName', '相对贴近度');
hold off;
title('距离和贴近度对比');
xlabel('方案');
ylabel('值');
set(gca, 'XTick', 1:num_alternatives, 'XTickLabel', alternatives);
legend;
grid on;

% 3.4 TOPSIS排序结果
subplot(2, 2, 4);
barh(1:num_alternatives, closeness_sorted);
title('TOPSIS排序结果');
xlabel('相对贴近度 (越大越好)');
ylabel('方案 (按排名)');
set(gca, 'YTick', 1:num_alternatives, 'YTickLabel', alternatives(sort_idx));
grid on;

% 添加标签显示具体贴近度值
for i = 1:num_alternatives
    text(closeness_sorted(i)+0.01, i, sprintf('%.4f', closeness_sorted(i)), 'HorizontalAlignment', 'left', 'VerticalAlignment', 'middle');
end

%% 4. 输出结果
fprintf('\n===== TOPSIS优化结果汇总 =====\n');
fprintf('\n1. 准则权重:\n');
for i = 1:num_criteria
    fprintf('   %s: %.2f\n', criteria{i}, weights(i));
end

fprintf('\n2. 各方案评估结果:\n');
fprintf('   方案\t\t正理想解距离\t负理想解距离\t相对贴近度\n');
for i = 1:num_alternatives
    fprintf('   %s\t%.4f\t\t%.4f\t\t%.4f\n', alternatives{i}, d_plus(i), d_minus(i), relative_closeness(i));
end

fprintf('\n3. TOPSIS推荐排序:\n');
for i = 1:num_alternatives
    fprintf('   第%d名: %s (贴近度: %.4f)\n', i, alternatives{sort_idx(i)}, closeness_sorted(i));
end

代码说明:

  1. 问题定义

    • 5个备选方案(供应商A-E)
    • 5个评价准则:价格、质量、交货期、服务水平、环保性
    • 准则权重:通过专家判断或AHP方法预先确定
    • 准则类型:"价格"为最小化准则,其余为最大化准则
  2. TOPSIS计算流程

    • 归一化处理:针对不同类型准则采用不同归一化方法
    • 加权处理:结合准则权重调整归一化后的决策矩阵
    • 确定理想解:分别计算正理想解和负理想解
    • 计算距离:计算各方案到正理想解和负理想解的欧氏距离
    • 计算相对贴近度:综合距离指标得到最终评分
    • 排序:按相对贴近度降序排列
  3. 可视化功能

    • 决策矩阵热图:直观展示原始数据
    • 准则权重饼图:显示各准则重要性分布
    • 距离和贴近度对比图:横向比较各方案在不同指标下的表现
    • TOPSIS排序结果:按相对贴近度从高到低展示
  4. 结果输出

    • 详细列出各方案的距离指标和相对贴近度
    • 给出推荐排序结果

运行结果

相关推荐
风象南1 天前
Claude Code这个隐藏技能,让我告别PPT焦虑
人工智能·后端
Mintopia1 天前
OpenClaw 对软件行业产生的影响
人工智能
陈广亮1 天前
构建具有长期记忆的 AI Agent:从设计模式到生产实践
人工智能
会写代码的柯基犬1 天前
DeepSeek vs Kimi vs Qwen —— AI 生成俄罗斯方块代码效果横评
人工智能·llm
Mintopia1 天前
OpenClaw 是什么?为什么节后热度如此之高?
人工智能
爱可生开源社区1 天前
DBA 的未来?八位行业先锋的年度圆桌讨论
人工智能·dba
叁两1 天前
用opencode打造全自动公众号写作流水线,AI 代笔太香了!
前端·人工智能·agent
前端付豪1 天前
LangChain记忆:通过Memory记住上次的对话细节
人工智能·python·langchain
strayCat232551 天前
Clawdbot 源码解读 7: 扩展机制
人工智能·开源