数学建模——TOPSIS法(优劣解距离法)学习笔记

it2026-01-11  8

数学建模——TOPSIS法(优劣解距离法)学习笔记

main主函数部分: %优劣解距离法的指标有四种:(1)极大型指标:越大越好 比如成绩,GDP增速,企业利润 …(2)极小型指标:越小越好 比如费用,坏频率,污染程度 …(3)中间型指标:越接近某个值越好 比如水质量评估时的PH值 …(4)区间型指标:落在某个区间最好 比如体温,水中植物性营养物量 %对这些指标进行正向化,即转化为极大型指标,不同指标转化公式不同 %% 读入数据 clear;clc; load data.mat [m,n]=size(data); %% 数据正向化处理 fprintf(‘共有%d个评价对象,%d个评价指标\n’,n,m); fprintf([‘这’ num2str(n) '个评价对象是否需要进行正向化处理,需要请按1,不需要按0: ‘]); judge=input(’ '); % judge = input([‘这’ num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']); if judge==1 Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2 3 4] fprintf('请输入需要处理的这些列的指标类型(1:极小型,2:中间型,3:区间型) ‘)%[2 1 3] Type = input(’ '); for i = 1 : size(Position,2) data(:,Position(i))=Positivization(data(:,Position(i)),Type(i),Position(i)); end disp('正向化后的矩阵data为 ') disp(data); end %% 让用户判断是否需要增加权重 Judge = input('请输入是否需要增加权重,需要输入1,不需要输入0: '); if Judge == 1 weigh = input([‘你需要输入’ num2str(n) '个权值: ’ ]);%权重也是以矩阵的形式表示[],有几个指标就有几个权重 else weigh = ones(1,n) ./ n ; %如果不需要加权重就默认权重都相同,即都为1/n end %% 第三步:对正向化后的矩阵进行标准化 new_data=zeros(m,n); for j=1:n for i=1:m new_data(i,j)=data(i,j)./sqrt(sum(data(:,j).^2)); end end %% 第四步:计算与最大值的距离和最小值的距离,并算出得分 new_max=max(new_data); %求出标准化后矩阵每列最大值 new_min=min(new_data); %求出标准化后矩阵每列最小值 D_plus=zeros(m,1); D_reduce=zeros(m,1); plus=0; reduce=0; for i=1:m for j=1:n plus=(new_max(1,j)-new_data(i,j))^2weigh(1,j)+plus; reduce=(new_min(1,j)-new_data(i,j))^2weigh(1,j)+reduce; end D_plus(i,1)=sqrt(plus); plus=0; D_reduce(i,1)=sqrt(reduce); reduce=0; end S = D_reduce ./ (D_plus+D_reduce); % 未归一化的得分 disp(‘最后的得分为:’) stand_S = S / sum(S); [sorted_S,index] = sort(stand_S ,‘descend’);

%中间型指标转化为极大型 function [posit_data] = Mid2Max(data,best) M = max(abs(data-best)); posit_data = 1 - abs(data-best) / M; end %极小型指标转化为极大型 function [posit_data] = Min2Max(data) posit_data = max(data) - data; end %区间型指标转化为极大型 function [posit_data] = Inter2Max(data,a,b) M=max(a-min(data),max(data)-b); l=length(data); posit_data=zeros(l,1); for i=1:l if data(i)<a posit_data(i)=1-(a-data(i))/M; else if data(i)>b posit_data(i)=1-(data(i)-b)/M; else posit_data(i)=1; end end end

function [posit_data] = Positivization(data,type,i) if type == 1 %极小型 fprintf(‘第%d列为极小型指标,正在进行正向化处理’,i); posit_data = Min2Max(data); fprintf(’\n’); elseif type == 2 %中间型 fprintf(‘第%d列为中间型指标,正在进行正向化处理’,i); best = input(‘请输入最佳的那一个值: ‘); posit_data = Mid2Max(data,best); fprintf(’\n’); elseif type == 3 %区间型 fprintf(‘第%d列为区间型指标,正在进行正向化处理’,i); a = input('请输入区间的下界: '); b = input(‘请输入区间的上界: ‘); posit_data = Inter2Max(data,a,b); fprintf(’\n’); else fprintf(‘只有三种类型的指标需要正向化处理,请查看是否输入错误’); end end

最新回复(0)