首页 > 其他分享 >多准则妥协解排序法(VIKOR)

多准则妥协解排序法(VIKOR)

时间:2024-08-24 21:26:03浏览次数:12  
标签:VIKOR min 准则 bi 算法 max 排序

多准则妥协解排序法(VIKOR)

多准则妥协解排序法(VIKOR)

更多算法请见这里:2024 数学建模国赛 C 题攻略(无废话版)

算法简介

VIKOR(VlseKriterijumska Optimizacija Kompromisno Resenje)评价法又称多准则妥协解排序方法,是一种用于多属性决策的方法,能够同时考虑群体效用最大化和个体遗憾最小化以及融入决策者主观偏好,因此具有更高的排序稳定性和可信度。VIKOR 方法适用于决策者不能或不知道如何准确表达其偏好、评价准则间存在冲突和不可公度(测度单位不同、处理冲突问题的决策者能够接受妥协解方案)的情形。

VIKOR 算法在国赛评价类题目中有较为广泛的应用。作为 TOPSIS 的平替,VIKOR 法具有更高的灵活性。

算法步骤

  1. 确定理想解和反理想解:根据决策目标,确定理想解和反理想解。对于最大化型指标,计算第 i i i 个指标的理想解和反理想解:
    b i ∗ = max ⁡ j b i j b i − = min ⁡ j b i j b_i^* = \max_j b_{ij}\\ b_i^- = \min_j b_{ij} bi∗​=jmax​bij​bi−​=jmin​bij​

  2. 测量群体效用与个体遗憾:计算第 j j j 个待评价对象的群体效用值 S j S_j Sj​和个体遗憾值 R j R_j Rj​。其计算公式如下:
    S j = ∑ i = 1 n w i b i ∗ − b i j b i ∗ − b i − R j = max ⁡ i w i b i ∗ − b i j b i ∗ − b i − S_j=\sum_{i=1}^{n}w_i\frac{b_i^*-b_{ij}}{b_i^*-b_{i}^{-}}\\ R_j=\max_{i}w_i\frac{b_i^*-b_{ij}}{b_i^*-b_{i}^{-}} Sj​=i=1∑n​wi​bi∗​−bi−​bi∗​−bij​​Rj​=imax​wi​bi∗​−bi−​bi∗​−bij​​
    其中 b i ∗ b_i^* bi∗​ 代表属性 i i i 下的理想解, b i − b_i^- bi−​代表属性 i i i 下的反理想解, b i j b_{ij} bij​ 代表属性 i i i 下的第 j j j 个样本, w i w_i wi​是属性 i i i 的指标权重。

  3. 计算折衷指标值:定义综合度量值 Q j Q_j Qj​,用于衡量每个备选方案的综合表现,设置一个系数 v v v 用于控制决策结果偏向于群体效用还是个体遗憾的权重, v v v 越大,结果越偏向于群体效用,反之偏向于个体遗憾。其计算公式如下:
    Q j = v S j − S ∗ S − − S ∗ + ( 1 − v ) R j − R ∗ R − − R ∗ , i = 1 , 2 , ⋯   , m Q_j=v\frac{S_j-S^*}{S^--S^*}+(1-v)\frac{R_j-R^*}{R^--R^*},i=1,2,\cdots,m Qj​=vS−−S∗Sj​−S∗​+(1−v)R−−R∗Rj​−R∗​,i=1,2,⋯,m
    其中, S ∗ = max ⁡ ( S ) , S − = min ⁡ ( S ) , R ∗ = max ⁡ ( R ) , R − = min ⁡ ( R ) S^*=\max(S),S^-=\min(S),R^*=\max(R),R^-=\min(R) S∗=max(S),S−=min(S),R∗=max(R),R−=min(R), v ∈ [ 0 , 1 ] v\in[0,1] v∈[0,1]​代表决策机制,根据决策者的个人偏好而设置。

  4. 对群体效用值 S j S_j Sj​、个体遗憾值 R j R_j Rj​、折衷值 Q j Q_j Qj​进行排序(逆序,值越小越排在前面),得到三个排序的列表 S , R , Q S,R,Q S,R,Q。

  5. 定义以下两个条件:

    记 Q Q Q中的排名第1和第2的值对应的评价对象为 A ( 1 ) A^{(1)} A(1)和 A ( 2 ) A^{(2)} A(2), Q ( A ( 1 ) ) Q(A^{(1)}) Q(A(1))和 Q ( A ( 2 ) ) Q(A^{(2)}) Q(A(2))分别为这两个评价对象对应的折衷值。

    条件1:可接受优势:

    Q ( A ( 2 ) ) − Q ( A ( 1 ) ) ≥ 1 / ( n − 1 ) Q(A^{(2)}) - Q(A^{(1)}) \geq 1/(n-1) Q(A(2))−Q(A(1))≥1/(n−1)

    条件2:可接受的稳定性:

    S ( A ( 1 ) ) S(A^{(1)}) S(A(1))在 S S S中是最小的或 R ( A ( 1 ) ) R(A^{(1)}) R(A(1))在 R R R中是最小的

  6. 最后根据以上两条件来确定最终的结果:

    • 如果同时满足条件1和条件2,那么 A ( 1 ) A^{(1)} A(1)为最终的折衷解;
    • 如果条件1满足,但条件2无法满足,则折衷解为 A ( 1 ) A^{(1)} A(1)和 A ( 2 ) A^{(2)} A(2);
    • 如果条件2满足,条件1无法满足,那么 A ( 1 ) , A ( 2 ) , ⋯   , A ( r ) A^{(1)}, A^{(2)},\cdots,A^{(r)} A(1),A(2),⋯,A(r)均为折衷解,其中 r r r的值为满足 Q ( A ( r ) ) − Q ( A ( 1 ) ) < 1 / ( n − 1 ) Q(A^{(r)}) - Q(A^{(1)}) < 1/(n-1) Q(A(r))−Q(A(1))<1/(n−1)​的最大值。

