TOPSIS与模糊Borda 的组合应用(以第二届大湾区杯和国赛为案例)

目录

一、TOPSIS(优劣解距离法)简介

二、TOPSIS(优劣解距离法)主要步骤

(1)数据进行标准化

(2)构建决策矩阵

(3)构造加权规范阵

(4)计算正负理想解

(5)计算各方案与正负理想解间的距离

(6)计算各方案与正理想解的相对贴近度

三、TOPSIS算法代码(MATLAB)

四、模糊Borda组合评价简介

五、模糊Borda组合评价步骤

(1)计算隶属度

(2)计算模糊频数

(3)计算模糊频率

(4)将排序转化为得分

(5)计算模糊Borda数FBi

六、模糊Borda组合评价代码(MATLAB)

七、案例分析

(1)2021年国赛C题

(2)2021 年第二届“大湾区杯”粤港澳金融数学建模竞赛B题

八、总结

(1)TOPSIS

(2)模糊Borda


一、TOPSIS(优劣解距离法)简介

TOPSIS法亦被称为理想解法,是一种综合评价方法,该方法能够充分利用原始数据,精确反映各评价方案之间的差距,对数据分布及其样本含量没有严格限制。能有效地解决多指标评价问题,该方法通过构造评价问题的正理想解(最优解)和负理想解(最劣解),计算每个方案到理想方案的相近贴进度,即靠近最优解和远离最劣解的程度,来对方案进行排序,从而选出最佳方案,具体流程如下图所示。

TOPSIS算法流程图

 二、TOPSIS(优劣解距离法)主要步骤

用理想解法求解多属性决策问题的概念简单,只要在属性空间定义适当的距离测度就能计算备选方案与理想解的距离。TOPSIS法所用的是欧几里得距离。至于既用最优解又用最劣解是因为在仅仅使用最优解时可能会出现某两个备选方案与最优解的距离相同的情况,为了区分这两个方案的优劣,引入最劣解并计算这两个方案与最劣解的距离,与最优解的距离相同的方案离最劣解远者为优。

(1)数据进行标准化

依据你建立的评价指标体系,建立归一化矩阵,将数据进行标准化。

 (2)构建决策矩阵

用向量规划化的方法求得规范决策矩阵。设多属性决策问题的决策矩阵A=(a_{ij})_{m\times n},规范化决策矩阵B=(b_{ij})_{m\times n},其中

 (3)构造加权规范阵

构造加权规范阵C=(c_{ij})_{m\times n}。设由决策人给定各属性的权重向量为\omega =[\omega_{1},\omega_{2},\cdots ,\omega_{n}]^{T},则

 权重可通过熵权法、FAHP、相关性等方法确定,使用熵权法确定权重,首先计算各个指标的信息熵E_{j},在通过信息熵计算各指标的权重。

 (4)计算正负理想解

确定最优解Z_{i}^{+}和最劣解Z_{i}^{-}。则

(5)计算各方案与正负理想解间的距离

计算所选取的指标与最优向量的欧氏距离和最劣向量的距离。

 (6)计算各方案与正理想解的相对贴近度

三、TOPSIS算法代码(MATLAB)

clear
clc
A=[1 2 3;4 5 6;7 8 9];%【初始矩阵,列为指标,行为方案】
[n,m]=size(A); %n为A矩阵的行数,m为A矩阵的列数
c=sqrt(sum(A.*A));
%规范化决策矩阵
d=A./c;
w=[0.33 0.33 0.33];%权重
c=w.*d;
cmax=max(c);
cmin=min(c);
for i=1:n
    c1=c(i,:)-cmax;
    s1(i)=norm(c1);
    c2=c(i,:)-cmin;
    s2(i)=norm(c2);
    T(i)=s2(i)/(s1(i)+s2(i));
end
%排名
[~,pm]=sort(T,'descend');
disp('评分结果,评分区间[0,1]')
disp(T)
disp('方案排名')
disp(pm)

四、模糊Borda组合评价简介

模糊Borda组合评价模型是在几种评价方法结果相似的前提下,通过将多个评价方法进行组合,以求得一个更有参考价值的结果。本文在使用秩和比综合评价法和TOPSIS法之后,尝试使用模糊Borda组合评价模型进行运算,以求得到效果更好的结果。

五、模糊Borda组合评价步骤

(1)计算隶属度

