当前位置: 首页 > news >正文

VIKOR(Multi-criteria Optimization and Compromise Solution)简介与简单示例

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

内容由AI辅助生成,仅经笔者审核整理,请甄别食用。

文章目录


一、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×mnnn准则数,mmm方案数,aija_{ij}aij是方案jjj在准则iii下的值)。
  • 准则权重wiw_iwi∑wi=1\sum w_i = 1wi=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∗=max⁡jxˉij,fi−=min⁡jxˉ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=1nwifififixˉij

    • 意义:SjS_jSj越小,方案对“群体效用”的贡献越大。
  • 个体遗憾RjR_jRj:方案jjj与理想解的“最大个体遗憾”,公式:
    Rj=max⁡i[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[wifififixˉij]

    • 意义:RjR_jRj越小,方案的“最坏情况遗憾”越小。
5. 步骤 4:计算综合得分QjQ_jQj

融合SjS_jSjRjR_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=νSSSjS+(1ν)RRRjR
其中:

  • S∗=min⁡jSjS^* = \min_j S_jS=minjSj(最优群体效用),S−=max⁡jSjS^- = \max_j S_jS=maxjSj(最劣群体效用);
  • R∗=min⁡jRjR^* = \min_j R_jR=minjRj(最优个体遗憾),R−=max⁡jRjR^- = \max_j R_jR=maxjRj(最劣个体遗憾);
  • ν\nuν:妥协系数(通常取0.50.50.5,平衡“群体效用”与“个体遗憾”)。
6. 步骤 5:方案排序

QjQ_jQj升序排序,QjQ_jQj越小,方案越优(越接近理想解的妥协解)。

三、关键特点与优势

  1. 妥协解逻辑
    同时考虑“群体效用最大化”(SjS_jSj)和“个体遗憾最小化”(RjR_jRj),避免单一目标的极端化。

  2. 参数ν\nuν的调节

    • ν=0.5\nu = 0.5ν=0.5:平衡群体与个体;
    • ν>0.5\nu > 0.5ν>0.5:侧重“群体效用”(多数规则);
    • ν<0.5\nu < 0.5ν<0.5:侧重“个体遗憾”(否决规则)。
  3. 适用场景
    适合“需平衡多方利益”的决策(如供应链中“成本、效率、风险”的权衡)。

五、与其他 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

代码说明:

  1. 问题定义

    • 5个备选方案(供应商A-E)
    • 5个评价准则:价格、质量、交货期、服务水平、环保性
    • 准则权重:通过专家判断或AHP方法预先确定
    • 准则类型:"价格"为最小化准则,其余为最大化准则
    • 妥协系数v:默认0.5,平衡群体效用与个体遗憾
  2. VIKOR计算流程

    • 归一化处理:针对不同类型准则采用不同归一化方法
    • 确定理想解和负理想解:对每个准则分别计算
    • 计算S值(群体效用)和R值(个体遗憾)
    • 计算综合得分Q值:融合S和R
    • 排序:按Q值升序排列
  3. 可视化功能

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

    • 详细列出各方案的S、R、Q值
    • 给出推荐排序结果
    • 检查是否满足VIKOR接受条件(条件1和条件2)

运行结果
在这里插入图片描述
在这里插入图片描述

http://www.dtcms.com/a/304691.html

相关文章:

  • 无人机图传:让天空视角 “触手可及”
  • Apache Ignite 的分布式原子类型(Atomic Types)
  • 【高阶版】R语言空间分析、模拟预测与可视化高级应用
  • 解密犯罪时间 - 华为OD统一考试(JavaScript 题解)
  • 自定义View和动画学习记录 抓娃娃机View
  • DataParallel (DP) DistributedDataParallel (DDP)
  • 15-TPS65261 4.5V 至 18V 输入电压、3A/2A/2A 输出电流三路同步降压转换器
  • 分布式时序数据库的特点解析
  • Three.js 完整实战项目:构建一个 3D 商品展示空间
  • UE5 打包Windows平台时无法找到SDK的解决方法
  • C# 基于halcon的视觉工作流-章25-椭圆查找
  • 【自动化运维神器Ansible】Ansible常用模块之service模块详解
  • C++ 赋值与交换法则
  • STM32 集成 USB 时出现 HAL_StatusTypeDef 未定义 的错误
  • STM32--DHT11(标准库)驱动开发
  • AI崛起后,对使用AI的一些小思考
  • LaTeX 下载安装保姆级教程
  • 异形设备前端适配挑战:条形屏/嵌入式终端的布局弹性与触控热区重构
  • 直播间里的酒旅新故事:内容正在重构消费链路
  • 亚马逊 Vine 计划:评论生态重构与合规运营策略
  • 《UE教程》第一章第九回——地图BGM
  • Kafka运维实战 17 - kafka 分区副本从 1 增加到 3【实战】
  • 减速机:自动化生产线的“精密传动心脏”
  • 网站备案号被注销了,怎么重新备案
  • 博弈论03——混合纳什均衡的收益求法
  • 76.最小覆盖子串
  • 线性回归原理与进阶
  • MySQL数据库 mysql常用命令
  • pvc怎么扩容
  • 深入解析Java元注解与运行时处理