%TOPSIS
%欢迎模板
%确认是否适合TOPOSIS方法
disp("请输入原始数据:")
A = input("A = ")
[m,n] = size(A)
Error = 0
Judge = 0
if m <= 15
disp("不适合TOPSIS法评价,可以考虑AHP法")
else
Judge = 1
end
%判断各指标性质,进行正向化同时标准化
if Judge == 1
for i = 1:n
disp(["请判断第",num2str(i),"列的指标类型"])
disp("1为极大型,2为极小型,3为中间型,4为区间型")
a = input("请输入该列的指标类型:")
if a == 1
A(:,i) = BZH(A(:,i))
disp(A(:,i))
end
if a == 2
A(:,i) = JXZXH(A(:,i))
A(:,i) = BZH(A(:,i))
disp(A(:,i))
end
if a == 3
A(:,i) = ZJZXH(A(:,i))
A(:,i) = BZH(A(:,i))
disp(A(:,i))
end
if a == 4
A(:,i) = QJZXH(A(:,i))
A(:,i) = BZH(A(:,i))
disp(A(:,i))
end
end
disp("正向标准化后的矩阵为:")
disp(A)
Judge = 2
end
if Judge == 2
disp("请确认是否要添加权重:")
Judge_qz = input("0:添加权重,1:不添加权重")
if Judge_qz == 1
%计算得分并且归一化
A_max = (sum((repmat(max(A),m,1) - A).^2,2)).^(0.5)
A_min = (sum((repmat(min(A),m,1) - A).^2,2)).^(0.5)
%未归一化得分
disp("未归一化得分:")
S = A_min./(A_max + A_min)
%归一化得分
disp("归一化得分:")
S_gy = S./sum(S)
%对象排序,从小到大
[S_sorted,index] = sort(S_gy,'descend')
disp("不添加权重对象排序,从大到小为:")
disp(index)
end
if Judge_qz == 0
QZ = input("请输入权重:")
%计算得分并且归一化
A_max = (sum((repmat(max(A),m,1) - A).*QZ.^2,2)).^(0.5)
A_min = (sum((repmat(min(A),m,1) - A).*QZ.^2,2)).^(0.5)
%未归一化得分
disp("未归一化得分:")
S = A_min./(A_max + A_min)
%归一化得分
disp("归一化得分:")
S_gy = S./sum(S)
%对象排序,从小到大
[S_sorted,index] = sort(S_gy,'descend')
disp("添加权重后对象排序,从大到小为:")
disp(index)
end
end
%标准化计算
function [BZH] = BZH(x)
BZH = x./(sum(x.*x).^(1/2))
end
%极小值正向化计算,因为数据全为正采取这个方案
function [JXZXH] = JXZXH(x)
JXZXH = x.^(-1)*100
end
%中间型正向化
function [ZJZXH] = ZJZXH(x)
best = input("请输入最佳值:")
ZJZXH = 1-(abs(x-best)/(max(x-best)))
endfunction [QJZXH] = QJZXH(x)
a = input("请输入下界:")
b = input("请输入上界:")
[r,w] = size(x)
M = max(10 - min(x),max(x - 20))
for j = 1:r
if x(j) < a
QJZXH(j) = 1 - ((a - x(j))/M)
elseif x(j) >= a && x(j) <= b
QJZXH(j) = 1
else x(j) > b
QJZXH(j) = 1-((x(j) - b)/M)
end
end
disp(QJZXH)
end