欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数模算法:优劣解距离法Topsis模型

程序员文章站 2022-05-22 14:12:45
...

概念:

TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为先将原始数据矩阵统一指标类型(一般正向化处理) 得到正向化的矩阵,再对正向化的矩阵进行标准化处理以消除各指 标量纲的影响,并找到有限方案中的最优方案和最劣方案,然后分 别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对 象与最优方案的相对接近程度,以此作为评价优劣的依据

算法步骤

确定指标类型
数模算法:优劣解距离法Topsis模型
将原始矩阵正向化(将不同类型的指标转换为极大型)
数模算法:优劣解距离法Topsis模型
中间型正向化
数模算法:优劣解距离法Topsis模型
数模算法:优劣解距离法Topsis模型

正向化矩阵标准化(消除不同量纲的影响)
数模算法:优劣解距离法Topsis模型

计算得分,归一化
数模算法:优劣解距离法Topsis模型
根据得分大小进行排序,给出评价结果

案例应用

数模算法:优劣解距离法Topsis模型
数模算法:优劣解距离法Topsis模型
确定指标类型:
含氧量:极大型
PH值:中间型
细菌总数:极小型
植物性营养物量:区间型

正向化处理后的矩阵:
数模算法:优劣解距离法Topsis模型
对矩阵标准化处理
数模算法:优劣解距离法Topsis模型
计算最后得分(未加入权值向量):
数模算法:优劣解距离法Topsis模型
排序后结果
数模算法:优劣解距离法Topsis模型

matlab代码

%正向化处理函数
function [new_X]=Normalization(x,type,i)

    if type==1
        disp('极小型正向化:')
        new_X=Min2Max(x);
    elseif type==2
        disp('中间型正向化:')
        bestx=input('输入最好的中间值:');
        new_X=Mid2Max(x,bestx);
    elseif type==3
        disp('区间型正向化:')
        a=input('输入区间下界:');
        b=input('输入区间上界:');
        new_X=Inter2Max(x,a,b);
    else
        disp('输入有误')
    end
end
%极小型转为极大型
function [new_X]=Min2Max(x)
    new_X=max(x)-x;
end
%中间型转换为极大型
function [new_X]=Mid2Max(x,bestx)
    M=max(abs(x-bestx));
    new_X=1-abs(x-bestx)/M;
end
%区间型转换成极大型
function [new_X]=Inter2Max(x,a,b)
    rows=size(x,1);%x的行数
    M=max([a-min(x),max(x)-b]);
    new_X=zeros(rows,1);
    for i=1:rows
        if x(i)<a
            new_X(i)=1-(a-x(i))/M;
        elseif x(i)>b
            new_X(i)=1-(x(i)-b)/M;
        else
            new_X(i)=1;
        end
    end
end
    
%加载数据(事先将数据导入data.mat文件)
load data.mat
%X是数据矩阵
[n,m]=size(X);
disp(['有' num2str(n) '个评价对象,' num2str(m) '个评价指标']);
judge=input('指标是否需要经过正向化处理,1是,2否:');
if judge==1
    targetCol=input('输入需要正向化的指标所在列,例如[1,2,3]是1,2,3列:');
    type=input('输入需要处理列的对应指标类型,例如[1,2,3],1极小型,2中间型,3区间型:');
    for i=1:size(targetCol,2)
        %正向化处理,参数1是要正向化处理的列向量,参数2是该列的指标类型,参数3是正在处理原始矩阵的哪一列
        X(:,targetCol(i))=Normalization(X(:,targetCol(i)),type(i),targetCol(i));
    end
    disp('正向化后的矩阵X=')
    disp(X)
end


judge2=input('是否需要加入权重,1是,2否:');
if judge2==1
    %权重可以由层次分析法或熵权法获得,和为1
    weight=input('输入对应指标的权重向量例如3个指标[0.2,0.4.0.4]:')
else
    %默认权重相同,为1/m
    weight=ones(1,m)./m;
end

%对正向化后的矩阵标准化
Z=X./repmat(sum(X.*X).^0.5,n,1);
disp('标准化矩阵为:')
disp(Z)
%第四步:计算与最大值的距离和与最小值的距离,并算出得分
%最大距离D1
D1=sum([(Z-repmat(max(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;
%最小距离D2
D2=sum([(Z-repmat(min(Z),n,1)).^2].*repmat(weight,n,1),2).^0.5;
S=D2./(D1+D2);%未归一化
disp('最后得分为:')
S_stand=S/sum(S)
%降序排序,得到结果和索引
[S_sorted,index]=sort(S_stand,'descend')


        

内容参考学习自
B站:数学建模——优劣解距离法Topsis模型讲解(综合评价问题)

相关标签: 数学建模