首页 > 其他分享 >评价模型TOPSIS与熵权法MATLAB代码

评价模型TOPSIS与熵权法MATLAB代码

时间:2024-10-09 09:59:59浏览次数:9  
标签:disp OK TOPSIS NaN bounds MATLAB data 权法 normalized

函数代码

function topsis_example(data, data_types, up_OK, down_OK, upper_bounds, lower_bounds,middle)

    % 数据预处理
    [num_objects, num_attributes] = size(data);
    normalized_data = zeros(num_objects, num_attributes);

    % 1. 根据数据类型进行正向化处理
    for i = 1:num_attributes
        switch data_types(i)
            case 1 % 效益型
                normalized_data(:, i) = (data(:, i) - min(data(:, i))) / (max(data(:, i)) - min(data(:, i)));
            case 2 % 成本型
                normalized_data(:, i) = (max(data(:, i)) - data(:, i)) / (max(data(:, i)) - min(data(:, i)));
            case 3 % 区间型
                for j =1: num_objects
                    if data(j,i)>=down_OK(i) && data(j,i)<=up_OK(i)
                         normalized_data(j,i)=1;
                    elseif data(j,i)>up_OK(i) && data(j,i)<= upper_bounds(i)
                        normalized_data(j,i) = 1-(data(j,i) - up_OK(i)) /( upper_bounds(i)-up_OK(i)) ;
                    elseif data(j,i)< down_OK(i) && data(j,i)>= lower_bounds(i)
                        normalized_data(j,i) =1- (down_OK(i) - data(j,i))/( down_OK(i) - lower_bounds(i) );
                    else
                        normalized_data(j,i)=0;
                    end

                    %normalized_data(:, i) = (data(:, i) - lower_bounds(i)) / (upper_bounds(i) - lower_bounds(i));
                    %normalized_data(:, i) = max(0, min(1, normalized_data(:, i))); % 限制在[0, 1]区间
                end
            case 4 % 中间型(可以根据需要自定义)
                M = max(abs(data(:,i)-middle(i)));
                normalized_data(:, i) = 1- abs(data(:,i)-middle(i)) / M;
                %normalized_data(:, i) = (data(:, i) - mean(data(:, i))) / std(data(:, i));
                %normalized_data(:, i) = max(0, min(1, normalized_data(:, i))); % 限制在[0, 1]区间
            otherwise
                error('Unsupported data type: %d', data_types(i));
        end
    end

    disp('处理好之后 ')
    disp(normalized_data)

    % 2. 熵权法计算权重
    entropy = zeros(1, num_attributes);
    for j = 1:num_attributes
        p_j = normalized_data(:, j) / sum(normalized_data(:, j)); % 概率分布
        p_j(p_j == 0) = []; % 去除零值
        entropy(j) = -sum(p_j .* log(p_j));
    end
    entropy=entropy/log(num_objects);

    disp('e')
    disp(entropy)

    % 计算权重
    weights = (1 - entropy) / sum(1 - entropy);
    % weights=[0.2,0.3,0.4,0.1];   %尝试人工赋权
    
    disp('weights')
    disp(weights)

    % 将数据乘以权重
    normalized_data=weights .* normalized_data ;
    disp('乘以权重之后')
    disp(normalized_data)


    % 3. TOPSIS方法计算最终评分
    ideal_solution = max(normalized_data);
    anti_ideal_solution = min(normalized_data);

    disp('最优解')
    disp(ideal_solution)
    disp('最差解')
    disp(anti_ideal_solution)
    

    % 计算到理想解和反理想解的距离
    distance_to_ideal = sqrt(sum((normalized_data - ideal_solution).^2, 2));        %sum(,2)计算一行的和
    distance_to_anti_ideal = sqrt(sum((normalized_data - anti_ideal_solution).^2, 2));

    disp('到正理想解的距离')
    disp(distance_to_ideal)
    disp('到负理想解的距离')
    disp(distance_to_anti_ideal)

    % 计算最终评分
    scores = distance_to_anti_ideal ./ (distance_to_ideal + distance_to_anti_ideal);

    % 显示最终评分
    disp('最终得分为');
    disp(scores);
end

示例代码

% 问题代码
data = [
    0.1, 5, 5000, 4.7; 
    0.2, 6, 6000, 5.6; 
    0.4, 7, 7000, 6.7;
    0.9,10,10000, 2.3;
    1.2 , 2, 400, 1.8
];

data_types = [1, 3, 1, 2];  % 1 效益 ,2成本 ,3 区间  ,4中间
upper_bounds = [NaN, 12, NaN, NaN];   % 区间型的无法忍受的上界
lower_bounds = [NaN, 2, NaN, NaN];    % 区间型的无法忍受的下界
up_OK =[NaN, 6, NaN, NaN];            % 区间型的合适的上界
down_OK=[NaN, 5, NaN, NaN];           % 区间型的合适的下界
middle=[NaN,NaN,NaN,NaN];             % 中间型的合适值

topsis_example(data, data_types, up_OK,down_OK,upper_bounds, lower_bounds,middle);


%% 测试中间型
data = [
   1;
   2;
   3;
   4;
   5;
   6;
];

data_types = [4];  % 1 效益 ,2成本 ,3 区间  ,4中间
upper_bounds = [NaN];   % 区间型的无法忍受的上界
lower_bounds = [NaN];    % 区间型的无法忍受的下界
up_OK =[NaN];            % 区间型的合适的上界
down_OK=[NaN];           % 区间型的合适的下界
middle=[3];             % 中间型的合适值

topsis_example(data, data_types, up_OK,down_OK,upper_bounds, lower_bounds,middle);

%% 测试效益性
data = [
   1;
   2;
   3;
   4;
   5;
   6;
];

data_types = [1];  % 1 效益 ,2成本 ,3 区间  ,4中间
upper_bounds = [NaN];   % 区间型的无法忍受的上界
lower_bounds = [NaN];    % 区间型的无法忍受的下界
up_OK =[NaN];            % 区间型的合适的上界
down_OK=[NaN];           % 区间型的合适的下界
middle=[3];             % 中间型的合适值

topsis_example(data, data_types, up_OK,down_OK,upper_bounds, lower_bounds,middle);

%% 测试成本型
data = [
   1;
   2;
   3;
   4;
   5;
   6;
];

data_types = [2];  % 1 效益 ,2成本 ,3 区间  ,4中间
upper_bounds = [NaN];   % 区间型的无法忍受的上界
lower_bounds = [NaN];    % 区间型的无法忍受的下界
up_OK =[NaN];            % 区间型的合适的上界
down_OK=[NaN];           % 区间型的合适的下界
middle=[3];             % 中间型的合适值

topsis_example(data, data_types, up_OK,down_OK,upper_bounds, lower_bounds,middle);


%% 测试区间型
data = [
   1;
   2;
   3;
   4;
   5;
   6;
];

data_types = [3];  % 1 效益 ,2成本 ,3 区间  ,4中间
upper_bounds = [5.5];   % 区间型的无法忍受的上界
lower_bounds = [1.5];    % 区间型的无法忍受的下界
up_OK =[4];            % 区间型的合适的上界
down_OK=[3];           % 区间型的合适的下界
middle=[nan];             % 中间型的合适值

topsis_example(data, data_types, up_OK,down_OK,upper_bounds, lower_bounds,middle);

标签:disp,OK,TOPSIS,NaN,bounds,MATLAB,data,权法,normalized
From: https://www.cnblogs.com/acidbarium/p/18453646

相关文章