函数代码
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_attributesswitch 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_objectsif 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) );elsenormalized_data(j,i)=0;endendcase 4 % 中间型(可以根据需要自定义)M = max(abs(data(:,i)-middle(i)));normalized_data(:, i) = 1- abs(data(:,i)-middle(i)) / M;otherwiseerror('Unsupported data type: %d', data_types(i));endenddisp('处理好之后 ')disp(normalized_data)% 2. 熵权法计算权重entropy = zeros(1, num_attributes);for j = 1:num_attributesp_j = normalized_data(:, j) / sum(normalized_data(:, j)); % 概率分布p_j(p_j == 0) = []; % 去除零值entropy(j) = -sum(p_j .* log(p_j));endentropy=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);