Python 数学建模——Vikor 多标准决策方法
文章目录
- 前言
- 原理
- 步骤
- 代码实例
前言
Vikor 归根到底其实属于一种综合评价方法。说到综合评价方法,TOPSIS(结合熵权法使用)、灰色关联度分析、秩和比法等方法你应该耳熟能详。Vikor 未必比这些方法更出色,但是可以拓展我们的视野。接下来先介绍 Vikor 方法的原理,再结合一个例子使用 Vikor 方法进行 Python 建模。
原理
Vikor 方法是一种基于多个标准,选择最好的(折中的)策略的方法。非常类似于 TOPSIS 综合评价方法。
多标准决策(MCDM)问题描述为:现有 n n n 个可行方案,每个方案均有 m m m 个指标,用 f i j f_{ij} fij 表示第 i i i 个方案的第 j j j 个指标。现在要求出多准则意义上的最佳(折衷)解决方案。例如,现在有 A 1 − A 4 A_1-A_4 A1−A4 四架飞机(即 n = 4 n=4 n=4),每架飞机有 m = 6 m=6 m=6 个指标,如下表所示,请你选出多准则意义上最好的飞机。
飞机编号 | 最大速度 | 飞行半径 | 最大负载 | 费用 | 可靠性 | 灵敏度 |
---|---|---|---|---|---|---|
A 1 A_1 A1 | 2.0 2.0 2.0 | 1500 1500 1500 | 20000 20000 20000 | 5500000 5500000 5500000 | 0.5 0.5 0.5 | 1 1 1 |
A 2 A_2 A2 | 2.5 2.5 2.5 | 2700 2700 2700 | 18000 18000 18000 | 6500000 6500000 6500000 | 0.3 0.3 0.3 | 0.5 0.5 0.5 |
A 3 A_3 A3 | 1.8 1.8 1.8 | 2000 2000 2000 | 21000 21000 21000 | 4500000 4500000 4500000 | 0.7 0.7 0.7 | 0.7 0.7 0.7 |
A 4 A_4 A4 | 2.2 2.2 2.2 | 1800 1800 1800 | 20000 20000 20000 | 5000000 5000000 5000000 | 0.5 0.5 0.5 | 0.5 0.5 0.5 |
这是司守奎等的《Python 数学实验与建模》上的一个例题。
步骤
Vikor 评价法的步骤如下:
- 对每个指标 f i j f_{ij} fij 进行处理,使得处理后的指标都是极大型指标,仍用 f i j f_{ij} fij 表示。无需归一化、无量纲化。
极大型指标指的是值越大越好的指标,如效率、产能、可靠性等,又称“效益型指标”。相对地,极小型指标指的是值越小越好的指标,如能耗、费用等,又称“成本性指标”。还有一类中间型指标,其值太大太小都不好,位于一个区间才合适,例如人的 BMI。
- 对每个指标确定正理想解 f j + = max 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{+}}={\max\limits_{1\le i\le n}(}{{f}_{ij}}) fj+=1≤i≤nmax(fij) ,以及负理想解 f j − = min 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{-}}={\min\limits_{1\le i\le n}(}{{f}_{ij}}) fj−=1≤i≤nmin(fij)。
- 对于每个方案,计算 S S S 值(综合距离,表示方案与正理想解之间的综合距离)和 R R R 值(个体最大距离,表示方案在最不利标准下与正理想解之间的距离): S i = ∑ j = 1 m w j ( f j + − f i j ) f j + − f j − S_i=\sum_{j=1}^{m}{\cfrac{w_j(f_j^+-f_{ij})}{f_j^+-f_j^-}} Si=j=1∑mfj+−fj−wj(fj+−fij) R i = max 1 ≤ j ≤ m ( w j ( f j + − f i j ) f j + − f j − ) R_i=\max\limits_{1\leq j\leq m}\left(\cfrac{w_j(f_j^+-f_{ij})}{f_j^+-f_j^-}\right) Ri=1≤j≤mmax(fj+−fj−wj(fj+−fij))这里 w j w_j wj 是给每个标注取的权重,默认情况下那么都取 1 / m 1/m 1/m。
- 计算每个方案的 Q Q Q 值,这个值是综合所有方案的 S S S 值与 R R R 值得出的结果: Q i = v × S i − S + S − − S + + ( 1 − v ) × R i − R + R − − R + {{Q}_{i}}=v\times \frac{{{S}_{i}}-{{S}^{+}}}{{{S}^{-}}-{{S}^{+}}}+(1-v)\times \frac{{{R}_{i}}-{{R}^{+}}}{{{R}^{-}}-{{R}^{+}}} Qi=v×S−−S+Si−S++(1−v)×R−−R+Ri−R+其中,
- S + = min 1 ≤ i ≤ n ( S i ) S^+=\min\limits_{1\leq i\leq n}(S_i) S+=1≤i≤nmin(Si), S − = max 1 ≤ i ≤ n ( S i ) S^-=\max\limits_{1\leq i\leq n}(S_i) S−=1≤i≤nmax(Si), R + = min 1 ≤ i ≤ n ( R i ) R^+=\min\limits_{1\leq i\leq n}(R_i) R+=1≤i≤nmin(Ri), R − = max 1 ≤ i ≤ n ( R i ) R^-=\max\limits_{1\leq i\leq n}(R_i) R−=1≤i≤nmax(Ri)。
- v v v 是一个在 0 0 0 到 1 1 1 之间的权重,通常取 0.5 0.5 0.5,表示 S S S 值和 R R R 值的平衡。当 v > 0.5 v>0.5 v>0.5 时,表示根据最大群体效用的决策机制进行决策;当 v < 0.5 v<0.5 v<0.5 时,表示根据最小个体遗憾的决策机制进行决策。数学建模时,这个 v v v 可能适合拿来灵敏度分析。
- 对这个 Q Q Q 值进行升序排序,就是各个方案的最终排名。一般取 Q Q Q 值最小的为最优。
参考文献:VIKOR方法_vikor方法简介-CSDN博客
代码实例
就使用上面评价飞机的那个例子。首先观察到费用是一个极小型指标,需要极大化。书上直接给出了使用比例变换法将所有指标极大归一化的结果,因此下面的代码中直接使用这个结果:
import pandas as pd
import numpy as np
from sklearn import preprocessing
import matplotlib.pyplot as plt# 这个就是极大归一化后的数据
data = pd.DataFrame([[0.8,0.5556,0.9524,0.8182,0.7143,1],[1,1,0.8571,0.6923,0.4286,0.5],[0.72,0.7407,1,1,1,0.7],[0.88,0.6667,0.9524,0.9,0.7143,0.5]])# 确定正负理想解
f_best = data.max(axis = 0)
f_worst = data.min(axis = 0)
# 计算 S 和 R
S = []
R = []
for i in range(data.index.size):S.append(sum((f_best - data.iloc[i,:])/(f_best - f_worst))/data.columns.size)R.append(max((f_best - data.iloc[i,:])/(f_best - f_worst))/data.columns.size)# 计算 Q
S = np.array(S)
R = np.array(R)
qq = [[],[],[],[]]
v_arr = np.linspace(0,1,1000)
for v in v_arr:Q = 0if(S.max() - S.min() != 0):Q += v * (S - S.min()) / (S.max() - S.min())if(R.max() - R.min() != 0):Q += (1 - v) * (R - R.min()) / (R.max() - R.min())for i in range(len(Q)):qq[i].append(Q[i])# 作图部分
plt.rc('text',usetex = True)
plt.plot(v_arr,qq[0],label = '$A_1$')
plt.plot(v_arr,qq[1],label = '$A_2$')
plt.plot(v_arr,qq[2],label = '$A_3$')
plt.plot(v_arr,qq[3],label = '$A_4$')
plt.xlabel('$v$')
plt.ylabel('$Q_i$')
plt.legend()
plt.show()
上面的代码,我尝试了 ( 0 , 1 ) (0,1) (0,1) 中的许多 v v v 值,作出了 Q i ( i = 1 , 2 , 3 , 4 ) Q_i(i=1,2,3,4) Qi(i=1,2,3,4) 关于 v v v 的图线,如下图所示:

