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

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 A1A4 四架飞机(即 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 评价法的步骤如下:

  1. 对每个指标 f i j f_{ij} fij 进行处理,使得处理后的指标都是极大型指标,仍用 f i j f_{ij} fij 表示。无需归一化、无量纲化。

极大型指标指的是值越大越好的指标,如效率、产能、可靠性等,又称“效益型指标”。相对地,极小型指标指的是值越小越好的指标,如能耗、费用等,又称“成本性指标”。还有一类中间型指标,其值太大太小都不好,位于一个区间才合适,例如人的 BMI。

  1. 对每个指标确定正理想解 f j + = max ⁡ 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{+}}={\max\limits_{1\le i\le n}(}{{f}_{ij}}) fj+=1inmax(fij) ,以及负理想解 f j − = min ⁡ 1 ≤ i ≤ n ( f i j ) {{f}_{j}^{-}}={\min\limits_{1\le i\le n}(}{{f}_{ij}}) fj=1inmin(fij)
  2. 对于每个方案,计算 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=1mfj+fjwj(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=1jmmax(fj+fjwj(fj+fij))这里 w j w_j wj 是给每个标注取的权重,默认情况下那么都取 1 / m 1/m 1/m
  3. 计算每个方案的 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×SS+SiS++(1v)×RR+RiR+其中,
    • S + = min ⁡ 1 ≤ i ≤ n ( S i ) S^+=\min\limits_{1\leq i\leq n}(S_i) S+=1inmin(Si) S − = max ⁡ 1 ≤ i ≤ n ( S i ) S^-=\max\limits_{1\leq i\leq n}(S_i) S=1inmax(Si) R + = min ⁡ 1 ≤ i ≤ n ( R i ) R^+=\min\limits_{1\leq i\leq n}(R_i) R+=1inmin(Ri) R − = max ⁡ 1 ≤ i ≤ n ( R i ) R^-=\max\limits_{1\leq i\leq n}(R_i) R=1inmax(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 可能适合拿来灵敏度分析。
  4. 对这个 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 归根到底其实属于一种综合评价方法。说到综合评价方法&#xff0c;TOPSIS&#xff08;结合熵权法使用&#xff09;、灰色关联度分析、秩和比法等方法你应该耳熟能详。Vikor 未必比这些方法更出色&#xff0c;但是可以拓展我们的视野。…...

计算机网络八股总结

这里写目录标题 网络模型划分&#xff08;五层和七层&#xff09;及每一层的功能五层网络模型七层网络模型&#xff08;OSI模型&#xff09; 三次握手和四次挥手具体过程及原因三次握手四次挥手 TCP/IP协议组成UDP协议与TCP/IP协议的区别Http协议相关知识网络地址&#xff0c;子…...

AMD CMD UMD CommonJs ESM 的历史和区别

这几个东西都是用于定义模块规范的。有些资料会提及到这些概念&#xff0c;不理清楚非常容易困惑。 ESM&#xff08;ES Module&#xff09; 这个实际上我们是最熟悉的&#xff0c;就是ES6的模块功能。出的最晚&#xff0c;因为是官方出品&#xff0c;所以大势所趋&#xff0c…...

人工智能数据基础之微积分入门-学习篇

目录 导数概念常见导数和激活导数python代码绘制激活函数微分概念和法则、积分概念微积分切线切面代码生成案例链式求导法则反向传播算法(重要) 一、概念 二、常见导数及激活导数 常见激活函数及其导数公式&#xff1a; 在神经网络中&#xff0c;激活函数用于引入非线性因素&…...

【PSINS】ZUPT代码解析(PSINS_SINS_ZUPT)|MATLAB

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

多态(上)【C++】

文章目录 多态的概念多态的实现多态产生的条件什么是虚函数&#xff1f;虚函数的重写和协变重写协变 析构函数的重写为什么有必要要让析构函数构成重写&#xff1f; 多态的概念 C中的多态是面向对象编程&#xff08;OOP&#xff09;的一个核心特性&#xff0c;指的是同一个接口…...

如何驱动一枚30年前的音源芯片,YMF288驱动手记 Part2

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

yarn webpack脚手架 react+ts搭建项目

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

防蓝光护眼灯有用吗?五款防蓝光效果好的护眼台灯推荐

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

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 是一种结合开发&#xff08;Development&#xff09;与运维&#xff08;Operations&#xff09;的方法论&#xff0c;旨在通过工具和文化变革&#xff0c;促进软件开发和运维之间的协作&#xff0c;提升软件交付的效率、质量和稳定性。…...

单体架构系统是不是已经彻底死亡?

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

mathorcup发邮件:参赛必看邮件撰写技巧?

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

ESP01烧入AT出厂固件

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

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽

一、概念 Qt 的信号与槽&#xff08;Signals and Slots&#xff09;机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信&#xff0c;从而提升了代码的模块化和可维护性。 信号&#xff08;Signal&#xff09;&#xff1a;对象状态的变化或事件…...

民间故事推广系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;民族文化管理&#xff0c;节日类型管理&#xff0c;传统节日管理&#xff0c;故事类型管理&#xff0c;民间故事管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…...

关于武汉芯景科技有限公司的IIC缓冲器芯片XJ4307开发指南(兼容LTC4307)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.总线超时&#xff0c;自动断开连接 当 SDAOUT 或 SCLOUT 为低电平时&#xff0c;将启动内部定时器。定时器仅在相应输入变为高电平时重置。如果在 30ms &#xff08;典型值&#xff09; 内没有变为高…...

C++ 异常

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

ST官方 VSCode 插件安装及配置工程参考

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

使用Pandas读取和写入数据库的Python函数实现

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

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...