【數學建模】基本模型學習筆記(Python編程)


\color{#f15642}{\large \mathbf{ 一}}

模型 參考
層次分析法 ①視頻簡介 ②算法推導 ③計算方法
多屬性決策法 ①視頻簡介 ②詳細解說

1 層次分析法

1.1 題目

  • 建模步驟
    在這裏插入圖片描述

  • 建立層次結構模型
    目標:選擇合適的旅遊地
    從上至下,依次爲目標層、準則層、方案層。(有沒有覺得這個圖很漂亮?中途安利一個在線繪圖網站【點我】
    在這裏插入圖片描述

  • 構造成對比較矩陣

標度 含義
1 同樣重要
3 稍微重要
5 明顯重要
7 強烈重要
9 極端重要
2,4,6,8 判斷中值
倒數 反過來比較

根據已建立的模型,通過查找資料,並對大量數據進行分析,得到如下成對比較矩陣。(數據來源於參考文獻)
1)C層:以Z{Z}爲目標,你認爲CiCj{Ci比Cj}重要多少?
CZ=C5×C5=[1124332175514171121313152111315311] C_{Z}=C_{5} \times C_{5}= \begin{bmatrix} 1&\frac{1}{2} &4 &3 &3 \\ 2 &1 &7 &5 &5 \\ \frac{1}{4} &\frac{1}{7} &1 &\frac{1}{2} &\frac{1}{3} \\ \frac{1}{3} &\frac{1}{5} &2 &1 &1 \\ \frac{1}{3} &\frac{1}{5} &3 &1 &1 \end{bmatrix}

2)P層:以C1{C_{1}}爲目標,你認爲PiPj{Pi比Pj}重要多少?
PA1=P3×P3=[125121215121] P_{A1}=P_{3} \times P_{3} = \begin{bmatrix} 1 &2 &5 \\ \frac{1}{2} &1 &2 \\ \frac{1}{5} &\frac{1}{2} &1 \end{bmatrix}

