前言
提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。
内容由AI辅助生成,仅经笔者审核整理,请甄别食用。
文章目录
- 前言
- 一、VIKOR 方法概述
- 二、核心步骤与公式(结合算法)
- 1. 输入:决策矩阵与准则权重
- 2. 步骤 1:归一化决策矩阵(消除量纲)
- 3. 步骤 2:确定理想解与负理想解
- 4. 步骤 3:计算SjS_jSj(群体效用)与RjR_jRj(个体遗憾)
- 5. 步骤 4:计算综合得分QjQ_jQj
- 6. 步骤 5:方案排序
- 三、关键特点与优势
- 五、与其他 MCDM 方法的对比
- 六、总结
- 简单示例
- 代码说明:
一、VIKOR 方法概述
VIKOR(Multi-criteria Optimization and Compromise Solution)是由 Opricovic 提出的多准则决策(MCDM)方法,核心逻辑是通过“接近理想解的妥协解”排序方案。它结合“群体效用最大化”和“个体遗憾最小化”,适合解决多准则下的方案优选问题(如工程设计、供应链评估)。
二、核心步骤与公式(结合算法)
1. 输入:决策矩阵与准则权重
- 决策矩阵:A=(aij)n×m\mathbf{A} = (a_{ij})_{n \times m}A=(aij)n×m(nnn准则数,mmm方案数,aija_{ij}aij是方案jjj在准则iii下的值)。
- 准则权重:wiw_iwi(∑wi=1\sum w_i = 1∑wi=1,表示准则iii的重要性)。
2. 步骤 1:归一化决策矩阵(消除量纲)
对原始矩阵按列归一化,公式:
xˉij=aij∑j=1maij2\bar{x}_{ij} = \frac{a_{ij}}{\sqrt{\sum_{j=1}^m a_{ij}^2}} xˉij=∑j=1maij2aij
- 作用:将不同量纲的准则值统一到[0,1][0,1][0,1]区间。
3. 步骤 2:确定理想解与负理想解
对每个准则iii,找到最优值fi∗f_i^*fi∗(最大化准则取最大值,最小化准则取最小值)和最劣值fi−f_i^-fi−(反之):
fi∗=maxjxˉij,fi−=minjxˉijf_i^* = \max_j \bar{x}_{ij}, \quad f_i^- = \min_j \bar{x}_{ij} fi∗=jmaxxˉij,fi−=jminxˉij
4. 步骤 3:计算SjS_jSj(群体效用)与RjR_jRj(个体遗憾)
-
群体效用SjS_jSj:方案jjj与理想解的“群体效用差”,公式:
Sj=∑i=1nwi⋅fi∗−xˉijfi∗−fi−S_j = \sum_{i=1}^n w_i \cdot \frac{f_i^* - \bar{x}_{ij}}{f_i^* - f_i^-} Sj=i=1∑nwi⋅fi∗−fi−fi∗−xˉij- 意义:SjS_jSj越小,方案对“群体效用”的贡献越大。
-
个体遗憾RjR_jRj:方案jjj与理想解的“最大个体遗憾”,公式:
Rj=maxi[wi⋅fi∗−xˉijfi∗−fi−]R_j = \max_i \left[ w_i \cdot \frac{f_i^* - \bar{x}_{ij}}{f_i^* - f_i^-} \right] Rj=imax[wi⋅fi∗−fi−fi∗−xˉij]- 意义:RjR_jRj越小,方案的“最坏情况遗憾”越小。
5. 步骤 4:计算综合得分QjQ_jQj
融合SjS_jSj和RjR_jRj,公式:
Qj=ν⋅Sj−S∗S−−S∗+(1−ν)⋅Rj−R∗R−−R∗Q_j = \nu \cdot \frac{S_j - S^*}{S^- - S^*} + (1-\nu) \cdot \frac{R_j - R^*}{R^- - R^*} Qj=ν⋅S−−S∗Sj−S∗+(1−ν)⋅R−−R∗Rj−R∗
其中:
- S∗=minjSjS^* = \min_j S_jS∗=minjSj(最优群体效用),S−=maxjSjS^- = \max_j S_jS−=maxjSj(最劣群体效用);
- R∗=minjRjR^* = \min_j R_jR∗=minjRj(最优个体遗憾),R−=maxjRjR^- = \max_j R_jR−=maxjRj(最劣个体遗憾);
- ν\nuν:妥协系数(通常取0.50.50.5,平衡“群体效用”与“个体遗憾”)。
6. 步骤 5:方案排序
按QjQ_jQj升序排序,QjQ_jQj越小,方案越优(越接近理想解的妥协解)。
三、关键特点与优势
-
妥协解逻辑:
同时考虑“群体效用最大化”(SjS_jSj)和“个体遗憾最小化”(RjR_jRj),避免单一目标的极端化。 -
参数ν\nuν的调节:
- ν=0.5\nu = 0.5ν=0.5:平衡群体与个体;
- ν>0.5\nu > 0.5ν>0.5:侧重“群体效用”(多数规则);
- ν<0.5\nu < 0.5ν<0.5:侧重“个体遗憾”(否决规则)。
-
适用场景:
适合“需平衡多方利益”的决策(如供应链中“成本、效率、风险”的权衡)。
五、与其他 MCDM 方法的对比
方法 | 核心差异点 | 适用场景 |
---|---|---|
VIKOR | 强调“妥协解”,平衡群体效用与个体遗憾,适合需兼顾多方利益的决策 | 供应链优化、公共政策决策 |
TOPSIS | 通过“距离理想解的相对位置”排序,侧重“接近度”,对异常值敏感 | 数据波动小的决策场景 |
COPRAS | 区分最大化/最小化准则,通过相对显著性强化最小化准则的影响 | 工程设计、成本敏感型决策 |
六、总结
VIKOR 是一种**兼顾“群体利益”与“个体遗憾”**的多准则决策方法,核心通过SjS_jSj(群体效用)、RjR_jRj(个体遗憾)和QjQ_jQj(综合得分)排序方案。其公式设计体现了“妥协优化”思想,尤其适合需平衡多方诉求的复杂决策场景(如城市规划、项目投资)。
简单示例
下面是一个使用VIKOR优化方法的MATLAB实现。这个示例解决了一个经典的"供应商选择"问题,通过VIKOR方法在多个准则下对备选方案进行排序和选择。
%% VIKOR(Multi-criteria Optimization and Compromise 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; % 供应商A90, 8, 7, 9, 8; % 供应商B70, 9, 6, 7, 9; % 供应商C60, 6, 8, 6, 6; % 供应商D85, 7, 10, 8, 8; % 供应商E
];% 标记准则类型(1=最大化,0=最小化)
criteria_type = [0, 1, 1, 1, 1];% VIKOR妥协系数(通常取0.5,平衡群体效用与个体遗憾)
v = 0.5;%% 2. VIKOR计算流程
% 步骤1:归一化决策矩阵(向量归一化)
normalized_matrix = zeros(size(decision_matrix));
for j = 1:num_criteriaif 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:确定理想解和负理想解
f_star = zeros(1, num_criteria);
f_minus = zeros(1, num_criteria);
for j = 1:num_criteriaif criteria_type(j) == 1 % 最大化准则f_star(j) = max(normalized_matrix(:,j));f_minus(j) = min(normalized_matrix(:,j));else % 最小化准则f_star(j) = min(normalized_matrix(:,j));f_minus(j) = max(normalized_matrix(:,j));end
end% 步骤3:计算S和R值
S = zeros(num_alternatives, 1);
R = zeros(num_alternatives, 1);
for i = 1:num_alternativesfor j = 1:num_criteriaS(i) = S(i) + weights(j) * (f_star(j) - normalized_matrix(i,j)) / (f_star(j) - f_minus(j));temp_R = weights(j) * (f_star(j) - normalized_matrix(i,j)) / (f_star(j) - f_minus(j));if temp_R > R(i)R(i) = temp_R;endend
end% 步骤4:计算Q值
S_star = min(S);
S_minus = max(S);
R_star = min(R);
R_minus = max(R);Q = zeros(num_alternatives, 1);
for i = 1:num_alternativesQ(i) = v * (S(i) - S_star) / (S_minus - S_star) + (1-v) * (R(i) - R_star) / (R_minus - R_star);
end% 步骤5:排序
[Q_sorted, sort_idx] = sort(Q, 'ascend');
S_sorted = S(sort_idx);
R_sorted = R(sort_idx);%% 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_alternativesfor j = 1:num_criteriatext(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 S、R、Q值对比图
subplot(2, 2, 3);
bar_width = 0.25;
x = 1:num_alternatives;
bar(x - bar_width, S, bar_width, 'b', 'DisplayName', 'S (群体效用)');
hold on;
bar(x, R, bar_width, 'r', 'DisplayName', 'R (个体遗憾)');
bar(x + bar_width, Q, bar_width, 'g', 'DisplayName', 'Q (综合得分)');
hold off;
title('S、R、Q值对比');
xlabel('方案');
ylabel('值');
set(gca, 'XTick', 1:num_alternatives, 'XTickLabel', alternatives);
legend;
grid on;% 3.4 VIKOR排序结果
subplot(2, 2, 4);
barh(1:num_alternatives, Q_sorted);
title('VIKOR排序结果');
xlabel('Q值 (越小越好)');
ylabel('方案 (按排名)');
set(gca, 'YTick', 1:num_alternatives, 'YTickLabel', alternatives(sort_idx));
grid on;% 添加标签显示具体Q值
for i = 1:num_alternativestext(Q_sorted(i)+0.01, i, sprintf('%.4f', Q_sorted(i)), 'HorizontalAlignment', 'left', 'VerticalAlignment', 'middle');
end%% 4. 输出结果
fprintf('\n===== VIKOR优化结果汇总 =====\n');
fprintf('\n1. 准则权重:\n');
for i = 1:num_criteriafprintf(' %s: %.2f\n', criteria{i}, weights(i));
endfprintf('\n2. 各方案评估结果:\n');
fprintf(' 方案\t\tS值\t\tR值\t\tQ值\n');
for i = 1:num_alternativesfprintf(' %s\t%.4f\t\t%.4f\t\t%.4f\n', alternatives{i}, S(i), R(i), Q(i));
endfprintf('\n3. VIKOR推荐排序:\n');
for i = 1:num_alternativesfprintf(' 第%d名: %s (Q值: %.4f)\n', i, alternatives{sort_idx(i)}, Q_sorted(i));
end% 检查是否满足VIKOR接受条件
if (Q_sorted(2) - Q_sorted(1) >= 1/(num_alternatives-1)) && ...(Q_sorted(1) == S_sorted(1) || Q_sorted(1) == R_sorted(1))fprintf('\n4. 接受条件检查: 方案 %s 为唯一最优妥协解\n', alternatives{sort_idx(1)});
elsefprintf('\n4. 接受条件检查: 存在多个妥协解或需进一步分析\n');
end
代码说明:
-
问题定义:
- 5个备选方案(供应商A-E)
- 5个评价准则:价格、质量、交货期、服务水平、环保性
- 准则权重:通过专家判断或AHP方法预先确定
- 准则类型:"价格"为最小化准则,其余为最大化准则
- 妥协系数v:默认0.5,平衡群体效用与个体遗憾
-
VIKOR计算流程:
- 归一化处理:针对不同类型准则采用不同归一化方法
- 确定理想解和负理想解:对每个准则分别计算
- 计算S值(群体效用)和R值(个体遗憾)
- 计算综合得分Q值:融合S和R
- 排序:按Q值升序排列
-
可视化功能:
- 决策矩阵热图:直观展示原始数据
- 准则权重饼图:显示各准则重要性分布
- S、R、Q值对比图:横向比较各方案在不同指标下的表现
- VIKOR排序结果:按Q值从低到高展示
-
结果输出:
- 详细列出各方案的S、R、Q值
- 给出推荐排序结果
- 检查是否满足VIKOR接受条件(条件1和条件2)
运行结果