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×m?nnn準則數,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=1m?aij2??aij??

  • 作用:將不同量綱的準則值統一到[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??=jmax?xˉij?,fi??=jmin?xˉ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=1n?wi??fi???fi??fi???xˉ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?[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?=min?jSjS^* = \min_j S_jS?=minj?Sj?(最優群體效用),S?=max?jSjS^- = \max_j S_jS?=maxj?Sj?(最劣群體效用);
  • R?=min?jRjR^* = \min_j R_jR?=minj?Rj?(最優個體遺憾),R?=max?jRjR^- = \max_j R_jR?=maxj?Rj?(最劣個體遺憾);
  • ν\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.pswp.cn/diannao/93422.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93422.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93422.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【算法訓練營Day18】二叉樹part8

文章目錄修剪二叉搜索樹將有序數組轉換為二叉搜索樹把二叉搜索樹轉換為累加樹修剪二叉搜索樹 題目鏈接&#xff1a;669. 修剪二叉搜索樹 解題邏輯&#xff1a; 因為在刪除的同時要保證相對結構&#xff0c;所以我們不能沿用上一篇文章中的刪除邏輯&#xff0c;新的刪除邏輯為&…

【C++篇】“內存泄露”的寶藏手段:智能指針

目錄 智能指針的使用場景分析 RAII和智能指針的設計思路 C標準庫智能指針的使用 auto_ptr的使用&#xff1a; unique_ptr的使用&#xff1a; shared_ptr的使用&#xff1a; 模擬shared_ptr: 定制刪除器&#xff1a; shared_ptr的循環引用 weak_ptr 智能指針的使用場景…

【密碼學】4. 分組密碼

目錄分組密碼分組密碼概述Feistel 密碼結構數據加密標準&#xff08;DES&#xff09;差分密碼分析與線性密碼分析分組密碼的運行模式國際數據加密算法&#xff08;IDEA&#xff09;高級加密標準&#xff08;AES&#xff0c;Rijndael&#xff09;中國商用密碼 SM4祖沖之密碼&…

單片機(STM32-WIFI模塊)

一、WIFI模塊介紹 1. ESP12-F模組介紹 1.1 簡介 ESP12-F模組&#xff08;安信可&#xff08;Ai-Thinker&#xff09;ESP8266系列模組&#xff09;是一款基于樂鑫&#xff08;Espressif&#xff09;公司ESP8266芯片的Wi-Fi無線通信模塊&#xff0c;廣泛應用于物聯網&#xff0…

PyTorch 數據類型和使用

關于PyTorch的數據類型和使用的學習筆記 系統介紹了PyTorch的核心數據類型Tensor及其應用。Tensor作為多維矩陣數據容器&#xff0c;支持0-4維數據結構&#xff08;標量到批量圖像&#xff09;&#xff0c;并提供了多種數值類型&#xff08;float32/int64等&#xff09;。通過…

[python刷題模板] LogTrick

[python刷題模板] LogTrick 一、 算法&數據結構1. 描述2. 復雜度分析3. 常見應用4. 常用優化二、 模板代碼1. 特定或值的最短子數組2. 找特定值3. 找位置j的最后一次被誰更新4. 問某個或和的數量三、其他四、更多例題五、參考鏈接一、 算法&數據結構 1. 描述 LogTric…

Vim與VS Code

Vim is a clone, with additions, of Bill Joys vi text editor program for Unix. It was written by Bram Moolenaar based on source for a port of the Stevie editor to the Amiga and first released publicly in 1991.其實這個本身不是 IDE &#xff08;只有在加入和配置…

[2025CVPR-圖象分類方向]CATANet:用于輕量級圖像超分辨率的高效內容感知標記聚合

?1. 研究背景與動機? ?問題?&#xff1a;Transformer在圖像超分辨率&#xff08;SR&#xff09;中計算復雜度隨空間分辨率呈二次增長&#xff0c;現有方法&#xff08;如局部窗口、軸向條紋&#xff09;因內容無關性無法有效捕獲長距離依賴。?現有局限?&#xff1a; SPI…

課題學習筆記3——SBERT

1 引言在構建基于知識庫的問答系統時&#xff0c;"語義匹配" 是核心難題 —— 如何讓系統準確識別 "表述不同但含義相同" 的問題&#xff1f;比如用戶問 "對親人的期待是不是欲&#xff1f;"&#xff0c;系統能匹配到知識庫中 "追名逐利是欲…

在Word和WPS文字中把全角數字全部改為半角

大部分情況下我們在Word或WPS文字中使用的數字或標點符號都是半角&#xff0c;但是有時不小心按錯了快捷鍵或者點到了輸入法的全角半角切換圖標&#xff0c;就輸入了全角符號和數字。不用擔心&#xff0c;使用它們自帶的全角、半角轉換功能即可快速全部轉換回來。一、為什么會輸…

數據結構的基本知識

一、集合框架1、什么是集合框架Java集合框架(Java Collection Framework),又被稱為容器(container),是定義在java.util包下的一組接口(interfaces)和其實現類(classes).主要表現為把多個元素(element)放在一個單元中,用于對這些元素進行快速、便捷的存儲&#xff08;store&…

WebStack-Hugo | 一個靜態響應式導航主題

WebStack-Hugo | 一個靜態響應式導航主題 #10 shenweiyan announced in 1.3-折騰 WebStack-Hugo | 一個靜態響應式導航主題#10 ?編輯shenweiyan on Oct 23, 2023 6 comments 7 replies Return to top shenweiyan on Oct 23, 2023 Maintainer Via&#xff1a;我給自己…

01 基于sklearn的機械學習-機械學習的分類、sklearn的安裝、sklearn數據集、數據集的劃分、特征工程中特征提取與無量綱化

文章目錄機械學習機械學習分類1. 監督學習2. 半監督學習3. 無監督學習4. 強化學習機械學習的項目開發步驟scikit-learn1 scikit-learn安裝2 sklearn數據集1. sklearn 玩具數據集鳶尾花數據集糖尿病數據集葡萄酒數據集2. sklearn現實世界數據集20 新聞組數據集3. 數據集的劃分特…

攜全雙工語音通話大模型亮相WAIC,Soul重塑人機互動新范式

近日&#xff0c;WAIC 2025在上海隆重開幕。作為全球人工智能領域的頂級盛會&#xff0c;本屆WAIC展覽聚焦底層能力的演進與具體垂類場景的融合落地。堅持“模應一體”方向、立足“AI社交”的具體場景&#xff0c;Soul App此次攜最新升級的自研端到端全雙工語音通話大模型亮相&…

第2章 cmd命令基礎:常用基礎命令(1)

Hi~ 我是李小咖&#xff0c;主要從事網絡安全技術開發和研究。 本文取自《李小咖網安技術庫》&#xff0c;歡迎一起交流學習&#x1fae1;&#xff1a;https://imbyter.com 本節介紹的命令有目錄操作&#xff08;cd&#xff09;、清屏操作&#xff08;cls&#xff09;、設置顏色…

Java 10 新特性解析

Java 10 新特性解析 文章目錄Java 10 新特性解析1. 引言2. 本地變量類型推斷&#xff08;JEP 286&#xff09;2.1. 概述2.2. 使用場景2.3. 限制2.4. 與之前版本的對比2.5. 風格指南2.6. 示例代碼2.7. 優點與注意事項3. 應用程序類數據共享&#xff08;JEP 310&#xff09;3.1. …

【WRF工具】服務器中安裝編譯GrADS

目錄 安裝編譯 GrADS 所需的依賴庫 conda下載庫包 安裝編譯 GrADS 編譯前檢查依賴可用性 安裝編譯 GrADS 參考 安裝編譯 GrADS 所需的依賴庫 以統一方式在 $HOME/WRFDA_LIBS/grads_deps 下安裝所有依賴: # 選擇一個目錄用于安裝所有依賴庫 export DIR=$HOME/WRFDA_LIBS庫包1…

數據結構之隊列(C語言)

1.隊列的定義&#xff1a; 隊列&#xff08;Queue&#xff09;是一種基礎且重要的線性數據結構&#xff0c;遵循先進先出&#xff08;FIFO&#xff09;?? 原則&#xff0c;即最早入隊的元素最先出隊&#xff0c;與棧不同的是出隊列的順序是固定的。隊列具有以下特點&#xff…

C#開發基礎之深入理解“集合遍歷時不可修改”的異常背后的設計

前言 歡迎關注【dotnet研習社】&#xff0c;今天我們聊聊一個基礎問題“集合已修改&#xff1a;可能無法執行枚舉操作”背后的設計。 在日常 C# 開發中&#xff0c;我們常常會操作集合&#xff08;如 List<T>、Dictionary<K,V> 等&#xff09;。一個新手開發者極…

【工具】圖床完全指南:從選擇到搭建的全方位解決方案

前言 在數字化內容創作的時代&#xff0c;圖片已經成為博客、文檔、社交媒體等平臺不可或缺的元素。然而&#xff0c;如何高效、穩定地存儲和分發圖片資源&#xff0c;一直是內容創作者面臨的重要問題。圖床&#xff08;Image Hosting&#xff09;作為專門的圖片存儲和分發服務…