数学建模:TOPSIS法习题及matlab代码

4 TOPSIS法(评价类):优劣解距离法

常用的综合评价方法,能充分利用原始数据的的信息,精准反映各方案的差距。分析数据内在特征建模。

4.1极小型极大型指标

4.1.1 正向化

4.1.1.1 极小型转化为极大型

4.1.1.2 中间型转化为极大型

4.1.1.3 区间型转化为极大型

4.1.2 标准化:将不同的指标转化成相同的标准

代码及含义示例:

% 把已经正向化的指标标准化

% 标准化矩阵中每一个元素=正向化矩阵中每一个元素/sqrt(所在列平方的和)

clc

a=input('A:')

a=a./(sum(a.*a).^(1/2))

% 标准化结束

最小值最大值指的是各个列的最小值和最大值,行是对象,列是指标

此处求距离类似于求平面上点的坐标,或者多维空间中。然后每个指标代表一个维度,进行计算距离。

最后进行归一化得分

计算代码:

% 假设已知两个指标

% 把已经正向化的指标标准化

% 标准化矩阵中每一个元素=正向化矩阵中每一个元素/sqrt(所在列平方的和)

clc

a=input('A:')

a=a./(sum(a.*a).^(1/2))

% 标准化结束

% 计算得分

max_zhibiao=max(a) % 返回的是指标中最大的矩阵

min_zhibiao=min(a) % 返回的是指标中最小的矩阵

%计算未归一化

[r,c] =size(a)

max_distance=zeros(r,c)

min_distance=zeros(r,c)

for i=1:r

for j=1:c

max_distance(i,j)=max_distance(i,j)+((a(i,j)-max_zhibiao(j)).^2)

min_distance(i,j)=min_distance(i,j)+((a(i,j)-min_zhibiao(j)).^2)

end

temx=sum(max_distance,2).^(1/2)

temy=sum(min_distance,2).^(1/2)

end

tar=temy./(temx+temy)

disp(tar)

%归一化

res=tar./sum(tar)

%归一化完成

例题

代码 

clc
data=xlsread('C:\Users\admin\Desktop\数学建模\第2讲.TOPSIS法(优劣解距离法)\代码和例题数据\20条河流的水质情况数据.xlsx');

[r,c]=size(data);
disp(['共有' num2str(r) '个评价对象,' num2str(c) '个评价指标'])

judge=input('请输入是否需要正向化处理, 1需要0不需要');
c_zxh=input('请输入需要正向化指标所在的列'); % 需要正向化指标所在列

[,num]=size(c_zxh);

type=input('请输入指标类型:1:极小型 2:中间型 3:区间型'); % 正向化指标类型
[x,y]=size(type);
for i=1:y
% 正向化
if judge==1
    
    %极小型正向化
    if type(1,i)==1
        maxValue=max(data(:,c_zxh(1,i)));%极小型数值列的最大值
        data(:,c_zxh(1,i))=maxValue-data(:,c_zxh(1,i));
    end
    %极小型结束



    %中间型正向化
    if type(1,i)==2
       best=input('请输入最优值');
       M=max(abs(data-best))
       M=max(M(:,c_zxh(1,i)))
       data(:,c_zxh(1,i))=1 - (abs(data(:,c_zxh(1,i))-best)/M)
    end
    %中间型结束

    %区间型正向化
    if type(1,i)==3
        [tar]=input('请输入目标区间');
        tem_max= max(data(:,c_zxh(1,i))-tar(1,2))
        tem_min= min(tar(1,1)-data(:,c_zxh(1,i)))
        if tem_max>tem_min
            M=tem_max
        else
            M=tem_min
        end
        for j=1:r
            if data(j,c_zxh(1,i)) < tar(1,1)
                data(j,c_zxh(1,i)) = 1-(tar(1,1)-data(j,c_zxh(1,i)))/M
            
        elseif data(j,c_zxh(1,i)) > tar(1,2)
                data(j,c_zxh(1,i)) = 1-(data(j,c_zxh(1,i))-tar(1,2))/M
        

        elseif tar(1,1) < data(j,c_zxh(1,i)) < tar(1,2)
                data(j,c_zxh(1,i)) = 1
            end
        end
    end
    
    %区间型结束
end
%正向化结束
end

disp(data)



% 接下来进行标准化

data=data./(sum(data.^2).^(1/2))
% 标准化结束


%开始计算分数
max_stand=max(data)
min_stand=min(data)

max_distance=data-max_stand
min_distance=data-min_stand
Dbig=sum(max_distance.^2,2).^(1/2)
Dmin=sum(min_distance.^2,2).^(1/2)

res=Dmin./(Dbig+Dmin)
disp(res)


% 分数计算结束


%归一化

res=res./sum(res)

[sort_s,index]=sort(res ,'descend') % 从大到小排序
disp(index)
disp(res)
%归一化结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熟人看不到

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值