TOPSIS-matable(清风数学建模)2019b

%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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值