数学建模学习笔记(清风)——TOPSIS法

目录

基础部分:

适用范围:

对指标分类并分别正向化:

步骤:

matlab相关代码部分:

matlab学习部分:

基础部分:

适用范围:

        综合评价

对指标分类并分别正向化:

        极大型指标(效益型指标)

        成本型指标(成本型指标)max-x或者取倒数(均为正数)

        中间型指标

        区间型指标

步骤:

        1、将原始矩阵正向化

        2、正向化矩阵标准化

        3、计算得分并归一化

matlab相关代码部分:

主函数部分:

[r,c] = size(X);

disp(['' num2str(r) '个评价对象, ' num2str(c) '个评价指标']) ;

Judge = input(['' num2str(r) '个指标是否需要经过正向化处,需要输入1 ,不需要输入0:  ']);

if Judge == 1

    Position = input('需要正向化处理的指标所在的列,例第2、3、6三列需处理,那么输入[2,3,6]: ');

    disp('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ')

    Type = input('例:第2列是极小型,第3列是区间型,第6列是中间型,则输入[1,3,2]:  '); %[2,1,3]

    for i = 1 : size(Position,2) 

        X(:,Position(i)) = Positivization(X(:,Position(i)), Type(i), Position(i));

    end

    disp('正向化矩阵 X =  ')

    disp(X);

end



Z = X ./ repmat(sum(X.*X) .^ 0.5, n, 1);      %正向化矩阵标准化

disp('标准化矩阵 Z = ');

disp(Z);



D_P = sum([(Z - repmat(max(Z),n,1)) .^ 2 ],2) .^ 0.5;   % 计算得分并归一化

D_N = sum([(Z - repmat(min(Z),n,1)) .^ 2 ],2) .^ 0.5;   % D- 与最小值的距离向量

S = D_N ./ (D_P+D_N);    % 未归一化的得分

disp('最后的得分为:')

stand_S = S / sum(S)

[sorted_S,index] = sort(stand_S ,'descend')



自定义函数部分:

1、分别处理不同的指标

function [posit_x] = Positivization(x,type,i)

    if type == 1  %极小型

        posit_x = Min2Max(x);  %调用Min2Max函数来正向化

    elseif type == 2  %中间型

        best = input('请输入最佳值: ');

        posit_x = Mid2Max(x,best);

    elseif type == 3  %区间型

        a = input('请输入区间的下界: ');

        b = input('请输入区间的上界: ');

        posit_x = Inter2Max(x,a,b);

    else

        disp('没有这种类型的指标')

    end

end

2、各种指标处理的函数

极小型——>极大型

function [posit_x] = Min2Max(x)

posit_x = max(x) - x;   %posit_x = 1 ./ x;    %x全部都大于0,也可这样正向化

end

中间型——>极大型:

function [posit_x] = Mid2Max(x,best)

    M = max(abs(x-best));

    posit_x = 1 - abs(x-best) / M;

end

区间型指标——>极大型指标:

function [posit_x] = Inter2Max(x,a,b)

    r_x = size(x,1); 

    M = max([a-min(x),max(x)-b]);

    posit_x = zeros(r_x,1);   % 初始化posit_x全为0  初始化的目的是节省处理时间

    for i = 1: r_x

        if x(i) < a

           posit_x(i) = 1-(a-x(i))/M;

        elseif x(i) > b

           posit_x(i) = 1-(x(i)-b)/M;

        else

           posit_x(i) = 1;

        end

    end

end

matlab学习部分:

        num2str函数的用法:num2str(一个数); 将一个数字类型的数据转换成字符型  2:to

        自定义函数的用法:

                function [输出标量: a, b, c] = 函数名(输出变量: d, e, f)

                    a = d;

                    b = e;

                    c = f;  

                end

        zeros函数的用法:zeros(r, c);  定义一个r行c列的零矩阵

你可能感兴趣的:(数学建模,matlab,矩阵,算法)