(2)计算模糊频数

(3)计算模糊频率

(4)将排序转化为得分

(5)计算模糊Borda数FBi

详细原理、步骤及代码见本人之前写的一篇博客,欢迎大家移步观看,这里就不过多赘述。[刨根问底] 五分钟搞懂组合评价模型—模糊Borda (以2021 年大学生数模国赛C题为例)_饲养猿的博客-CSDN博客

六、模糊Borda组合评价代码(MATLAB)

x=[ ];       %x矩阵储存各评价方法的得分,一行代表一家供应商,列代表不同的评价方法
Ma = max(x,[],2);     %求每列最大值
Mi = min(x,[],2);     %求每列最小值
for i = 1:402          %402家供应商
    for j = 1:N      %N种评价方法,记得把N改为你自己选择的评价方法数,不然会报错
        u(i,j) = ((x(i,j)-Mi(i,1))./(Ma(i,1)-Mi(i,1))).*0.9+0.1;
    end
end
B=zeros(402,402);%储存模糊频数矩阵
BB1=();%储存第一种评价方法排名
BB2=();%储存第二种评价方法排名
 
%求模糊频数矩阵
for i=1:402
    B(i,BB1(i,1))=1;
end
for j=1:402
    B(j,BB2(j,1))=1;
end
%计算模糊频率
for h = 1 : 402
    for i = 1 : 402
        p(h,i) = sum(B(h,i) .* u(i,:));
    end
end
for h = 1 : 402
    for i = 1 : 402
        w(h,i) = p(h,i) ./ sum(p(:,i));
    end
end
%计算最终得分
for h = 1 : 402
    for i = 1 : 402
        Q(h,i) = 0.5 * (402- h) * (402 - h + 1);
    end
end
Q=Q';
%计算模糊Borda数FBi,然后输出排名
FB = sum(w.*Q,2);
[a,PX]=sort(FB(end:-1:1));
PX

七、案例分析

(1)2021年国赛C题

[刨根问底] 五分钟搞懂组合评价模型—模糊Borda (以2021 年大学生数模国赛C题为例)_饲养猿的博客-CSDN博客

(2)2021 年第二届“大湾区杯”粤港澳金融数学建模竞赛B题

针对问题二,使用多元线性回归将公因子对股票走势分别进行拟合,在95%的显著性水平下,收益率与盈利能力因子、估值因子成负相关关系,收益率与成长因子成正相关关系。确定投资策略时,构建了两种选股模型。第一种基于马科维茨证券组合选择理论,计算10支股票投资组合的有效前沿曲线;第二种采用熵权-TOPSIS法对10支股票的各个季度的投资价值进行打分排名,再综合四十个季度的排名和得分做模糊Borda组合评价,立讯精密、国星光电、生益科技、顺络电子、长盈精密的综合得分相同且最高,投资价值相对来说最优。

clear;clc;
%清除变量和数据
%%
%读取数据
[x,id]=xlsread('C:\Users\86178\Desktop\数据');%读取文件
jieguo=zeros(10,41);%用来储存40个季度各股票TOPSIS得分
jieguo(:,1)=[1:10]';%用来储存股票代码
jieguo2=zeros(10,40);%用来储存40个季度各股票的得分排序
%1-10分别代表{'分众传媒';'亿纬锂能';'立讯精密';'风华高科';'国星光电';'生益科技';'德赛电池';'顺络电子';'长盈精密';'广电运通'}


