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)
function result=sorting(e)
c=e;
n=size(c,2);%向量中元素的数目
result=[];
%记录 c 中元素最大的位置,将最大的数的数值设置为一个小量-1000000000;
for i=1:n
[a,result(i)]=max(c);
c(result(i))=-1000000000000;
end
end
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
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
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
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
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