数学建模评价类—Topsis法

目录

文章目录

前言

切记:以下内容仅用于参考理解,不可用于数模竞赛!!!

一、Topsis的基本原理

二、Topsis的建模过程

1.判断矩阵是否需要正向化

2.原始矩阵正向化

3.矩阵标准化

4.计算距离,给出得分

总结


前言

本文会讲解到用于评价类问题的第二种方法—Topsis(优劣解距离)法 

切记:以下内容仅用于参考理解,不可用于数模竞赛!!!

使用Topsis法的特征:运用于多目标决策分析中。此时一般具有不同的选择,以及不同的指标用于评价选择的好坏,并且给出了具体的数据,并且我们知道这些指标怎样算好,所以我们能对不同的选择做出评价得出最优的选择。


一、Topsis的基本原理

TOPSIS法引入了两个基本概念:
理想解:设想的最优的解(方案),它的各个属性值都达到各备选方案中的最好的值;
负理想解:设想的最劣的解(方案),它的各个属性值都达到各备选方案中的最坏的值。

方案排序的规则:是把各备选方案与理想解和负理想解做比较,若其中有一个方案最接近理想解,而同时又远离负理想解,则该方案是备选方案中最好的方案

模型原理:归一化后(去量纲化)的数据规范化矩阵,找出多个目标中最优目标和最劣目标(分别用理归想一解化和反理想解表示),分别计算各评价目标与理想解和反理想解的距离,获得各目标与理想解的贴近度,按理想解贴近度的大小排序,以此作为评价目标优劣的依据。

评判标准:贴近度取值在0~1之间,该值愈接近1,表示相应的评价目标越接近最优水平;反之,该值愈接近0,表示评价目标越接近最劣水平。

二、Topsis的建模过程

1.判断矩阵是否需要正向化

基本思路:输入所给矩阵,得出有几个评价对象和几个评价指标,根据主观判断是否需要对所给指标进行正向化处理

如:假如我们要选对象,有颜值,脾气,身高,体重这几个评价指标;易得颜值应为极大型,脾气为极小型,身高为中间型,体重为区间型(具体如何判断类型在第二部分!!!

D = input('指标矩阵A=');  %输入判断矩阵
[n,m] = size(D); %得出矩阵D具有几行几列
%这个地方为了实现打印的值能够随着n的变化而变化,所以运用了字符串拼接函数
%字符串拼接后是一个字符串数组,so要用[]
disp(['共有' num2str(n) '个评价对象',num2str(m) '个评价指标']);
 Judge = input([num2str(m) '个指标是否需要经过正向化处理,需要请输入1,不需要则输入0']);
  
if 1==Judge
    position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]:');
    
    disp('请输入需要处理的这些列的指标类型(1:极小型 ,2:中间型 ,3:区间型)');

    type = input('例如:第二列是区间型,第三列是中间型,第五列是极小型,则输入[3,2,1]');%用数组存储对应的值
    %特别注意position和type是两个同维度的行向量,千万不要漏填了
    for k = 1:size(position,2)%这里2代表维度,求的是position列的数量
        %有几列需要处理则循环多少次
        D(:,position(k)) = Positivization(D(:,position(k)),type(K),position(k));
    end
    disp('正向化处理后的矩阵 D= ');
    disp(D);
end

2.原始矩阵正向化

目标:将所有的指标类型统一转化为极大型指标

指标类型及其转化为极大型的公式:

为了方便,我们将实现转化的公式都单独写成函数实现(Matlab代码)

此时我们写一个函数名为positivation实现所有指标的正向化,对于每种不同的指标我们有不同的处理方法,此时我们同样可以单独写函数来实现不同的功能,在positivation函数中调用其他函数

