MATLAB优劣解距离法(topsis)综合评价+代码

优劣解距离法

TOPSIS是通过逼近理想解的程度来评估各个样本的优劣等级

收集与整理

假设有n个待评价样本,p项评价指标,形成原始指标数据矩阵:

预处理数据

使指标具有同趋势性。评价指标中有正向指标和负向指标之分,一般把负向指标转化为正向指标,转化的方法可采用倒数法(即1/X),多适用于绝对数指标;差值法(即1-X),多适用于相对数指标。转化后的数据矩阵仍记为X。
数据无量纲化.。将原始数据归一化,以消除量纲向量数据归一化的方式:

最终得到分析数据矩阵

寻找最优值和最劣值

找出各项指标的最优值和最劣值,建立最优值向量z+和最劣值z-向量

计算离尺度

计算理想解的接近度

排序

根据Ci的大小进行排序,Ci越大,表明评价对象越接近最优值。

 

原理讲解引自:https://blog.csdn.net/qq_42374697/article/details/105901229 

 

题目

评价下表中20条河流的水质情况。(熵权法和优劣解距离法对比)
注:含氧量越高越好;PH值越接近7越好;细菌总数越少越好;植物性营养物量介于10‐20之间最佳,超过20或低于10均不好。

河流

含氧量(ppm)

PH值

细菌总数(个/mL)

植物性营养物量(ppm)

A

4.69

6.59

51

11.94

B

2.03

7.86

19

6.46

C

9.11

6.31

46

8.91

D

8.61

7.05

46

26.43

E

7.13

6.5

50

23.57

F

2.39

6.77

38

24.62

G

7.69

6.79

38

6.01

H

9.3

6.81

27

31.57

I

5.45

7.62

5

18.46

J

6.19

7.27

17

7.51

K

7.93

7.53

9

6.52

L

4.4

7.28

17

25.3

M

7.46

8.24

23

14.42

N

2.01

5.55

47

26.31

O

2.04

6.4

23

17.91

P

7.73

6.14

52

15.72

Q

6.35

7.58

25

29.46

R

8.29

8.41

39

12.02

S

3.54

7.27

54

3.16

T

7.44

6.26

8

28.41

代码

.mat数据:在MATLAB里面随便创建一个变量,将表格中的数据粘贴进变量中,再另存为.mat数据就行。

main.m

 

%% 数据读取
clear,clc
load rivers_data.mat
%% 正向化处理
[n,m] = size(datas_matrix);
% 正向化处理的数据所在列
Pos = [2,3,4];
% 指标类型:1:极小型,2:中间型,3:区间型
ch = [2,1,3];
% 循环处理每一列
for i = 1 : size(Pos,2)
    datas_matrix(:,Pos(i)) = Forward_processing(datas_matrix(:,Pos(i)),ch(i),Pos(i));
end

%% 权重
%如果不需要加权重就默认权重都相同,即都为1/m
weigh = ones(1,m) ./ m ;

%% 归一化
for i = 1:m
    tmp = datas_matrix(:,i)
    datas_S_matrix(:,i) = (tmp - min(tmp))/(max(tmp) - min(tmp));
end

%% 计算与最大值的距离和最小值的距离,并算出得分
max_dis = sum([(datas_S_matrix - repmat(max(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
min_dis = sum([(datas_S_matrix - repmat(min(datas_S_matrix),n,1)) .^ 2 ] .* repmat(weigh,n,1) ,2) .^ 0.5;
S = min_dis ./ (max_dis+min_dis); 
results = S / sum(S);
[sorted_results,index] = sort(results ,'descend');
format short
R = [index,sorted_results];
xlswrite('results.xls',R);

 

 

 

Forward_processing.m

 

function [posit_x] = Forward_processing(x,type,~)
    if type == 1 %极小型
        %正向化
        posit_x = max(x) - x;
    elseif type == 2 %中间型
        best = 7;
        M = max(abs(x-best));
        posit_x = 1 - abs(x-best) / M;
    elseif type == 3 %区间型
        a = 10;
        b = 20;
        r_x = size(x,1);
        M = max([a-min(x),max(x)-b]);
        posit_x = zeros(r_x,1);
        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
end

 

posted @ 2020-06-12 00:13  Hk_Mayfly  阅读(2471)  评论(0编辑  收藏  举报