数学建模学习笔记(1)

摘要: 配置环境 我准备以VSCode+Jupyter组合进行数学建模的学习 1、vscode 中扩展找到 jupyter 或 ctrl+shift+p 调出命令 1 Install the Jupyter extension 2、安装 jupyter 包 在终端输入命令,安装 jupyter 包 pip install jupyter 3、启动 jupyter 在终端输入命令,启动 jupyter …

配置环境

我准备以VSCode+Jupyter组合进行数学建模的学习

1、vscode 中扩展找到 jupyter

或 ctrl+shift+p 调出命令

1
Install the Jupyter extension 

2、安装 jupyter 包

在终端输入命令,安装 jupyter 包 pip install jupyter

3、启动 jupyter

在终端输入命令,启动 jupyter jupyter notebook

评价决策类-层次分析法

用层次分析法的套路

Step1:解决评价类问题

Step2:画出层级结构图(目标层、准则层、方案层)

Step3:构造判断矩阵(确定评价指标孰重孰轻)

Step4:依照评价指标对各个方案进行打分

Step5:求出权重,填表,求得最后得分

Step6:层次总排序一致性检验

一、背景

日常生活中有很多的决策问题。决策是指在面临多种方案时需要依据一定的标准选择某一种方案。

买衣服,一般要依据质量、颜色、价格、款式等方面的因素选择。

旅游,是去风光秀丽的苏州,还是去迷人的北戴河,或者是去山水甲天下的桂林,那一般会依据景色、费用、食宿条件、旅途等因素来判断去哪个地方

二、构造判断矩阵

标度 含义
1 表示两个因素相比,具有同样重要性
3 表示两个因素相比,一个因素比另一个因素稍微重要
5 表示两个因素相比,一个因素比另一个因素明显重要
7 表示两个因素相比,一个因素比另一个因素强烈重要
9 表示两个因素相比,一个因素比另一个因素极端重要
2,4,6,8 上述两相邻判断的中值

以此来构造判断矩阵

如果构造的判断表格下:

因素A 因素B 因素C
因素A 1 1/2 1/4
因素B 2 1 1/2
因素C 4 2 1

那么可以得到判断矩阵:

$$ \begin{bmatrix} 1 & \frac{1}{2} & \frac{1}{4}\\ 2 & 1 & \frac{1}{2} \\ 4 & 2 & 1 \\ \end{bmatrix} $$$$ 其中,矩阵元素a_{ij}的含义是第i个指标相对第j个指标的重要程度,即a_{ij}=\frac{i的重要程度}{j的重要程度} $$

三、一致性检验

为了防止两两比较中出现矛盾,需要对矩阵进行一致性检验。

一致性矩阵

$$ 若矩阵满足a_{ij}\cdot a_{jk} = a_{ik},则该矩阵为一致性矩阵 $$

一致性检验步骤

1、计算一致性指标CI
$$ CI = \frac{\lambda_{max}-n}{n-1} $$

其中n代表矩阵的维数,lambda_max代表最大特征值。CI越靠近0,矩阵的一致性越好

2、查表
n 1 2 3 4 5 6 7 8 9 10
RI 0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49
3、计算一致性比例
$$ CR = \frac{CI}{RI} \left \{ \begin{array}{ll} 0,& 判断为一致矩阵\\ <0.1,& 判断矩阵一致\\ \geq0.1,& 判断矩阵不一致 \end{array} \right. $$

四、求权重

通常使用特征值法求权重。

对通过一致性检验的矩阵的判断矩阵,选择最大特征值对应的特征向量,进行归一化处理,得到的列向量的每个元素就是每个因素对应的权重。

五、代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import numpy as np

A = np.array([[1, 2, 3, 5], [1/2, 1, 1/2, 2], [1/3, 2, 1, 3], [1/5, 1/2, 1/2, 1]])
#定义一个矩阵A

n = A.shape[0]
#矩阵A的阶数

eig_val, eig_vec = np.linalg.eig(A)
#求A的特征值(eig_val)和特征向量(eig_vec)

MAX_eig_val = max(eig_val)
#求特征值的最大值

CI = (MAX_eig_val - n)/(n-1)
#计算一致性指标CI

RI = [0, 0, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49]
#定义RI表

CR = CI/RI[n-1]
#计算一致性比例CR

print(CR)

if CR < 0.1:
    print("一致性检验通过")
    MAX_eig_index = np.argmax(eig_val)
    #求特征值的最大值的下标

    MAX_eig_vec = eig_vec[:, MAX_eig_index]
    #求特征值的最大值对应的特征向量

    weights = MAX_eig_vec/ np.sum(MAX_eig_vec)
    #归一化处理,求权重

    print(weights)
    
else:
    print("一致性检验未通过")
    

博客由 Hugo 强力驱动,主题采用由 Jimmy 设计的 Stack ,并由 lamaper 个性化修改。