数学建模模型算法-Python实现
一、评价决策类
1、层次分析法(AHP)
层次分析法用来评价或选择一个更好更优的决策或方案
通过找到可以衡量其好坏的指标,进而衡量指标,再形成评价体系
归一化处理
让指标在同一数量级,且保证在同一指标下其差距保持不变
操作:指标的数组[a b c]归一化处理得到[ a/(a+b+c) , b/(a+b+c) , c/(a+b+c) ]
但实际上每个指标的重要性是不同的,可以给每个指标上加上一个权重
而如何科学的设定权重,则体现出层次分析法的主要作用
层次分析法是对一些较复杂模糊的问题作出决策的简易方法,其适用于难以完全定量分析的问题
模型原理
首先要把问题条理化、层次化,构造出一个有层次的结构模型。复杂问题被分解为元素的组成部分,上一层次的元素作为准则对下一层次有关元素起支配作用
层次可以分为三类:最高层、中间层、最底层
基本步骤
其中第二步构造判断矩阵,要对指标的重要性进行两两比较
矩阵中的元素aij的意义为:第i个指标相对于第j个指标的重要程度
依次对变量进行两两比较,得到完整的判断矩阵
而因为两两比较的过程中忽略了其他因素,导致最后的结果可能出现矛盾
所以需要一致性检验
一致性检验
求权重
Ⅰ.算数平均法
①用每一个元素除以所在列的和
② 每一行相加
③得出的一列数据除以n
Ⅱ.几何平均法
①根据n来开根号
②用每一个开根号后的元素除以所在列的和
Ⅲ.特征值法
求评分
Python代码
在数学建模中最常用的三个库:Numpy、Pandas、Matplotlib
Numpy
Numpy是Python中用于科学计算和数值操作的基础库,其提供了很多高性能的多维数组对象和用于处理数组的各种函数
Pandas
用来提供高性能,易于使用的数据结构和数据分析工具所用的库
Matplotlib
创建可视化的库,也就是用来绘图的
#1、一致性检验
import numpy as np#as np是将numpy库名命名为np,这样在使用的时候更加方便
#定义矩阵A
#np.array是NumPy库中的一个函数,用于创建数组,它可以将输入的对象(列表元组其他数组等)转换为NumPy数组
A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])#二维数组作矩阵
n=A.shape[0]#shape获取形状信息,获取A的行,1为获取A的列
#求最大特征值以及对应的特征向量
#np.linalg.eig是NumPy库中的一个函数,用于计算方阵的特征值和特征向量
#eig_val特征值,eig_vec特征向量
eig_val,eig_vec=np.linalg.eig(A)
Max_eig=max(eig_val)#求特征值最大值
CI=(Max_eig-n)/(n-1)
#这里n=2时,一定为一致矩阵,所以CI=0,为了避免分母为0,将这里的第二个元素改为了很接近0的正整数
RI=[0,0.0001,0.52,0.89,1.12,1.26,1.36,1.41,1.46,1.49,1.52,1.54,1.56,1.58,1.59]#这里RI最多支持n=15
CR=CI/RI[n-1]
print('一致性指标CI=',CI)
print('一致性比例CR=',CR)
if CR<0.10:
print('因为CR<0.10,所以该判断矩阵A的一致性可以接受')
else:
print('注意:CR>=0.10,因此该判断矩阵A需要进行修改')
#2、算数平均法求权重
import numpy as np
A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])
#计算每一列的和
#no.sum函数可以计算一维数组中所有元素的总和
#可以通过指定axis参数来计算多维数组在某个维度上的元素总和
#例如在二维数组中,axis=0表示按列计算总和,axis=1表示按行计算
ASum=np.sum(A,axis=0)
n=A.shape[0]#shape获取形状信息,获取A的行,1为获取A的列
#归一化,二维数组除以一维数组,会自动将一维数组扩展为与二维数组相同的形状,然后进行逐元素的除法运算
Stand_A=A/ASum
#各列相加到同一行
ASumr=np.sum(Stand_A,axis=1)
#计算权重向量
weights=ASumr/n
print(weights)
#3、几何平均法求权重
import numpy as np
A=np.array([[1,2,3,5],[1/2,1,1/2,2],[1/3,2,1,2],[1/5,1/2,1/2,1]])
#将A中的每一行元素相乘得到一列向量
#np.prod函数可以计算一维数组中所有元素的乘积
prod_A=np.prod(A,axis=1)
n=A.shape[0]
#将新的向量的每个分量开n次方
#np.power函数可以对数组中的元素进行幂运算
prod_n_A=np.power(prod_A,1/n)
#归一化
re_prod_A=prod_n_A/np.sum(prod_n_A)
print(re_prod_A)
#4、特征值法求权重
2、优劣解距离法(Topsis)
Topsis法是常用的综合评价法,其结果能精确的反应各评价方案之间的差距
其引入两个基本概念:
理想解:最优的解(方案),各个属性都达到了备选方案中的最好值
负理想解:最劣的解(方案),各个属性都达到了备选方案中的最坏值
Topsis法通过最接近理想解且最远离负理想解来确定最优选择
原始矩阵正向化
将所有指标类型转换为极大型指标
正向化矩阵后,要将矩阵标准化
正向化矩阵标准化
标准化的目的在于消除不同指标量纲的影响
计算得分并归一化
模型原理
Topsis在多目标决策分析中是一种非常有效的方法。通过归一化后的矩阵,找出理想解和负理想解,分别计算各个目标与理想解和负理想解的距离,获得各个目标和理想解的贴进度,按照贴进度的大小排序,以此作为评价目标优劣的依据。
贴进度取值在0~1之间,值越接近1,则目标越接近最有水平
基本步骤
Python代码