前言
提醒:
文章內容為方便作者自己后日復習與查閱而進行的書寫與發布,其中引用內容都會使用鏈接表明出處(如有侵權問題,請及時聯系)。
其中內容多為一次書寫,缺少檢查與訂正,如有問題或其他拓展及意見建議,歡迎評論區討論交流。
內容由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=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=1∑n?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?越小,方案越優(越接近理想解的妥協解)。
三、關鍵特點與優勢
-
妥協解邏輯:
同時考慮“群體效用最大化”(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)
運行結果