南昌做網(wǎng)站市場報(bào)價(jià)刷seo關(guān)鍵詞排名軟件
文章目錄
- 前言
- 原理
- 步驟
- 代碼實(shí)例
前言
??Vikor 歸根到底其實(shí)屬于一種綜合評價(jià)方法。說到綜合評價(jià)方法,TOPSIS(結(jié)合熵權(quán)法使用)、灰色關(guān)聯(lián)度分析、秩和比法等方法你應(yīng)該耳熟能詳。Vikor 未必比這些方法更出色,但是可以拓展我們的視野。接下來先介紹 Vikor 方法的原理,再結(jié)合一個(gè)例子使用 Vikor 方法進(jìn)行 Python 建模。
原理
??Vikor 方法是一種基于多個(gè)標(biāo)準(zhǔn),選擇最好的(折中的)策略的方法。非常類似于 TOPSIS 綜合評價(jià)方法。
??多標(biāo)準(zhǔn)決策(MCDM)問題描述為:現(xiàn)有 n n n 個(gè)可行方案,每個(gè)方案均有 m m m 個(gè)指標(biāo),用 f i j f_{ij} fij? 表示第 i i i 個(gè)方案的第 j j j 個(gè)指標(biāo)?,F(xiàn)在要求出多準(zhǔn)則意義上的最佳(折衷)解決方案。例如,現(xiàn)在有 A 1 ? A 4 A_1-A_4 A1??A4? 四架飛機(jī)(即 n = 4 n=4 n=4),每架飛機(jī)有 m = 6 m=6 m=6 個(gè)指標(biāo),如下表所示,請你選出多準(zhǔn)則意義上最好的飛機(jī)。
飛機(jī)編號(hào) | 最大速度 | 飛行半徑 | 最大負(fù)載 | 費(fèi)用 | 可靠性 | 靈敏度 |
---|---|---|---|---|---|---|
A 1 A_1 A1? | 2.0 2.0 2.0 | 1500 1500 1500 | 20000 20000 20000 | 5500000 5500000 5500000 | 0.5 0.5 0.5 | 1 1 1 |
A 2 A_2 A2? | 2.5 2.5 2.5 | 2700 2700 2700 | 18000 18000 18000 | 6500000 6500000 6500000 | 0.3 0.3 0.3 | 0.5 0.5 0.5 |
A 3 A_3 A3? | 1.8 1.8 1.8 | 2000 2000 2000 | 21000 21000 21000 | 4500000 4500000 4500000 | 0.7 0.7 0.7 | 0.7 0.7 0.7 |
A 4 A_4 A4? | 2.2 2.2 2.2 | 1800 1800 1800 | 20000 20000 20000 | 5000000 5000000 5000000 | 0.5 0.5 0.5 | 0.5 0.5 0.5 |
這是司守奎等的《Python 數(shù)學(xué)實(shí)驗(yàn)與建模》上的一個(gè)例題。
步驟
??Vikor 評價(jià)法的步驟如下:
- 對每個(gè)指標(biāo) f i j f_{ij} fij? 進(jìn)行處理,使得處理后的指標(biāo)都是極大型指標(biāo),仍用 f i j f_{ij} fij? 表示。無需歸一化、無量綱化。
極大型指標(biāo)指的是值越大越好的指標(biāo),如效率、產(chǎn)能、可靠性等,又稱“效益型指標(biāo)”。相對地,極小型指標(biāo)指的是值越小越好的指標(biāo),如能耗、費(fèi)用等,又稱“成本性指標(biāo)”。還有一類中間型指標(biāo),其值太大太小都不好,位于一個(gè)區(qū)間才合適,例如人的 BMI。
- 對每個(gè)指標(biāo)確定正理想解 f j + = max ? 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{+}}={\max\limits_{1\le i\le n}(}{{f}_{ij}}) fj+?=1≤i≤nmax?(fij?) ,以及負(fù)理想解 f j ? = min ? 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{-}}={\min\limits_{1\le i\le n}(}{{f}_{ij}}) fj??=1≤i≤nmin?(fij?)。
- 對于每個(gè)方案,計(jì)算 S S S 值(綜合距離,表示方案與正理想解之間的綜合距離)和 R R R 值(個(gè)體最大距離,表示方案在最不利標(biāo)準(zhǔn)下與正理想解之間的距離): S i = ∑ j = 1 m w j ( f j + ? f i j ) f j + ? f j ? S_i=\sum_{j=1}^{m}{\cfrac{w_j(f_j^+-f_{ij})}{f_j^+-f_j^-}} Si?=j=1∑m?fj+??fj??wj?(fj+??fij?)? R i = max ? 1 ≤ j ≤ m ( w j ( f j + ? f i j ) f j + ? f j ? ) R_i=\max\limits_{1\leq j\leq m}\left(\cfrac{w_j(f_j^+-f_{ij})}{f_j^+-f_j^-}\right) Ri?=1≤j≤mmax?(fj+??fj??wj?(fj+??fij?)?)這里 w j w_j wj? 是給每個(gè)標(biāo)注取的權(quán)重,默認(rèn)情況下那么都取 1 / m 1/m 1/m。
- 計(jì)算每個(gè)方案的 Q Q Q 值,這個(gè)值是綜合所有方案的 S S S 值與 R R R 值得出的結(jié)果: Q i = v × S i ? S + S ? ? S + + ( 1 ? v ) × R i ? R + R ? ? R + {{Q}_{i}}=v\times \frac{{{S}_{i}}-{{S}^{+}}}{{{S}^{-}}-{{S}^{+}}}+(1-v)\times \frac{{{R}_{i}}-{{R}^{+}}}{{{R}^{-}}-{{R}^{+}}} Qi?=v×S??S+Si??S+?+(1?v)×R??R+Ri??R+?其中,
- S + = min ? 1 ≤ i ≤ n ( S i ) S^+=\min\limits_{1\leq i\leq n}(S_i) S+=1≤i≤nmin?(Si?), S ? = max ? 1 ≤ i ≤ n ( S i ) S^-=\max\limits_{1\leq i\leq n}(S_i) S?=1≤i≤nmax?(Si?), R + = min ? 1 ≤ i ≤ n ( R i ) R^+=\min\limits_{1\leq i\leq n}(R_i) R+=1≤i≤nmin?(Ri?), R ? = max ? 1 ≤ i ≤ n ( R i ) R^-=\max\limits_{1\leq i\leq n}(R_i) R?=1≤i≤nmax?(Ri?)。
- v v v 是一個(gè)在 0 0 0 到 1 1 1 之間的權(quán)重,通常取 0.5 0.5 0.5,表示 S S S 值和 R R R 值的平衡。當(dāng) v > 0.5 v>0.5 v>0.5 時(shí),表示根據(jù)最大群體效用的決策機(jī)制進(jìn)行決策;當(dāng) v < 0.5 v<0.5 v<0.5 時(shí),表示根據(jù)最小個(gè)體遺憾的決策機(jī)制進(jìn)行決策。數(shù)學(xué)建模時(shí),這個(gè) v v v 可能適合拿來靈敏度分析。
- 對這個(gè) Q Q Q 值進(jìn)行升序排序,就是各個(gè)方案的最終排名。一般取 Q Q Q 值最小的為最優(yōu)。
參考文獻(xiàn):VIKOR方法_vikor方法簡介-CSDN博客
代碼實(shí)例
??就使用上面評價(jià)飛機(jī)的那個(gè)例子。首先觀察到費(fèi)用是一個(gè)極小型指標(biāo),需要極大化。書上直接給出了使用比例變換法將所有指標(biāo)極大歸一化的結(jié)果,因此下面的代碼中直接使用這個(gè)結(jié)果:
import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt# 這個(gè)就是極大歸一化后的數(shù)據(jù)
data = pd.DataFrame([[0.8,0.5556,0.9524,0.8182,0.7143,1],[1,1,0.8571,0.6923,0.4286,0.5],[0.72,0.7407,1,1,1,0.7],[0.88,0.6667,0.9524,0.9,0.7143,0.5]])# 確定正負(fù)理想解
f_best = data.max(axis = 0)
f_worst = data.min(axis = 0)
# 計(jì)算 S 和 R
S = []
R = []
for i in range(data.index.size):S.append(sum((f_best - data.iloc[i,:])/(f_best - f_worst))/data.columns.size)R.append(max((f_best - data.iloc[i,:])/(f_best - f_worst))/data.columns.size)# 計(jì)算 Q
S = np.array(S)
R = np.array(R)
qq = [[],[],[],[]]
v_arr = np.linspace(0,1,1000)
for v in v_arr:Q = 0if(S.max() - S.min() != 0):Q += v * (S - S.min()) / (S.max() - S.min())if(R.max() - R.min() != 0):Q += (1 - v) * (R - R.min()) / (R.max() - R.min())for i in range(len(Q)):qq[i].append(Q[i])# 作圖部分
plt.rc('text',usetex = True)
plt.plot(v_arr,qq[0],label = '$A_1$')
plt.plot(v_arr,qq[1],label = '$A_2$')
plt.plot(v_arr,qq[2],label = '$A_3$')
plt.plot(v_arr,qq[3],label = '$A_4$')
plt.xlabel('$v$')
plt.ylabel('$Q_i$')
plt.legend()
plt.show()
??上面的代碼,我嘗試了 ( 0 , 1 ) (0,1) (0,1) 中的許多 v v v 值,作出了 Q i ( i = 1 , 2 , 3 , 4 ) Q_i(i=1,2,3,4) Qi?(i=1,2,3,4) 關(guān)于 v v v 的圖線,如下圖所示:

??可以看出,無論 v v v 怎么選,結(jié)果都是固定的: A 3 > A 1 > A 4 > A 2 {{A}_{3}}>{{A}_{1}}>{{A}_{4}}>{{A}_{2}} A3?>A1?>A4?>A2?。這和熵權(quán)法的結(jié)果一樣,而 TOPSIS 的結(jié)果是 A 3 > A 1 > A 2 > A 4 {{A}_{3}}>{{A}_{1}}>{{A}_{2}}>{{A}_{4}} A3?>A1?>A2?>A4???偠灾?Vikor 還是個(gè)比較不錯(cuò)的方法。