1. TOPSIS方法决策分析中的瑞士军刀第一次接触TOPSIS是在五年前的一个供应商评估项目上。当时手头有12家备选供应商每家都有7个不同的评估指标从价格到交货周期再到售后服务质量数据五花八门。正当我发愁如何科学决策时一位前辈推荐了TOPSIS方法从此它就成为了我工具箱里的常备武器。TOPSIS全称Technique for Order Preference by Similarity to Ideal Solution中文常称为优劣解距离法。它的核心思想非常直观在多个评价指标构成的数据空间里找到理论上的最优解所有指标都取最佳值和最差解所有指标都取最差值然后计算每个实际方案与这两个极端解的距离。最终那些离理想解更近、离最差解更远的方案就是我们的优选。举个例子假设我们要评估几款手机理想解可能是价格最低、内存最大、摄像头像素最高、电池容量最大最差解则是价格最高、内存最小、摄像头像素最低、电池容量最小TOPSIS的聪明之处在于它不要求所有指标都达到最优——这在现实中往往不可能——而是寻找各方面表现均衡、整体上最接近理想状态的方案。这种方法特别适合处理以下场景指标间存在冲突比如质量好往往价格高数据量纲不统一比如价格单位是元内存单位是GB需要快速对多个方案进行排序比较2. MATLAB环境准备与数据导入2.1 基础环境配置在开始TOPSIS分析前我们需要确保MATLAB环境准备就绪。我习惯在脚本开头添加这些初始化命令clc; clear; close all; % 清空工作区、命令窗口和图形窗口 format long g; % 设置数据显示格式 warning(off); % 关闭警告提示 rng(2023); % 固定随机数种子确保结果可复现这些命令能帮我们避免之前运行的变量或图形干扰当前分析。特别是rng设置随机种子对于需要随机生成数据的场景特别有用。2.2 数据导入与预处理TOPSIS分析的第一步是准备好数据矩阵。假设我们有以下四种设计方案需要评估每个方案有四个评价指标% 原始数据矩阵每行一个方案每列一个指标 raw_data [2 1 3 2; % 方案1 4 3 2 5; % 方案2 3 2 4 2; % 方案3 1 4 5 8]; % 方案4 % 指标权重需总和为1 weights [0.3, 0.4, 0.2, 0.1]; % 指标类型1表示效益型越大越好0表示成本型越小越好 cost_benefit [0, 1, 1, 1];在实际项目中数据通常来自Excel或数据库。我推荐使用MATLAB的readtable函数导入data_table readtable(evaluation_data.xlsx); raw_data table2array(data_table(:, 2:end)); % 假设第一列是方案名称 scheme_names data_table.Properties.VariableNames(2:end);3. TOPSIS核心算法实现3.1 数据标准化处理不同指标往往量纲差异很大。比如价格可能是几万元而满意度评分是1-5分。直接计算距离会导致量纲大的指标主导结果。我们需要先对数据进行标准化% 向量归一化 [n, m] size(raw_data); normalized_data raw_data ./ sqrt(sum(raw_data.^2, 1)); % 加权标准化 weighted_data normalized_data .* weights;这里采用的是向量归一化法它保持了各方案间的关系不变。对于有负值的数据可能需要先进行平移处理。3.2 确定理想解与负理想解根据每个指标的性质成本型或效益型我们确定最优和最劣解% 初始化 ideal_solution zeros(1, m); negative_ideal_solution zeros(1, m); for j 1:m if cost_benefit(j) 1 % 效益型指标 ideal_solution(j) max(weighted_data(:, j)); negative_ideal_solution(j) min(weighted_data(:, j)); else % 成本型指标 ideal_solution(j) min(weighted_data(:, j)); negative_ideal_solution(j) max(weighted_data(:, j)); end end3.3 距离计算与接近度计算每个方案到理想解和负理想解的欧氏距离% 计算距离 dist_to_ideal sqrt(sum((weighted_data - ideal_solution).^2, 2)); dist_to_negative sqrt(sum((weighted_data - negative_ideal_solution).^2, 2)); % 计算相对接近度 closeness dist_to_negative ./ (dist_to_ideal dist_to_negative); % 排序 [sorted_closeness, rank] sort(closeness, descend);4. 结果可视化与方案优化4.1 结果可视化展示让决策者直观理解结果至关重要。我常用以下可视化方式figure(Position, [100, 100, 800, 400]) % 接近度条形图 subplot(1,2,1) bar(closeness, FaceColor, [0.2 0.6 0.8]) title(各方案TOPSIS接近度) xlabel(方案编号) ylabel(接近度指数) set(gca, XTickLabel, {方案1,方案2,方案3,方案4}) ylim([0 1]) grid on % 雷达图展示各方案指标 subplot(1,2,2) radar_plot_data normalized_data; polarplot(radar_plot_data(:,1), r-o, LineWidth, 2) hold on polarplot(radar_plot_data(:,2), g--s, LineWidth, 2) polarplot(radar_plot_data(:,3), b-.d, LineWidth, 2) polarplot(radar_plot_data(:,4), m:*, LineWidth, 2) title(各方案指标对比) legend({方案1,方案2,方案3,方案4}, Location, southoutside)4.2 敏感性分析与权重优化TOPSIS结果对权重设置很敏感。我们可以进行敏感性分析% 权重敏感性分析 weight_range 0:0.05:1; sensitivity_results zeros(length(weight_range), n); for i 1:length(weight_range) test_weights [weight_range(i), 0.4, 0.3, 0.3-weight_range(i)]; test_weights test_weights / sum(test_weights); % 重复TOPSIS计算流程 % ...省略具体计算步骤 sensitivity_results(i, :) closeness; end figure plot(weight_range, sensitivity_results) xlabel(第一个指标权重变化) ylabel(各方案接近度) legend({方案1,方案2,方案3,方案4}) title(权重敏感性分析) grid on这个分析能帮我们理解权重变化如何影响最终排序为权重设置提供科学依据。