MATLAB实现垂直距离Topsis方法详解
Topsis(Technique for Order Preference by Similarity to Ideal Solution)是一种常用的多属性决策分析方法,其核心思想是寻找与理想解最接近、与负理想解最远的方案。垂直距离Topsis(Vertical Distance Topsis,VDTopsis)是Topsis方法的一个变种,它在计算方案与理想点和负理想点之间的距离时,考虑了决策矩阵的垂直方向上的信息,能够更精细地反映方案的优劣。
本文将详细介绍如何使用MATLAB实现垂直距离Topsis方法,并提供清晰的代码示例和操作步骤,帮助您掌握这一实用的决策分析工具。
1. VDTopsis 方法概述
VDTopsis 方法与传统Topsis方法在计算距离时的主要区别在于:
传统 Topsis: 计算的是方案与理想点/负理想点之间的欧氏距离。
VDTopsis: 在计算距离时,会考虑决策矩阵中各列(属性)的权重和贡献度,以及方案在垂直方向上的相对位置,从而得到更具区分度的距离度量。
VDTopsis 的基本步骤如下:
1. 构建决策矩阵: 收集所有待评估方案在各个评价指标上的数值。
2. 数据标准化: 由于不同指标的量纲和单位可能不同,需要对数据进行标准化处理,使其具有可比性。
3. 计算权重: 为每个评价指标赋予权重,反映其在决策过程中的重要程度。
4. 确定理想点和负理想点: 根据标准化后的矩阵和权重,确定最优值(理想点)和最劣值(负理想点)。
5. 计算方案与理想点/负理想点的垂直距离: 这是VDTopsis的核心步骤,会引入垂直距离的概念。
6. 计算相对接近度: 根据计算出的垂直距离,计算每个方案与理想点的相对接近度。
7. 方案排序: 根据相对接近度的高低对方案进行排序。
2. MATLAB 实现步骤与代码示例
下面我们将逐一介绍在MATLAB中实现VDTopsis方法的具体步骤,并提供详细的代码示例。
假设我们有以下一个简单的决策矩阵,需要评估三个方案(S1, S2, S3)在两个指标(C1, C2)上的表现:
| 方案 | C1 (越大越优) | C2 (越小越优) |
| : | : | : |
| S1 | 5 | 2 |
| S2 | 3 | 4 |
| S3 | 7 | 1 |
同时,我们假设两个指标的权重分别为 `w1 = 0.6` 和 `w2 = 0.4`。
步骤 1:构建决策矩阵
首先,在MATLAB中创建一个表示决策矩阵的变量。
```matlab
% 定义决策矩阵 (行是方案, 列是指标)
decision_matrix = [5, 2;
3, 4;
7, 1];
% 定义指标类型 (1表示越大越优, 0表示越小越优)
% 在这个例子中, C1越大越优, C2越小越优
indicator_types = [1, 0];
% 定义指标权重
weights = [0.6, 0.4];
```
步骤 2:数据标准化
为了消除不同指标量纲的影响,我们需要对数据进行标准化。常用的标准化方法有最大最小标准化、Zscore标准化等。这里我们采用最大最小标准化。
对于越大越优的指标: 标准化值 = (原始值 最小值) / (最大值 最小值)
对于越小越优的指标: 标准化值 = (最大值 原始值) / (最大值 最小值)
```matlab
% 获取矩阵的维度
[num_schemes, num_indicators] = size(decision_matrix);
% 初始化标准化矩阵
standardized_matrix = zeros(num_schemes, num_indicators);
% 进行数据标准化
for j = 1:num_indicators
col_data = decision_matrix(:, j); % 获取当前指标列数据
if indicator_types(j) == 1 % 越大越优
min_val = min(col_data);
max_val = max(col_data);
% 防止除以零,如果所有值都相同
if max_val min_val == 0
standardized_matrix(:, j) = 1; % 或者0,取决于你的处理逻辑
else
standardized_matrix(:, j) = (col_data min_val) / (max_val min_val);
end
elseif indicator_types(j) == 0 % 越小越优
min_val = min(col_data);
max_val = max(col_data);
% 防止除以零
if max_val min_val == 0
standardized_matrix(:, j) = 1; % 或者0,取决于你的处理逻辑
else
standardized_matrix(:, j) = (max_val col_data) / (max_val min_val);
end
end
end
disp('标准化矩阵:');
disp(standardized_matrix);
```
步骤 3:计算加权标准化矩阵
将标准化后的矩阵与对应的权重相乘,得到加权标准化矩阵。
```matlab
% 计算加权标准化矩阵
weighted_standardized_matrix = standardized_matrix . weights;
disp('加权标准化矩阵:');
disp(weighted_standardized_matrix);
```
步骤 4:确定理想点和负理想点
根据加权标准化矩阵,确定每列的最大值作为理想点(正理想点),最小值作为负理想点(负理想点)。
```matlab
% 确定正理想解 (A+) 和负理想解 (A)
positive_ideal_solution = max(weighted_standardized_matrix, [], 1);
negative_ideal_solution = min(weighted_standardized_matrix, [], 1);
disp('正理想解 (A+):');
disp(positive_ideal_solution);
disp('负理想解 (A):');
disp(negative_ideal_solution);
```
步骤 5:计算方案与理想点/负理想点的垂直距离
这是VDTopsis的核心所在。对于每个方案 $i$ 和每个指标 $j$,其与正理想点 $A^+$ 的垂直距离 $d_{i,j}^+$ 和与负理想点 $A^$ 的垂直距离 $d_{i,j}^$ 计算如下:
垂直距离到正理想点: $d_{i,j}^+ = |w_j cdot v_{ij} w_j cdot v_{j}^+| $
垂直距离到负理想点: $d_{i,j}^ = |w_j cdot v_{ij} w_j cdot v_{j}^| $
其中,$w_j$ 是指标 $j$ 的权重,$v_{ij}$ 是方案 $i$ 在指标 $j$ 上的标准化值,$v_{j}^+$ 是正理想点在指标 $j$ 上的值,$v_{j}^$ 是负理想点在指标 $j$ 上的值。
然后,将每个方案在所有指标上的垂直距离加权求和,得到方案与理想点和负理想点的总垂直距离。
```matlab
% 初始化用于存储垂直距离的矩阵
positive_vertical_distance_matrix = zeros(num_schemes, num_indicators);
negative_vertical_distance_matrix = zeros(num_schemes, num_indicators);
% 计算每个方案与正负理想点的垂直距离
for i = 1:num_schemes
for j = 1:num_indicators
% 垂直距离到正理想点
positive_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j));
% 垂直距离到负理想点
negative_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) negative_ideal_solution(j));
end
end
% 计算每个方案的总垂直距离到正理想点和负理想点
% VDTopsis 通常是将各指标的垂直距离加权求和
% 注意:这里的“垂直距离”概念在不同的VDTopsis文献中可能略有不同。
% 一种常见的解释是将标准化值与理想值的差值乘以权重。
% 如果您有特定的VDTopsis公式,请在此处进行调整。
% 以下示例是基于对“垂直距离”的一种常见理解的实现。
% 这里我们直接使用 weighted_standardized_matrix 与 ideal/negative_ideal_solution 的差值的绝对值
% 计算方案到正理想点的总垂直距离
total_positive_vertical_distance = sum(positive_vertical_distance_matrix, 2);
% 计算方案到负理想点的总垂直距离
total_negative_vertical_distance = sum(negative_vertical_distance_matrix, 2);
disp('方案到正理想点的垂直距离矩阵:');
disp(positive_vertical_distance_matrix);
disp('方案到负理想点的垂直距离矩阵:');
disp(negative_vertical_distance_matrix);
disp('每个方案到正理想点的总垂直距离:');
disp(total_positive_vertical_distance);
disp('每个方案到负理想点的总垂直距离:');
disp(total_negative_vertical_distance);
```
关于“垂直距离”的进一步解释:
在Topsis方法中,计算距离(通常是欧氏距离)的公式为:
$D_i^+ = sqrt{sum_{j=1}^n (w_j cdot v_{ij} w_j cdot v_j^+)^2}$
VDTopsis 的一个核心思想是,它不直接对距离进行平方和再开方,而是更关注指标层面的贡献和偏差。 在某些VDTopsis的定义中,它可能指的是:
1. 指标层面的加权偏差: $|w_j cdot v_{ij} w_j cdot v_j^+|$
2. 考虑垂直方向的投影: 这可能涉及到更复杂的几何解释,例如在权重空间中的投影。
在上面的MATLAB代码中,我们采用了方案在每个指标上加权后的标准化值与该指标的理想值(或负理想值)的绝对差值。这可以被理解为方案在每个指标方向上与理想状态的“垂直”偏差,并且这个偏差已经被其权重进行了调整。
如果您的VDTopsis方法有更具体的数学公式,请务必根据公式调整计算距离的部分。 例如,如果您的VDTopsis将指标权重直接加到距离计算中(如上面代码所示的 `abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j))`),那么这就是一个有效的实现。
步骤 6:计算相对接近度
相对接近度是衡量方案与理想解的接近程度的指标。在VDTopsis中,它通常根据方案到理想点的距离和到负理想点的距离来计算。一种常见的计算方式为:
$CI_i = frac{D_i^}{D_i^+ + D_i^}$
其中,$CI_i$ 是方案 $i$ 的相对接近度,$D_i^$ 是方案 $i$ 到负理想点的总垂直距离,$D_i^+$ 是方案 $i$ 到正理想点的总垂直距离。
```matlab
% 计算相对接近度 (CI)
% 防止分母为零的情况
relative_closeness = zeros(num_schemes, 1);
for i = 1:num_schemes
if (total_positive_vertical_distance(i) + total_negative_vertical_distance(i)) == 0
relative_closeness(i) = 0; % 或者一个特殊值,表示无法计算
else
relative_closeness(i) = total_negative_vertical_distance(i) / (total_positive_vertical_distance(i) + total_negative_vertical_distance(i));
end
end
disp('方案的相对接近度 (CI):');
disp(relative_closeness);
```
步骤 7:方案排序
根据计算出的相对接近度对方案进行排序。相对接近度越高的方案越优。
```matlab
% 对方案进行排序
% 将方案索引与相对接近度组合起来
scheme_scores = [ (1:num_schemes)', relative_closeness ];
% 按相对接近度降序排序 (分数越高越好)
sorted_schemes = sortrows(scheme_scores, 2, 'descend');
disp('方案排序结果 (方案索引, 相对接近度):');
disp(sorted_schemes);
fprintf('最优方案是方案 %d,其相对接近度为 %.4f。
', sorted_schemes(1, 1), sorted_schemes(1, 2));
```
3. 完整的MATLAB代码
将以上所有代码块整合在一起,就构成了一个完整的VDTopsis实现函数。
```matlab
function sorted_schemes = vertical_distance_topsis(decision_matrix, indicator_types, weights)
% vertical_distance_topsis: 使用垂直距离方法对方案进行排序
%
% 输入:
% decision_matrix: 决策矩阵 (行是方案, 列是指标)
% indicator_types: 指标类型向量 (1表示越大越优, 0表示越小越优)
% weights: 指标权重向量
%
% 输出:
% sorted_schemes: 排序后的方案结果 (包括方案索引和相对接近度,按降序排列)
[num_schemes, num_indicators] = size(decision_matrix);
% 步骤 2: 数据标准化
standardized_matrix = zeros(num_schemes, num_indicators);
for j = 1:num_indicators
col_data = decision_matrix(:, j);
if indicator_types(j) == 1 % 越大越优
min_val = min(col_data);
max_val = max(col_data);
if max_val min_val == 0
standardized_matrix(:, j) = 1;
else
standardized_matrix(:, j) = (col_data min_val) / (max_val min_val);
end
elseif indicator_types(j) == 0 % 越小越优
min_val = min(col_data);
max_val = max(col_data);
if max_val min_val == 0
standardized_matrix(:, j) = 1;
else
standardized_matrix(:, j) = (max_val col_data) / (max_val min_val);
end
end
end
% 步骤 3: 计算加权标准化矩阵
weighted_standardized_matrix = standardized_matrix . weights;
% 步骤 4: 确定理想点和负理想点
positive_ideal_solution = max(weighted_standardized_matrix, [], 1);
negative_ideal_solution = min(weighted_standardized_matrix, [], 1);
% 步骤 5: 计算方案与理想点/负理想点的垂直距离
positive_vertical_distance_matrix = zeros(num_schemes, num_indicators);
negative_vertical_distance_matrix = zeros(num_schemes, num_indicators);
for i = 1:num_schemes
for j = 1:num_indicators
% VDTopsis 的一个常见距离计算方式:加权标准化值与理想值的差的绝对值
positive_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) positive_ideal_solution(j));
negative_vertical_distance_matrix(i, j) = abs(weighted_standardized_matrix(i, j) negative_ideal_solution(j));
end
end
% 计算每个方案的总垂直距离
total_positive_vertical_distance = sum(positive_vertical_distance_matrix, 2);
total_negative_vertical_distance = sum(negative_vertical_distance_matrix, 2);
% 步骤 6: 计算相对接近度
relative_closeness = zeros(num_schemes, 1);
for i = 1:num_schemes
denominator = total_positive_vertical_distance(i) + total_negative_vertical_distance(i);
if denominator == 0
relative_closeness(i) = 0; % 避免除以零
else
relative_closeness(i) = total_negative_vertical_distance(i) / denominator;
end
end
% 步骤 7: 方案排序
scheme_scores = [ (1:num_schemes)', relative_closeness ];
sorted_schemes = sortrows(scheme_scores, 2, 'descend'); % 按相对接近度降序排列
% 输出结果展示 (可选,可在调用函数时自行打印)
disp(' VDTopsis 分析结果 ');
disp('标准化矩阵:');
disp(standardized_matrix);
disp('加权标准化矩阵:');
disp(weighted_standardized_matrix);
disp('正理想解 (A+):');
disp(positive_ideal_solution);
disp('负理想解 (A):');
disp(negative_ideal_solution);
disp('方案到正理想点的总垂直距离:');
disp(total_positive_vertical_distance);
disp('方案到负理想点的总垂直距离:');
disp(total_negative_vertical_distance);
disp('方案的相对接近度 (CI):');
disp(relative_closeness);
disp('方案排序结果 (方案索引, 相对接近度):');
disp(sorted_schemes);
fprintf('最优方案是方案 %d,其相对接近度为 %.4f。
', sorted_schemes(1, 1), sorted_schemes(1, 2));
disp('');
end % 函数结束
% 如何调用该函数
% 假设您将上面的代码保存为 'vertical_distance_topsis.m' 文件
% % 定义您的数据
% decision_matrix_data = [5, 2;
% 3, 4;
% 7, 1];
% indicator_types_data = [1, 0]; % C1越大越优, C2越小越优
% weights_data = [0.6, 0.4];
%
% % 调用函数进行分析
% sorted_results = vertical_distance_topsis(decision_matrix_data, indicator_types_data, weights_data);
%
% % sorted_results 变量将包含排序好的方案及其对应的相对接近度
```
4. 关键点和注意事项
VDTopsis 公式的变种: 需要强调的是,关于“垂直距离”在Topsis方法中的具体数学定义可能存在不同的版本。本文提供了一种基于加权差值的实现,这是一种常见且易于理解的解释。在实际应用中,请确保您使用的VDTopsis公式与您所参考的文献或标准一致。如果您有更具体的VDTopsis公式,请务必根据公式调整第 5 步中的距离计算方式。
数据标准化: 选择合适的标准化方法对于多属性决策至关重要。最大最小标准化是最常用的方法之一,但也可能受到异常值的影响。
指标权重: 指标权重的确定是决策过程中的关键环节。权重可以由专家主观确定,也可以通过客观赋权方法(如熵权法、CRITIC法等)计算得出。
处理极端情况: 在标准化过程中,如果某指标的所有值都相同(最大值等于最小值),则会出现除以零的情况。代码中对这种情况进行了简单的处理(赋予标准化值为1),但您可能需要根据具体场景调整处理逻辑。同样,在计算相对接近度时,也要注意分母为零的情况。
MATLAB 代码的可读性: 良好的代码注释和清晰的变量命名有助于理解和维护代码。
通过上述详细的步骤和代码示例,您可以有效地使用MATLAB来实现垂直距离Topsis方法,并应用于实际的决策分析场景中。如果您在操作过程中遇到任何问题,或者需要更复杂的VDTopsis变种的实现,请随时提出。