【2.2】 数学建模之TOPSIS(优劣解距离模型)|极小型、中间型、区间型指标的正向化的方法|各种指标正向化的MATLAB代码讲解

  • 一、极小型指标转化为极大型指标
  • 二、中间型指标转化为极大型指标
  • 三、区间型指标转化为极大型指标
  • 四、各种类型指标正向化的整体代码
一、极小型指标转化为极大型指标

【2.2】 数学建模之TOPSIS(优劣解距离模型)|极小型、中间型、区间型指标的正向化的方法|各种指标正向化的MATLAB代码讲解_第1张图片

上图显示了将“与人争吵的次数”这一极小型指标转化为极大型指标的结果

具体的讲极小型指标转换为极大型指标的公式如下:
max ⁡ − x \max -x maxx
如果所有极小型指标的数据都为整数,那么也可以用如下公式进行转换:
1 x \frac{1}{x} x1

MATLAB代码示例如下:

function [posit_x] = Min2Max(x)
    posit_x = max(x) - x;
     %posit_x = 1 ./ x;    %如果x全部都大于0,也可以这样正向化
end

二、中间型指标转化为极大型指标

中间型指标的特点:指标的值既不要太大也不要太小,取某个特定的值最好(例如:评估水质量用到的PH值)
{ x i } 是 一组中间型指标序列,且最佳的数值 为 x b e s t , 那么正向化的公式如下: \left\{ x_i \right\} 是\text{一组中间型指标序列,且最佳的数值}为x_{best},\text{那么正向化的公式如下:} {xi}一组中间型指标序列,且最佳的数值xbest,那么正向化的公式如下:

M = max ⁡ { ∣ x i − x b e s t ∣ } , 转换值计算 x ~ i = 1 − ∣ x i − x b e s t ∣ M M=\max \left\{ \left| x_i-x_{best} \right| \right\} ,\text{转换值计算}\tilde{x}_i=1-\frac{\left| x_i-x_{best} \right|}{M} M=max{xixbest},转换值计算x~i=1Mxixbest

下面是一个该类型指标转换的示例:

【2.2】 数学建模之TOPSIS(优劣解距离模型)|极小型、中间型、区间型指标的正向化的方法|各种指标正向化的MATLAB代码讲解_第2张图片

该示例计算用到的中间参数为:
x b e s t = 7 x_{best}=7 xbest=7

M = max ⁡ { ∣ 6 − 7 ∣ , ∣ 7 − 7 ∣ , ∣ 8 − 7 ∣ , ∣ 9 − 7 ∣ } = 2 M=\max \left\{ \left| 6-7 \right|,\left| 7-7 \right|,\left| 8-7 \right|,\left| 9-7 \right| \right\} =2 M=max{67,77,87,97}=2

MATLAB代码示例如下:

function [posit_x] = Mid2Max(x,best)
    M = max(abs(x-best));
    posit_x = 1 - abs(x-best) / M;
end

三、区间型指标转换为极大型指标

区间型指标:指标落在某个区间内最好,例如人的体温在36摄氏度~37摄氏度这个区间较好
{ x i } 是 一组 区 间型指标序列,且最佳的 区 间 为 [ a , b ] , 那么正向化的公式如下: \left\{ x_i \right\} 是\text{一组}区\text{间型指标序列,且最佳的}区\text{间}为\left[ a,b \right] ,\text{那么正向化的公式如下:} {xi}一组间型指标序列,且最佳的[a,b],那么正向化的公式如下:

M = max ⁡ { a − min ⁡ { x i } , max ⁡ { x i } − b } , x ~ i = { 1 − a − x i M , x i < a 1 , a ⩽ x i ⩽ b 1 − x i − b M , x i > b M=\max \left\{ a-\min \left\{ x_i \right\} ,\max \left\{ x_i \right\} -b \right\} ,\tilde{x}_i=\begin{cases} 1-\frac{a-x_i}{M},x_ib\\ \end{cases} M=max{amin{xi},max{xi}b},x~i=1Maxi,xi<a1,axib1Mxib,xi>b

【2.2】 数学建模之TOPSIS(优劣解距离模型)|极小型、中间型、区间型指标的正向化的方法|各种指标正向化的MATLAB代码讲解_第3张图片

该示例计算用到的中间参数为:
a = 36 , b = 37 a=36,b=37 a=36,b=37

M = max ⁡ { 36 − 35.2 , 38.4 − 37 } = 1.4 M=\max \left\{ 36-35.2,38.4-37 \right\} =1.4 M=max{3635.2,38.437}=1.4

MATLAB代码示例如下:

%代码中的a和b分别是最佳区间的下届和上界
function [posit_x] = Inter2Max(x,a,b)
    r_x = size(x,1);  % row of x 
    M = max([a-min(x),max(x)-b]);
    posit_x = zeros(r_x,1);   %zeros函数用法: zeros(3)  zeros(3,1)  ones(3)
    % 初始化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

四、各种类型指标正向化的整体代码
% function [输出变量] = 函数名称(输入变量)  
% 函数的中间部分都是函数体
% 函数的最后要用end结尾
% 输出变量和输入变量可以有多个,用逗号隔开
% function [a,b,c]=test(d,e,f)
%     a=d+e;
%     b=e+f;
%     c=f+d;
% end
% 自定义的函数要单独放在一个m文件中,不可以直接放在主函数里面(和其他大多数语言不同)

function [posit_x] = Positivization(x,type,i)
% 输入变量有三个:
% x:需要正向化处理的指标对应的原始列向量
% type: 指标的类型(1:极小型, 2:中间型, 3:区间型)
% i: 正在处理的是原始矩阵中的哪一列
% 输出变量posit_x表示:正向化后的列向量
    if type == 1  %极小型
        disp(['第' num2str(i) '列是极小型,正在正向化'] )
        posit_x = Min2Max(x);  %调用Min2Max函数来正向化
        disp(['第' num2str(i) '列极小型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 2  %中间型
        disp(['第' num2str(i) '列是中间型'] )
        best = input('请输入最佳的那一个值: ');
        posit_x = Mid2Max(x,best);
        disp(['第' num2str(i) '列中间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    elseif type == 3  %区间型
        disp(['第' num2str(i) '列是区间型'] )
        a = input('请输入区间的下界: ');
        b = input('请输入区间的上界: '); 
        posit_x = Inter2Max(x,a,b);
        disp(['第' num2str(i) '列区间型正向化处理完成'] )
        disp('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~')
    else
        disp('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值')
    end
end

更多有关与TOPSIS模型的经典获奖论文,以及建模论文模板等资料关注公众号,回复,“TOPSIS”,即可免费领取!!!
在这里插入图片描述

你可能感兴趣的:(数学建模)