当前位置: 首页 > news >正文

数学建模模型算法-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、特征值法求权重

http://www.mrgr.cn/news/70750.html

相关文章:

  • 如何在Ubuntu上安装和配置Git
  • java中json字符串键值获取
  • Python语言的编程范式
  • Unity Protobuf实践
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • C# 与 Windows API 交互的“秘密武器”:结构体和联合体
  • 自动渗透测试与手动渗透测试
  • springboot和vue:十六、JWT跨域认证代码(Cookie、Session、Token)
  • 深入浅出JUC常用同步器
  • 【漏洞复现】用友 U8CRM leadconversion.php Sql注入漏洞
  • 基于STM32U575RIT6智能除湿器项目
  • 【星闪EBM-H63开发板】AT固件的配置与测试
  • 121页PPT | 企业战略规划全景:战略设计、工具、模板和分析方法
  • JAVA完成猜数字小游戏
  • python练习-Django web入门
  • STM32:ADC
  • 万字长文解读机器学习——决策树
  • [C++]——位图与布隆过滤器
  • Rust 模板匹配——根据指定图片查找处于大图中的位置(支持GPU加速)
  • APP封装系统 app误报毒app可上传 自动实现5分钟随机更换包名和签名
  • VMnet NAT模式配置
  • Perfetto中如何使用SQL语句
  • MutationObserver与IntersectionObserver的区别
  • IEEE JSSC更新|Tiny Tapeout:让每个人都能设计定制芯片
  • 【C】一文速学----线程池原理与实战
  • 【计算机网络】网络框架