算法优点

  1. VIKOR 方法相比 TOPSIS 方法多了一个决策机制系数,它可以使决策者做出更激进或更保守的决策(调整群体效用与个体遗憾的权重)。
  2. VIKOR 方法的独特优势在于可以得到带有优先级的折衷方案,这使得通过 VIKOR 排序后的最佳方案可能不止一个。

标签:VIKOR,min,准则,bi,算法,max,排序
From: https://blog.csdn.net/qq_65799630/article/details/141505337

相关文章

  • c语言解决所有认识的排序(默认升序)
    库函数(不讲武德法)intcmp(constvoid*a,constvoid*b){   return*(int*)a-*(int*)b;} 调用qsort(nums,numsize,sizeof(int),cmp;元素什么类型自己改一下就行了。可以对a,b进行操作降序或者偶奇排序。选择排序voida(int*a,intn){  for(inti=0;i<n;......
  • C语言新手小白详细教程:冒泡排序
    ......
  • 数据结构--排序--C语言
    文章目录数据结构---排序一、排序的概念及其运用1、排序的概念2、排序运用二、常见的排序算法1、插入排序直接插入排序:希尔排序(缩小增量排序)2、选择排序直接选择排序:堆排序3、交换排序冒泡排序快速排序将区间按照基准值划分为左右两半部分的常见方式有:快速排序优......
  • 【排序算法】八大排序(下)(c语言实现)(附源码)
    ......
  • REST framework:排序过滤器的使用
    对于列表数据,RESTframework提供了OrderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序1、在setting中的REST_FRAMEWORK添加配置'DEFAULT_FILTER_BACKENDS':(#这个是指定使用django_filters中的过滤器来进行过滤'django_filters.rest_framework.DjangoFilte......
  • 八大排序一些总结
    基于比较的排序时间复杂度空间复杂度稳定性选择排序O(N^2)O(1)无冒泡排序O(N^2)O(1)有插入排序O(N^2)O(1)有归并排序O(N*logN)O(N)......
  • 每天学习一个基础算法之选择排序
    目录前言:一、选择排序的基本思路和实现方法1、基本思路2、实现方法二、选择排序的执行过程示意图三、选择排序的实现代码选择排序代码主体(以接口函数的形式)测试部分(主函数调用) 四、对选择排序复杂度的分析背景知识:1、选择排序的时间复杂度 精确计算:*采用大O......
  • 交换排序(冒泡排序和快速排序)
    一、基本思想所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。二、冒泡排序1.核心思想两两相邻的元素进行比较2.动图展示3.代码展示voidSwap(int*......
  • set 的详细用法(set 排序、set 的遍历、set 的多种倒序遍历方法、set 的基本成员函数)
    目录一:set的简介二:set的使用(要包含头文件)1.set的定义2.set的基本成员函数3.set的遍历(1)迭代器iterator(即升序输出)(2)倒序输出1.rbegin()和rend()2.当然,也可以逆向思维一下。​^^3.用greater实现降序排列三:应用基本成员函数的代码【总结】有上述代码可以看出,插......
  • (算法)计算右侧⼩于当前元素的个数————<分治-归并排序>
    1.题⽬链接:315.计算右侧⼩于当前元素的个数2.题⽬描述:3.解法(归并排序):算法思路:这⼀道题的解法与求数组中的逆序对的解法是类似的,但是这⼀道题要求的不是求总的个数,⽽是要返回⼀个数组,记录每⼀个元素的右边有多少个元素⽐⾃⼰⼩。但是在我们归并排序的过程中,元素的下......