同理,分別以A25{A_{2-5}}爲目標,你認爲BiBj{Bi比Bj}重要多少?
PA2=[113183113831]PA3=[11311313131]PA4=[13413111411]PA5=[11141114441] P_{A2}= \begin{bmatrix} 1 &\frac{1}{3} &\frac{1}{8} \\ 3 &1 &\frac{1}{3} \\ 8 &3 &1 \end{bmatrix} P_{A3}= \begin{bmatrix} 1 &1 &3 \\ 1 &1 &3 \\ \frac{1}{3} &\frac{1}{3} &1 \end{bmatrix} P_{A4}= \begin{bmatrix} 1 &3 &4 \\ \frac{1}{3} &1 &1 \\ \frac{1}{4} &1 &1 \end{bmatrix} P_{A5}= \begin{bmatrix} 1 &1 &\frac{1}{4} \\ 1 &1 &\frac{1}{4} \\ 4 &4 &1 \end{bmatrix}

  • 計算權重向量&一致性檢驗
    ①A的列向量歸一化
    ②求行和,然後歸一化得到權重向量w
    ③根據特徵值定義求得w對應特徵值,即爲最大特徵值λ(近似)。
    w=[0.2630.4750.0550.0900.110]w=\begin{bmatrix} 0.263 \\ 0.475 \\ 0.055 \\ 0.090 \\ 0.110 \end{bmatrix}
    λ=5.073 \lambda=5.073
    一致性指標,nXn矩陣:CI = (λ-n)/(n-1)
    CI=5.073551=0.018 CI= \frac{5.073-5}{5-1}=0.018
    隨機一致性指標(查表)nXn矩陣
    RI=1.12 RI=1.12
    一致性比率,不通過要重新構建成對比較矩陣
    CR=CIRI=0.0181.12=0.016<0.1( CR=\frac{CI}{RI}=\frac{0.018}{1.12}=0.016<0.1(通過一致性檢驗)
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

:按照相同方法計算B15{B_{1-5}}權重向量和對應特徵值,並分析一致性。

  • 計算組合權重向量
    目標:求方案層B1,B2,B3{B1, B2, B3}分別對於目標層Z{Z}的權重
    舉例B1{B1}對於A1,A2,A3,A4,A5{A1, A2, A3, A4, A5}的權重分別乘以A1,A2,A3,A4,A5{A1, A2, A3, A4, A5}相對於Z{Z}的權重。
    B1Z=0.595×0.263+0.082×0.475+0.429×0.055+0.633×0.099+0.166×0.110=0.3 B_{1→Z}=0.595 \times 0.263+0.082 \times 0.475+0.429 \times 0.055 + 0.633 \times 0.099 + 0.166 \times0.110=0.3

根據上理,分別求出BZ{B對Z}權重即可
(不知不覺寫了好多推導過程,雖然都是參考別人的,但還是耗費太多時間,後面我儘量減少過程,直接建模)

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家企業 x1,x2,x3,x4{x_{1}, x_{2}, x_{3}, x_{4}},分別有5項屬性 產值(萬元),投資成本(萬元),銷售額(萬元), 國家收益比重, 環境污染程度。
產值u1 投資成本u2 銷售額u3 國家收益比重u4 環境污染程度u5
x1{x_{1}} 8350 5300 6135 0.82 0.17
x2{x_{2}} 7455 4952 6527 0.65 0.13
x3{x_{3}} 11000 8001 9008 0.59 0.15
x4{x_{4}} 9624 5000 8892 0.74 0.28

現對數據進行歸一化處理
不同數據,不同歸一算法。
rij=aijmax(aij)rij=aijmin(aij)max(aij)min(aij) 效益型: r_{ij}= \frac{a_{ij}}{max(a_{ij})} 或 r_{ij}= \frac{a_{ij}-min(a_{ij})}{max(a_{ij})-min(a_{ij})}

rij=min(aij)aijrij=max(aij)aijmax(aij)min(aij) 成本型: r_{ij}= \frac{min(a_{ij})}{a_{ij}} 或 r_{ij}= \frac{max(a_{ij})-a_{ij}}{max(a_{ij})-min(a_{ij})}

rij=1aijαjmax(aijαj)(αj 固定型: r_{ij}= 1- \frac{a_{ij} - \alpha_{j}}{max(|a_{ij}-\alpha_{j}|)}(\alpha_{j} 爲固定標準)

rij=aijβjmin(aijβj)max(aijβj)min(aijβj) 偏離型: r_{ij}= |a_{ij}-\beta_{j}| -\frac{min(|a_{ij}-\beta_{j}|)}{max(|a_{ij}-\beta_{j}|)-min(|a_{ij}-\beta_{j}|)}

rij={1max(q1jaij,aijq2j)max[q1jmin(aij),max(aij)q2j],aij[q1j,q2j]1,aij[q1j,q2j] 區間型: 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.

rij={max(q1jaij,aijq2j)max[q1jmin(aij),max(aij)q2j],aij[q1j,q2j]1,aij[q1j,q2j] 偏離區間型: 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.
易知,投資成本u2和污染程度u5爲成本型,其餘爲效益型,得到歸一後數據

產值u1 投資成本u2 銷售額u3 國家收益比重u4 環境污染程度u5
x1{x_{1}} 0.7455 0.9394 0.6811 1.0000 0.7647
x2{x_{2}} 0.6777 1.0000 0.7246 0.7926 1.0000
x3{x_{3}} 1.0000 0.6189 1.0000 0.7195 0.8667
x4{x_{4}} 0.8749 0.9904 0.9871 0.9024 0.4643
  • 計算屬性權重
    和①一樣,構造成對比較矩陣,然後計算權重向量。
    u1u5[0.4286,0.1429,0.1429,0.1429,0.1429]T{u_{1}到u_{5}權重爲[0.4286, 0.1429, 0.1429, 0.1429, 0.1429]^T}
  • 信息集結
    採用加權算術平均算子(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.
$$

\color{#f15642}{\large \mathbf{ 二}}

模型 參考
圖論-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)

正在更新中……

4 圖論-Floyd

4.1 題目

4.2 Python源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章