可以看出,无论 v v v 怎么选,结果都是固定的: A 3 > A 1 > A 4 > A 2 {{A}_{3}}>{{A}_{1}}>{{A}_{4}}>{{A}_{2}} A3>A1>A4>A2。这和熵权法的结果一样,而 TOPSIS 的结果是 A 3 > A 1 > A 2 > A 4 {{A}_{3}}>{{A}_{1}}>{{A}_{2}}>{{A}_{4}} A3>A1>A2>A4。总而言之 Vikor 还是个比较不错的方法。
相关文章:

Python 数学建模——Vikor 多标准决策方法
文章目录 前言原理步骤代码实例 前言 Vikor 归根到底其实属于一种综合评价方法。说到综合评价方法,TOPSIS(结合熵权法使用)、灰色关联度分析、秩和比法等方法你应该耳熟能详。Vikor 未必比这些方法更出色,但是可以拓展我们的视野。…...

计算机网络八股总结
这里写目录标题 网络模型划分(五层和七层)及每一层的功能五层网络模型七层网络模型(OSI模型) 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址,子…...

AMD CMD UMD CommonJs ESM 的历史和区别
这几个东西都是用于定义模块规范的。有些资料会提及到这些概念,不理清楚非常容易困惑。 ESM(ES Module) 这个实际上我们是最熟悉的,就是ES6的模块功能。出的最晚,因为是官方出品,所以大势所趋,…...

