- 一、极小型指标转化为极大型指标
- 二、中间型指标转化为极大型指标
- 三、区间型指标转化为极大型指标
- 四、各种类型指标正向化的整体代码
上图显示了将“与人争吵的次数”这一极小型指标转化为极大型指标的结果
具体的讲极小型指标转换为极大型指标的公式如下:
max − x \max -x max−x
如果所有极小型指标的数据都为整数,那么也可以用如下公式进行转换:
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{∣xi−xbest∣},转换值计算x~i=1−M∣xi−xbest∣
下面是一个该类型指标转换的示例:
该示例计算用到的中间参数为:
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{∣6−7∣,∣7−7∣,∣8−7∣,∣9−7∣}=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{a−min{xi},max{xi}−b},x~i=⎩⎪⎨⎪⎧1−Ma−xi,xi<a1,a⩽xi⩽b1−Mxi−b,xi>b
该示例计算用到的中间参数为:
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{36−35.2,38.4−37}=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”,即可免费领取!!!