函式程式碼
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);