評價模型TOPSIS與熵權法MATLAB程式碼

AcidBarium發表於2024-10-09

函式程式碼

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
                end
            case 4 % 中間型(可以根據需要自定義)
                M = max(abs(data(:,i)-middle(i)));
                normalized_data(:, i) = 1- abs(data(:,i)-middle(i)) / M;
            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);

相關文章