人工智能数据基础之微积分入门-学习篇
目录 导数概念常见导数和激活导数python代码绘制激活函数微分概念和法则、积分概念微积分切线切面代码生成案例链式求导法则反向传播算法(重要) 一、概念 二、常见导数及激活导数 常见激活函数及其导数公式: 在神经网络中,激活函数用于引入非线性因素&…...

【PSINS】ZUPT代码解析(PSINS_SINS_ZUPT)|MATLAB
这篇文章写关于PSINS_SINS_ZUPT的相关解析。【值得注意的是】:例程里面给的这个m文件的代码,并没有使用ZUPT的相关技术,只是一个速度观测的EKF 简述程序作用 主要作用是进行基于零速更新(ZUPT)的惯性导航系统(INS)仿真和滤波 什么是ZUPT ZUPT是Zero Velocity Update(…...

多态(上)【C++】
文章目录 多态的概念多态的实现多态产生的条件什么是虚函数?虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写? 多态的概念 C中的多态是面向对象编程(OOP)的一个核心特性,指的是同一个接口…...

如何驱动一枚30年前的音源芯片,YMF288驱动手记 Part2
一些问题 在上一篇里面虽然策划了想要驱动YMF288所需要做的事情以及目标。但是,在板子打出来后,我在进一步的研究中,发现我犯了个错误,那就是YMF288并不是使用现在很多轻量化的嵌入式,比如ESP32常用的I2S协议的&#x…...

yarn webpack脚手架 react+ts搭建项目
安装 Yarn 首先,确保你已经安装了 Node.js 和 Yarn。如果还没有安装 Yarn,可以通过以下命令安装: npm install -g yarn创建项目 使用 create-react-app 脚手架创建一个带有 TypeScript 的项目,node更新到最新版,并指定…...

防蓝光护眼灯有用吗?五款防蓝光效果好的护眼台灯推荐
现在孩子的很多兴趣班和课后辅导班都是在线上举行,通常对着手机电脑长时间。电子产品有大量蓝光和辐射,会伤害到孩子的眼睛。但为了学习,也是没办法。护眼台灯的出现可以让孩子们的眼睛得到保护,防止蓝光对眼睛的伤害。防蓝光护眼…...

Mac使用Elasticsearch
下载 Past Releases of Elastic Stack Software | Elastic 解压tar -xzvf elasticsearch-8.15.1-darwin-x86_64.tar.gz 修改配置文件config/elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl: enabled: false 切换目录 cd elasticsearch-8.15.1/…...

DevOps -CI/CD 与自动化部署
DevOps - CI/CD 与自动化部署详解 DevOps 是一种结合开发(Development)与运维(Operations)的方法论,旨在通过工具和文化变革,促进软件开发和运维之间的协作,提升软件交付的效率、质量和稳定性。…...

单体架构系统是不是已经彻底死亡?
单体架构系统并未“彻底死亡”,尽管在复杂和大规模的应用场景中,它可能不再是首选的架构模式。单体架构系统,也称为巨石系统(Monolithic),在软件发展过程中是最广泛的架构风格之一,出现时间最早…...

mathorcup发邮件:参赛必看邮件撰写技巧?
mathorcup发邮件的注意事项?如何使用mathorcup发信? 无论是提交参赛作品、咨询比赛规则,还是与组委会沟通,一封清晰、专业的邮件都能为你赢得更多机会。AokSend将为你详细介绍mathorcup发邮件的撰写技巧,帮助你在比赛…...

ESP01烧入AT出厂固件
ESP01是一种常见的WIFI模块,其核心是esp8266,常用于给主控拓展WIFI功能,因其体积较小、集成度高、造价便宜,常受到消费者喜爱,ESP01常用的开发方式有两种,一种是利用基于Arduino框架作为独立设备开发&#…...

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽
一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…...

民间故事推广系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,民族文化管理,节日类型管理,传统节日管理,故事类型管理,民间故事管理,系统管理 微信端账号功能包括:系统首…...

关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)
一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时,自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时,将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms (典型值) 内没有变为高…...

