目錄
模型 | 參考 |
---|---|
層次分析法 | ①視頻簡介 ②算法推導 ③計算方法 |
多屬性決策法 | ①視頻簡介 ②詳細解說 |
1 層次分析法
1.1 題目
-
建模步驟
-
建立層次結構模型
目標:選擇合適的旅遊地
從上至下,依次爲目標層、準則層、方案層。(有沒有覺得這個圖很漂亮?中途安利一個在線繪圖網站【點我】)
-
構造成對比較矩陣
標度 | 含義 |
---|---|
1 | 同樣重要 |
3 | 稍微重要 |
5 | 明顯重要 |
7 | 強烈重要 |
9 | 極端重要 |
2,4,6,8 | 判斷中值 |
倒數 | 反過來比較 |
根據已建立的模型,通過查找資料,並對大量數據進行分析,得到如下成對比較矩陣。(數據來源於參考文獻)
1)C層:以爲目標,你認爲重要多少?
2)P層:以爲目標,你認爲重要多少?
同理,分別以爲目標,你認爲重要多少?
- 計算權重向量&一致性檢驗
①A的列向量歸一化
②求行和,然後歸一化得到權重向量w
③根據特徵值定義求得w對應特徵值,即爲最大特徵值λ(近似)。
一致性指標,nXn矩陣:CI = (λ-n)/(n-1)
隨機一致性指標(查表)nXn矩陣
一致性比率,不通過要重新構建成對比較矩陣
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
RI | 0 | 0 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 | 1.49 | 1.51 |
注:按照相同方法計算權重向量和對應特徵值,並分析一致性。
- 計算組合權重向量
目標:求方案層分別對於目標層的權重
舉例:對於的權重分別乘以相對於的權重。
根據上理,分別求出權重即可
(不知不覺寫了好多推導過程,雖然都是參考別人的,但還是耗費太多時間,後面我儘量減少過程,直接建模)
1.2 Python源碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
輸入成對比較矩陣(list),輸出一致性比率和權重向量,輸入list爲單行形式
如:[[1,2,5], [1/2,1,2], [1/5,1/2,1]]
提示:對特徵向量的不同求解方法將會得到不同權重向量
"""
import numpy as np
# 隨機一致性指標
RI_dict = {1: 0, 2: 0, 3: 0.58, 4: 0.90, 5: 1.12,
6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49, 11: 1.51}
def get_w(array):
"""
1.列向量歸一化
2.求每行元素之和歸一化得到權重向量w
3.根據特徵值定義求w對應的特徵值即爲最大特徵值 λ
"""
row = array.shape[0] # 計算出階數
a_axis_0_sum = array.sum(axis=0) # 1.列元素和 向量
b = array / a_axis_0_sum # 1.列向量歸一化
b_axis_1_sum = b.sum(axis=1) # 2.每一行元素之和
w = b_axis_1_sum / row # 2.歸一化處理(獲得權重向量向量)提示:經過1的歸一化後,矩陣所有元素之和爲矩陣階數,因此除以階數
AW = (w * array).sum(axis=1) # 行和
max_max = sum(AW / (row * w)) # 獲得對應的特徵值,即最大特徵值
CI = (max_max - row) / (row - 1)
CR = CI / RI_dict[row]
if CR < 0.1:
print("一致性比率爲:{0}".format(round(CR, 3)))
print('滿足一致性')
return w
else:
print("一致性比率爲:{0}".format(round(CR, 3)))
print('不滿足一致性,請進行修改')
def main(array):
if type(array) is np.ndarray:
return get_w(array)
else:
print('請輸入numpy對象')
if __name__ == '__main__':
matrix = np.array(eval(input("輸入成對比較矩陣:")))
print("權重向量:{0}".format(main(matrix)))
2 多屬性決策法
2.1 題目
突然發現2019年亞太杯(APMCM)第B題三問可以用這個模型。本文不討論APMCM,因爲他的數據太多,太耗費時間,有興趣的可以百度看看。如果有時間我再用這個模型復現一下那道題。/flag1
本文討論的題目:對4家企業進行投資評估(來自參考視頻)
- 屬性值歸一化
有4家企業 ,分別有5項屬性 產值(萬元),投資成本(萬元),銷售額(萬元), 國家收益比重, 環境污染程度。
產值u1 | 投資成本u2 | 銷售額u3 | 國家收益比重u4 | 環境污染程度u5 | |
---|---|---|---|---|---|
8350 | 5300 | 6135 | 0.82 | 0.17 | |
7455 | 4952 | 6527 | 0.65 | 0.13 | |
11000 | 8001 | 9008 | 0.59 | 0.15 | |
9624 | 5000 | 8892 | 0.74 | 0.28 |
現對數據進行歸一化處理。
不同數據,不同歸一算法。
易知,投資成本u2和污染程度u5爲成本型,其餘爲效益型,得到歸一後數據
產值u1 | 投資成本u2 | 銷售額u3 | 國家收益比重u4 | 環境污染程度u5 | |
---|---|---|---|---|---|
0.7455 | 0.9394 | 0.6811 | 1.0000 | 0.7647 | |
0.6777 | 1.0000 | 0.7246 | 0.7926 | 1.0000 | |
1.0000 | 0.6189 | 1.0000 | 0.7195 | 0.8667 | |
0.8749 | 0.9904 | 0.9871 | 0.9024 | 0.4643 |
- 計算屬性權重
和①一樣,構造成對比較矩陣,然後計算權重向量。
- 信息集結
採用加權算術平均算子(WAA),即數據乘以權重,然後相加得到評估分數。
此外,還有其他集結信息的方式,比如加權幾何平均(WGA)算子:有序加權平均(OWA)算子。
2.2 Latex公式源碼
多屬性決策主要源碼和①層次分析法一樣,關於歸一化方法還要具體情況具體分析,很難設計出通用源碼。因此Python源碼可參考1.2, 下面提供一些Latex公式源碼
$$
效益型: r_{ij}= \frac{a_{ij}}{max(a_{ij})} 或 r_{ij}= \frac{a_{ij}-min(a_{ij})}{max(a_{ij})-min(a_{ij})}
$$
$$
成本型: r_{ij}= \frac{min(a_{ij})}{a_{ij}} 或 r_{ij}= \frac{max(a_{ij})-a_{ij}}{max(a_{ij})-min(a_{ij})}
$$
$$
固定型: r_{ij}= 1- \frac{a_{ij} - \alpha_{j}}{max(|a_{ij}-\alpha_{j}|)}(\alpha_{j} 爲固定標準)
$$
$$
偏離型: r_{ij}= |a_{ij}-\beta_{j}| -\frac{min(|a_{ij}-\beta_{j}|)}{max(|a_{ij}-\beta_{j}|)-min(|a_{ij}-\beta_{j}|)}
$$
$$
區間型: r_{ij}=
\left\{\begin{matrix}
1 - {\Large\frac{max(q_{1}^{j}-a_{ij}, a_{ij}-q_{2}^{j})}{max\left [q_{1}^{j}-min(a_{ij}), max(a_{ij})-q_{2}^{j} \right ]}} ,a_{ij}\notin [q_{1}^{j}, q_{2}^{j}]\\
1 ,a_{ij}\in [q_{1}^{j}, q_{2}^{j}]
\end{matrix}\right.
$$
$$
偏離區間型: r_{ij}=
\left\{\begin{matrix}
{\Large\frac{max(q_{1}^{j}-a_{ij}, a_{ij}-q_{2}^{j})}{max\left [q_{1}^{j}-min(a_{ij}), max(a_{ij})-q_{2}^{j} \right ]}} ,a_{ij}\notin [q_{1}^{j}, q_{2}^{j}]\\
1 ,a_{ij}\in [q_{1}^{j}, q_{2}^{j}]
\end{matrix}\right.
$$
模型 | 參考 |
---|---|
圖論-dijstra | ①視頻簡介 ②算法實現 |
圖論-Floyd | ①視頻簡介 |
3 圖論-dijstra
3.1 題目
- 找出v1到v11的最短路徑(來源於參考視頻)
- 構造帶權鄰接矩陣
3.2 Python源碼
"""
修改最下面的帶權鄰接矩陣
輸出0→n最短路徑長度和步驟
"""
import numpy as np
Inf = np.Inf # 無窮大
P = 1 # P標記
Q = 0 # Q標記
def dijkstra(matrix):
m = np.array(matrix) # 轉化爲矩陣
n = m.shape[0] # 獲取矩陣階數
book = np.zeros(n) # 記錄P標記和Q標記
book[0] = P # 初始點標記P
route = np.zeros_like(book) # 記錄路徑
# 循環(階數-1)次
for x in range(n - 1):
min_m = Inf # 距離初始點距離最小值
for j in range(n):
if book[j] == 0 and m[0][j] < min_m:
min_m = m[0][j] # 記錄最近值
u = j # 記錄最近點
book[u] = P # 將該點標記P
for v in range(n):
if m[u][v] < Inf:
if m[0][v] > m[0][u] + m[u][v]:
# 如果(0→v)的距離大於(0→u→v),則鬆弛v
m[0][v] = m[0][u] + m[u][v]
route[x] = u # 記錄路徑
print("0到n的最短路徑長度爲:", m[0]) # 輸出最短路徑長路
print("0到n的最短路徑爲:", route) # 輸出路徑
"""
帶權鄰接矩陣
"""
k = [[0, 2, 8, 1, Inf, Inf, Inf, Inf, Inf, Inf, Inf],
[2, 0, 6, Inf, 1, Inf, Inf, Inf, Inf, Inf, Inf],
[8, 6, 0, 7, 5, 1, 2, Inf, Inf, Inf, Inf],
[1, Inf, 7, 0, Inf, Inf, 9, Inf, Inf, Inf, Inf],
[Inf, 1, 5, Inf, 0, 3, Inf, 2, 9, Inf, Inf],
[Inf, Inf, 1, Inf, 3, 0, 4, Inf, 6, Inf, Inf],
[Inf, Inf, 2, 9, Inf, 4, 0, Inf, 3, 1, Inf],
[Inf, Inf, Inf, Inf, 2, Inf, Inf, 0, 7, Inf, 9],
[Inf, Inf, Inf, Inf, 9, 6, 3, 7, 0, 1, 2],
[Inf, Inf, Inf, Inf, Inf, Inf, 1, Inf, 1, 0, 4],
[Inf, Inf, Inf, Inf, Inf, Inf, Inf, 9, 2, 4, 0]]
dijkstra(k)
正在更新中……