Topsis算法的实现——MATLAB版本

CSDN代码没有MATLAB的版本,因此以下都是显示的MATLAB版本。

主函数
clear
clc


filename="附件:数据.xlsx";
sheet=1;
range="A1:O32156";

datas=xlsread(filename,sheet,range);
n=32155;

for i=1:32155
    for j=1:6
        z(i,j)=datas(i,j+3+6) - datas(i,j+3);
    end
end


Top=topsis(z);

Top(1:10);
% 写入排名
for i=1:n
    % k表示排名第i的是索引为几的村子
    k=Top(i);
    datas(k,16)=i;
end;


danwei=zeros(160,2);
cnt=zeros(160);

% 统计每个单位的排名综合
for i=1:n
    % k表示索引为i的村子的帮扶单位
    k=datas(i,2)+1;
    danwei(k,1)=danwei(k,1)+datas(i,16);
    cnt(k)=cnt(k)+1;
end

% 统计每个单位的平均绩效排名
for i=1:160
    danwei(i,2)=i-1;
    danwei(i,1)=danwei(i,1)/cnt(i);
end
% 排序,这个值越低越好

disp("帮扶单位平均帮扶排名");

data1=sortrows(danwei,1);

disp("帮扶单位排序(前十):");
disp(data1(1:10,2));

leixing=zeros(6,2);
cnt=zeros(6);

% 统计不同类别单位的个数及总排名
for i=1:n
    k=datas(i,3)+1;
    leixing(k)=leixing(k)+datas(i,16);
    cnt(k)=cnt(k)+1;
end;
% 求每种类型单位的平均排名
for i=1:6
    leixing(i,2)=i-1;
    leixing(i,1)=leixing(i,1)/cnt(i);
end;
disp("不同类型的得分数据");
disp(leixing);


data2=sortrows(leixing,1);

disp("不同类型的排名");
disp(data2(:,2));

xlswrite("输出数据", datas)

sorting
function result=sorting(e)
 c=e;
 n=size(c,2);%向量中元素的数目
 result=[];
 %记录 c 中元素最大的位置,将最大的数的数值设置为一个小量-1000000000for i=1:n
 [a,result(i)]=max(c);
 c(result(i))=-1000000000000;
 end
end
computingdegree
function c=computingdegree(d1,d2)
n=size(d1,2);
c=zeros(1,n);
for i=1:n
 c(i)=d2(i)/(d1(i)+d2(i));
end
end
computingdistance
function [d1,d2]=computingdistance(z,x1,x2)
[n,m]=size(z);
for i=1:n
 d1(i)=sqrt(sum((z(i,:)-x1).^2));
 d2(i)=sqrt(sum((z(i,:)-x2).^2));
end

end
findidealpoints
function [x1,x2]=findidealpoints(z)
[n,m]=size(z);
x1=zeros(1,m);
x2=zeros(1,m);
for j=1:m
 x1(j)=max(z(:,j));
 x2(j)=min(z(:,j));
end
end
formulation
function A=formulation(z)
[n,m]=size(z);
A=zeros(n,m);
for j=1:m
 %var_type(j)=input('please input a var_type: ');
 var_type(j)=1;
end
for i=1:n
 for j=1:m
 if var_type(j)==1
 A(i,j)=(z(i,j)-min(z(:,j)))./(max(z(:,j))-min(z(:,j)));
 elseif var_type(j)==0
 A(i,j)=(max(z(:,j))-z(i,j))./(max(z(:,j))-min(z(:,j)));
 end
 
 end
end
end
topsis
function r=topsis(z)
[n,m]=size(z);
A=formulation(z);%规范化矩阵

% 修改后
w=[0.1154 0.1154 0.1154 0.1154 0.1154 0.4231];

%w=[0.1 0.1 0.1 0.1 0.1 0.5];
%w=[0.125 0.125 0.125 0.125 0.125 0.375];
%w=[0.4333333 0.066667 0.066667 0.066667 0.066667 0.3];
%w=[0.066667 0.43333333 0.066667 0.066667 0.066667 0.3];
%w=[0.066667 0.066667 0.433333 0.066667 0.066667 0.3];
%w=[0.066667 0.066667 0.066667 0.4333333 0.066667 0.3];
%w=[0.066667 0.066667 0.066667 0.066667 0.4333333 0.3];
for i=1:n
    A(i,:)=w.*A(i,:);
end
%A=w.*A;
[x1,x2]=findidealpoints(A);%确定正负理想解
[d1,d2]=computingdistance(A,x1,x2);%计算距离
c=computingdegree(d1,d2);%计算接近程度
e=[d1',d2',c']
xlswrite("d1d2c",e);
r=sorting(c);%排序
end

你可能感兴趣的:(数学建模,matlab,matlab,算法)