function [Posit_D] =Positivization(D,type,k)
%输入变量D,type,k
%D:需要正向化处理的指标对应的原始列向量
%type:指标的类型(1:极小型 ,2:中间型 ,3:区间型)
%k:正在处理的是原始矩阵中的哪一列
%输出变量Posit_D是正向化后的列向量


   if 1==type
       disp(['第',num2str(k),'列是极小型,正在正向化'])
       Posit_D = Min2Max(D);%调用Min2Max函数来正向化
       disp(['第',num2str(k),'列极小项正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')

   elseif 2==type
        disp(['第',num2str(k),'列是中间型,正在正向化'])
        best = input('请输入最优值:');
        Posit_D = Mid2Max(D,best);%调用Mid2Max函数来正向化
       disp(['第',num2str(k),'列中间型正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')

   elseif 3==type
       disp(['第',num2str(k),'列是区间型,正在正向化'])
       a = input('请输入区间下界:');
       b = input('请输入区间上界:');
       Posit_D = Inter2Max(D,a,b);%调用Inter2Max函数来正向化
       disp(['第',num2str(k),'列区间型正向化处理完成'])
       disp('~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~~~')


   else
       disp('没有该种类型的指标请重新输入')
   end


end

接下来我们实现不同指标的转化函数 

  • 极大型:越大越好。如:成绩,GDP增速
  • 极小型:越小越好。如:坏品率,污染程度

\widetilde{x}=max-x

~x为转化后指标,max为指标最大值,𝑥为指标值

function [Posit_D] = Min2Max(D)
    Posit_D =max(D)-D;%最大值-每一列的值
    
end
  • 中间型:越趋近于某个值越好。如:身高,监测水质的PH

function [Posit_D]= Mid2Max(D,best)
M = max(abs(D-best));%同理将公式套用即可
Posit_D = 1-abs(D-best)/M ;
end
  • 区间型:在区间内的数据最好。如:体重,体温

function [Posit_D] = Inter2Max(D,a,b)
    row_D =size(D,1);
    M = max([a-min(D),max(D)-b]);
    %将Posit_D初始化为0,节省处理时间
    Posit_D = zeros(row_D,1); %创建一个row_D行,1列的全零矩阵
    for j=1:row_D
        if D(j)<a
            Posit_D(j) = 1-(a-D(j))/M;
        elseif D(j)>a
            Posit_D(j) = 1-(D(j)-b)/M;
        else
            Posit_D(j) = 1;
        end
    end
end

3.矩阵标准化

目的消除不同指标量纲的影响

公式:记标准化的矩阵为Z,已经正向化后的矩阵为X,则Z中的每一个元素

%2.对正向化后的矩阵标准化
B = D./repmat(sum((D.*D).^0.5),n,1);%sum默认是矩阵的列相加
disp('标准化矩阵B =');
disp(B);

4.计算距离,给出得分

距离计算实际上就是计算两点间的距离,只不过这里是一个m维的坐标,点的坐标为(z1,z2,···zm)

再计算出得分

前面我们提到了贴近度(得分)越接近1,方案应该是越好的,此处我们易得0=< Si <=1,当Di+越小时,Si越趋近于1,此时方案越好 

最后对得分进行归一化并换算成百分制

 最后根据得分越高方案越优排序即可。

D_P = sum((B - repmat(max(B),n,1)) .^ 2 ,2) .^ 0.5; % D+ 与最大值的距离向量
D_N = sum((B - repmat(min(B),n,1)) .^ 2 ,2) .^ 0.5; % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N); % 未归一化的得分
disp('最后的得分为:')
stand_S = 100*S / sum(S);%对数据进行归一化处理并且使用百分制
[sorted_S,index] = sort(stand_S ,'descend');%sort函数默认升序排列,sort(A,1)——升序,sort(A,2)——降序
%此处将排序后的值以及,值所对应的索引输出

总结

切忌:以上代码仅做参考,不能用于数模竞赛中!!!
 

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TOPSIS是一种多属性决策分析方,可以用来评价多个决策方案的相对优劣。Matlab中可以使用以下代码实现: 假设有4个决策方案,每个方案有3个评价指标,存储在一个4行3列的矩阵X中。 ```matlab X = [3 2 6; 5 4 8; 7 5 9; 4 6 7]; ``` 首先需要将所有指标标准化,使得它们的取值范围相同。可以使用以下代码实现: ```matlab [n,m] = size(X); % n为方案数,m为指标数 X1 = X./sqrt(sum(X.^2)); % 指标标准化 ``` 接下来,需要确定每个指标的权重。可以使用主观赋权或客观赋权来确定权重。这里假设已经确定了指标权重,存储在一个1行3列的矩阵W中。 ```matlab W = [0.3 0.4 0.3]; % 指标权重 ``` 然后计算加权规范化矩阵,即将指标标准化后乘以指标权重,得到每个方案的加权规范化得分。 ```matlab X2 = X1.*W; % 加权规范化矩阵 ``` 接下来需要确定正负理想解。正理想解是指在每个指标上取值最大的方案,负理想解是指在每个指标上取值最小的方案。可以使用以下代码实现: ```matlab Z = [max(X2); min(X2)]; % 正负理想解 ``` 然后计算每个方案到正负理想解的距离,可以使用欧氏距离或曼哈顿距离。这里使用欧氏距离。 ```matlab D = sqrt(sum((X2-Z(:,1)').^2,2)) ./ (sqrt(sum((X2-Z(:,1)').^2,2)) + sqrt(sum((X2-Z(:,2)').^2,2))); % 距离值 ``` 最后按照距离值的大小排序,得到每个方案的相对优劣程度。 ```matlab [~,rank] = sort(D,'descend'); % 相对优劣程度排序 ``` rank中的第一个元素即为最优方案的编号。 完整的代码如下: ```matlab X = [3 2 6; 5 4 8; 7 5 9; 4 6 7]; [n,m] = size(X); X1 = X./sqrt(sum(X.^2)); % 指标标准化 W = [0.3 0.4 0.3]; % 指标权重 X2 = X1.*W; % 加权规范化矩阵 Z = [max(X2); min(X2)]; % 正负理想解 D = sqrt(sum((X2-Z(:,1)').^2,2)) ./ (sqrt(sum((X2-Z(:,1)').^2,2)) + sqrt(sum((X2-Z(:,2)').^2,2))); % 距离值 [~,rank] = sort(D,'descend'); % 相对优劣程度排序 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值