%%
%划分数据
count=1;
for a = 1:40
    %提取矩阵数据
    YM = x(count:count+9,2:end);  
    
    count=count+10;
    %%
    %Topsis综合评价
    [n,m] = size(YM);
    %n代表数据,m代表6个指标
    disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标']) 
    y=[];
    %空矩阵,存储归一化后数据
    for i=1:m
        y(:,i)=YM(:,i)/sum([YM(:,i)]);
        %数据归一化
    end
    for i=1:m
        aa(i)=max(y(:,i));%最大化指标
        bb(i)=min(y(:,i));%最小化指标
    end
    dd1=zeros(n,1);
    dd2=zeros(n,1);
    for i=1:n
        for j=1:m
            maxzhi(i,j)=(y(i,j)-aa(j))^2;%计算到最优值距离
            minzhi(i,j)=(y(i,j)-bb(j))^2;%计算到最劣值距离
            dd1(i,1)=dd1(i,1)+maxzhi(i,j);
            dd2(i,1)=dd2(i,1)+minzhi(i,j);
        end
        dd1(i,1)=sqrt(dd1(i,1));%求s+,与最优解的距离
        dd2(i,1)=sqrt(dd2(i,1));%求s-,与最劣解的距离
    end
    for i=1:n
        c(i)=dd2(i,1)/(dd1(i,1)+dd2(i,1));
        %求接近程度
    end
    [xx,yy]=sort(c,'descend');%排序
    jieguo2(:,a)=yy';%将排名填入相应列
    jieguo(:,a+1)=c';%将对应得分填入相应列
    
    subplot(4,10,a)  %将图按行列号分布
    plot(jieguo(:,a+1),'LineWidth',2)
    set(gca,'yticklabel',{'0','0.2','0.4','0.6','0.8','1'})
    set(gca,'fontname','宋体','FontSize',14)
    set(gca,'xticklabel',{'0','5','10'})
    title({['YM',num2str(ceil(a))]})
    grid on
end
save('得分', 'jieguo');
save('得分排序', 'jieguo2');
 %%
 %模糊Borda
 %组合评价就是将多个评价方法的结果再算一下,得到一个更有参考价值的结果
N=zeros(10,40);
for i=1:40
    N(:,i)=jieguo(:,i+1);
end

Maxzhi = max(N,[],2);     %求每行最大值
Minzhi = min(N,[],2);     %求每行最小值
for i = 1:10          %10只股票
    for j = 1:40       %40种评价得分
        u(i,j) = ((N(i,j)-Minzhi(i,1))./(Maxzhi(i,1)-Minzhi(i,1))).*0.9+0.1;
    end
end
B=zeros(10,10);%储存模糊频数矩阵


%求模糊频数矩阵
for j=1:40
for i=1:10
    B(i,jieguo2(i,j))=1;
end
end

%计算模糊频率
for h = 1 : 10
    for i = 1 : 10
        p(h,i) = sum(B(h,i) .* u(i,:));
    end
end
for h = 1 : 10
    for i = 1 : 10
        w(h,i) = p(h,i) ./ sum(p(:,i));
    end
end

%计算最终得分
for h = 1 : 10
    for i = 1 : 10
        Q(h,i) = 0.5 * (10- h) * (10 - h + 1);
    end
end
Q=Q';

%计算模糊Borda数FBi,然后输出排名
FB = sum(w.*Q,2);
[a,PX]=sort(FB,'descend');%排序
PM=zeros(10,2);
PM(:,1)=PX;
PM(:,2)=a;

%结果可视化

figure
plot(sort(FB,'descend'),'LineWidth',2)
title('模糊Borda得分结果图','FontSize',14)
set(gca,'FontSize',12,'color','white');
az=1;

八、总结

(1)TOPSIS

TOPSIS模型避免了数据的主观性,不需要目标函数,相较于层次分析法,更为客观,能够很好的刻画多个影响指标的综合影响力度,缺点是必须具有两个及以上的研究对象才可以使用。

(2)模糊Borda

模糊Barda法可以综合多种评价方法的不同结果,该方法既考虑不同方法下排序名次的差异,又考虑相应评价方法下各项目的得分值,能更好地利用已有的评价信息,从而使得评价结果具有较高的合理性和优越性。
模糊Borda法冠名为“模糊”的理由是,计算了所谓的“隶属度”。其实,只不过是实际评价值的一个区间线性变换(极差变换或极大值相对化变换)。通过变换之后,所有的评价方法输出值的取值区间均为[0,1]。它充其量也只是“评语等级退化为单个等级”时的隶属度,或者称为“隶属优度”,从整个过程来看,该方法并没有与模糊数学中的有关运算规则、特殊概念发生很强的联系。

在学习中成功、在学习中进步!我们一起学习不放弃~

记得三连哦~mua 你们的支持是我最大的动力!!欢迎大家阅读往期文章哈~

小编联系方式如下,欢迎各位大佬沟通交流。

int[] arr=new int[]{4,8,3,2,6,5,1};
int[] index= new int[]{6,4,5,0,3,0,2,6,3,1};
String QQ = "";
    for (int i : index){
        QQ +=arr[i];
}
System.out.println("小编的QQ:" + QQ);

  • 21
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饲养猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值