函数代码
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