【数学建模】基本模型学习笔记(Python编程)


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

模型参考
层次分析法①视频简介 ②算法推导 ③计算方法
多属性决策法①视频简介 ②详细解说

1 层次分析法

1.1 题目

  • 建模步骤
    在这里插入图片描述

  • 建立层次结构模型
    目标:选择合适的旅游地
    从上至下,依次为目标层、准则层、方案层。(有没有觉得这个图很漂亮?中途安利一个在线绘图网站【点我】
    在这里插入图片描述

  • 构造成对比较矩阵

标度含义
1同样重要
3稍微重要
5明显重要
7强烈重要
9极端重要
2,4,6,8判断中值
倒数反过来比较

根据已建立的模型,通过查找资料,并对大量数据进行分析,得到如下成对比较矩阵。(数据来源于参考文献)
1)C层:以 Z {Z} Z为目标,你认为 C i 比 C j {Ci比Cj} CiCj重要多少?
C Z = C 5 × C 5 = [ 1 1 2 4 3 3 2 1 7 5 5 1 4 1 7 1 1 2 1 3 1 3 1 5 2 1 1 1 3 1 5 3 1 1 ] 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} CZ=C5×C5=1241313121171515147123352111353111

2)P层:以 C 1 {C_{1}} C1为目标,你认为 P i 比 P j {Pi比Pj} PiPj重要多少?
P A 1 = P 3 × P 3 = [ 1 2 5 1 2 1 2 1 5 1 2 1 ] 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} PA1=P3×P3=121512121521