C++ 异常
这里写目录标题 1.C语言传统的处理错误的方式2.C异常概念3.异常的用法3.1 异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.自定义异常体系5.标准库异常体系6.异常的优缺点 1.C语言传统的处理错误的方式 传统的错误处理机制: 1. 终止程序,…...

ST官方 VSCode 插件安装及配置工程参考
写在前头 VSCode的用法和插件是月初参加ST官方北京站举办的线下培训中,厂家AE工程师给我们讲的,不同于已经很多人用的(并且一直在吵的)keil assistant什么的,用的是CMake编译,抛弃了原有的keil,…...

使用Pandas读取和写入数据库的Python函数实现
使用Pandas读取和写入数据库的Python函数实现 Pandas是一个强大的数据处理和分析库,广泛应用于数据科学和机器学习领域。结合数据库操作,Pandas可以极大地简化数据的读取和写入过程。本文将详细介绍如何使用Pandas实现读取和写入数据库的函数,涵盖数据库连接、数据读取、数…...

Redis——常用数据类型hash
目录 hash常用命令hsethgethdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhdecrby 哈希的编码方式哈希的应用 hash 常用命令 hset HSET key field value [field value ...]//时间复杂度O(1) //返回值:设置成功的键值对的个数hget HGET key field//hdel HDEL key…...

基于Python实现一个庆祝中秋节的小程序
功能包括: 使用复杂的库来计算农历日期:可以使用 lunarcalendar 库来计算农历日期。提供更多的祝福语:可以通过随机选择祝福语来增加趣味性。加入图形用户界面 (GUI):可以使用 tkinter 库来创建一个简单的图形用户界面。 我们可…...

近期最值得买的数码好物有什么?2024兼具功能和实用性的好物分享
在如今这个科技飞速发展的时代,数码好物层出不穷,它们为我们带来了前所未有的便捷与乐趣。而对于学生党和上班族来说,挑选到既实用又性价比高的数码好物,更是能为学习和办公生活增添一抹亮丽的色彩。其中,电容笔便是备…...

云服务器中的MinIO 配置 HTTPS 过程(图文)
目录 1. 基本知识2. 实战3. 彩蛋1. 基本知识 具体证书的格式如下: 私钥:private.key公钥:public.crt (公钥以pem格式结尾,可直接改为crt格式)证书和私钥文件的命名和路径应该是: 证书文件: ~/.minio/certs/public.crt 私钥文件: ~/.minio/certs/private.key使用了自定义…...

注册安全分析报告:熊猫频道
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...

计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

2000-2021年3月海关数据库
2000-2021年3月海关数据库 1、时间:2000-2021年3月 2、指标:2000-2015数据变量包括:年份、截止日期、进出口分类代码、进出口分类名称、HS商品编码、HS商品名称、金额_美元、数量、价格、经营单位代码、经营单位名称、经营单位地址、电话、…...

【YashanDB知识库】archivelog磁盘满导致数据库abnormal
本文转自YashanDB官网,具体内容可见archivelog磁盘满导致数据库abnormal 【问题分类】功能使用 【关键字】磁盘空间满,archivelog日志,archivelog自动清理 【问题描述】数据库状态变更为abnormal,检查V$DIAG_INCIDENT视图&#…...

远程跨境传输大文件如何做到安全又稳定?
在当今全球化的商业环境中,企业跨境传输大文件的需求日益增长。这不仅涉及到数据的快速迁移,还包括了安全性、稳定性和合规性等多重挑战。本文将探讨企业在跨境传输大文件时可能遇到的问题,以及在传输过程中应注意的事项,并重点介…...

JSON报文根据正则过滤消息
有时候业务系统在接收外部传过来的JSON报文,可能需要根据某个标识来判断是否是自己系统的消息,不是需要过滤。正常我们可能是先将JSON反序列化为具体实体类(例: A a JSON.parseObject(body,A.class)),然后获取具体字段来判断。此方法面对接收…...