同理,分别以 A 2 − 5 {A_{2-5}} A25为目标,你认为 B i 比 B j {Bi比Bj} BiBj重要多少?
P A 2 = [ 1 1 3 1 8 3 1 1 3 8 3 1 ] P A 3 = [ 1 1 3 1 1 3 1 3 1 3 1 ] P A 4 = [ 1 3 4 1 3 1 1 1 4 1 1 ] P A 5 = [ 1 1 1 4 1 1 1 4 4 4 1 ] 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} PA2=138311381311PA3=11311131331PA4=13141311411PA5=11411441411

  • 计算权重向量&一致性检验
    ①A的列向量归一化
    ②求行和,然后归一化得到权重向量w
    ③根据特征值定义求得w对应特征值,即为最大特征值λ(近似)。
    w = [ 0.263 0.475 0.055 0.090 0.110 ] w=\begin{bmatrix} 0.263 \\ 0.475 \\ 0.055 \\ 0.090 \\ 0.110 \end{bmatrix} w=0.2630.4750.0550.0900.110
    λ = 5.073 \lambda=5.073 λ=5.073
    一致性指标,nXn矩阵:CI = (λ-n)/(n-1)
    C I = 5.073 − 5 5 − 1 = 0.018 CI= \frac{5.073-5}{5-1}=0.018 CI=515.0735=0.018
    随机一致性指标(查表)nXn矩阵
    R I = 1.12 RI=1.12 RI=1.12
    一致性比率,不通过要重新构建成对比较矩阵
    C R = C I R I = 0.018 1.12 = 0.016 < 0.1 ( 通 过 一 致 性 检 验 ) CR=\frac{CI}{RI}=\frac{0.018}{1.12}=0.016<0.1(通过一致性检验) CR=RICI=1.120.018=0.016<0.1(
n1234567891011
RI000.580.901.121.241.321.411.451.491.51

:按照相同方法计算 B 1 − 5 {B_{1-5}} B15权重向量和对应特征值,并分析一致性。

  • 计算组合权重向量
    目标:求方案层 B 1 , B 2 , B 3 {B1, B2, B3} B1,B2,B3分别对于目标层 Z {Z} Z的权重
    举例 B 1 {B1} B1对于 A 1 , A 2 , A 3 , A 4 , A 5 {A1, A2, A3, A4, A5} A1,A2,A3,A4,A5的权重分别乘以 A 1 , A 2 , A 3 , A 4 , A 5 {A1, A2, A3, A4, A5} A1,A2,A3,A4,A5相对于 Z {Z} Z的权重。
    B 1 → Z = 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 B1Z=0.595×0.263+0.082×0.475+0.429×0.055+0.633×0.099+0.166×0.110=0.3

根据上理,分别求出 B 对 Z {B对Z} BZ权重即可
(不知不觉写了好多推导过程,虽然都是参考别人的,但还是耗费太多时间,后面我尽量减少过程,直接建模)

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家企业 x 1 , x 2 , x 3 , x 4 {x_{1}, x_{2}, x_{3}, x_{4}} x1,x2,x3,x4,分别有5项属性 产值(万元),投资成本(万元),销售额(万元), 国家收益比重, 环境污染程度。
产值u1投资成本u2销售额u3国家收益比重u4环境污染程度u5
x 1 {x_{1}} x18350530061350.820.17
x 2 {x_{2}} x27455495265270.650.13
x 3 {x_{3}} x311000800190080.590.15
x 4 {x_{4}} x49624500088920.740.28

现对数据进行归一化处理
不同数据,不同归一算法。
效 益 型 : r i j = a i j m a x ( a i j ) 或 r i j = a i j − m i n ( a i j ) m a x ( a i j ) − m i n ( a i j ) 效益型: r_{ij}= \frac{a_{ij}}{max(a_{ij})} 或 r_{ij}= \frac{a_{ij}-min(a_{ij})}{max(a_{ij})-min(a_{ij})} rij=max(aij)aijrij=max(aij)min(aij)aijmin(aij)

成 本 型 : r i j = m i n ( a i j ) a i j 或 r i j = m a x ( a i j ) − a i j m a x ( a i j ) − m i n ( a i j ) 成本型: r_{ij}= \frac{min(a_{ij})}{a_{ij}} 或 r_{ij}= \frac{max(a_{ij})-a_{ij}}{max(a_{ij})-min(a_{ij})} rij=aijmin(aij)rij=max(aij)min(aij)max(aij)aij

固 定 型 : r i j = 1 − a i j − α j m a x ( ∣ a i j − α j ∣ ) ( α j 为 固 定 标 准 ) 固定型: r_{ij}= 1- \frac{a_{ij} - \alpha_{j}}{max(|a_{ij}-\alpha_{j}|)}(\alpha_{j} 为固定标准) rij=1max(aijαj)aijαj(αj

偏 离 型 : r i j = ∣ a i j − β j ∣ − m i n ( ∣ a i j − β j ∣ ) m a x ( ∣ a i j − β j ∣ ) − m i n ( ∣ a i j − β j ∣ ) 偏离型: r_{ij}= |a_{ij}-\beta_{j}| -\frac{min(|a_{ij}-\beta_{j}|)}{max(|a_{ij}-\beta_{j}|)-min(|a_{ij}-\beta_{j}|)} rij=aijβjmax(aijβj)min(aijβj)min(aijβj)

区 间 型 : r i j = { 1 − m a x ( q 1 j − a i j , a i j − q 2 j ) m a x [ q 1 j − m i n ( a i j ) , m a x ( a i j ) − q 2 j ] , a i j ∉ [ q 1 j , q 2 j ] 1 , a i j ∈ [ q 1 j , q 2 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. rij=1max[q1jmin(aij),max(aij)q2j]max(q1jaij,aijq2j),aij/[q1j,q2j]1,aij[q1j,q2j]

偏 离 区 间 型 : r i j = { m a x ( q 1 j − a i j , a i j − q 2 j ) m a x [ q 1 j − m i n ( a i j ) , m a x ( a i j ) − q 2 j ] , a i j ∉ [ q 1 j , q 2 j ] 1 , a i j ∈ [ q 1 j , q 2 j ] 偏离区间型: 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. rij=max[q1jmin(aij),max(aij)q2j]max(q1jaij,aijq2j),aij/[q1j,q2j]1,aij[q1j,q2j]
易知,投资成本u2和污染程度u5为成本型,其余为效益型,得到归一后数据

产值u1投资成本u2销售额u3国家收益比重u4环境污染程度u5
x 1 {x_{1}} x10.74550.93940.68111.00000.7647
x 2 {x_{2}} x20.67771.00000.72460.79261.0000
x 3 {x_{3}} x31.00000.61891.00000.71950.8667
x 4 {x_{4}} x40.87490.99040.98710.90240.4643
  • 计算属性权重
    和①一样,构造成对比较矩阵,然后计算权重向量。
    u 1 到 u 5 权 重 为 [ 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} u1u5[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源码

  • 6
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值