TOPSIS法详细原理+MATLAB代码

1. 什么是TOPSIS法

❑ TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)方法是一种多属性决策方法,通过比较备选解与理想解之间的距离来确定最佳的排序顺序。正理想解是在每个属性上都达到最佳值的解,而负理想解则是在每个属性上都达到最差值的解。

❑ 为了确定备选解与理想解的距离,首先计算每个备选解与理想解之间的欧式距离或其他合适的距离度量。然后,计算备选解与理想解之间的正标准化距离和负标准化距离。正标准化距离反映了备选解与正理想解的接近程度,而负标准化距离反映了备选解与负理想解的接近程度。

❑ 最佳的排序顺序是备选解与正理想解的距离最短,与负理想解的距离最远的顺序。备选解越接近正理想解,其得分越高,越接近负理想解,其得分越低。这可以帮助决策者确定最佳的备选解,以达到多属性决策的目标。

2. TOPSIS法的基本步骤

Step1 正向化与标准化处理

假设有m个评价对象,每个评价对象有n个评价指标,对其进行综合评价得到的原始矩阵 X 为:

❑ 正向化处理

指标的正向化是指将所有指标转化为极大型指标,即其值越大越优。这样之后的计算和代码就可以更统一简洁。

指标的类型有:极大型指标、极小型指标、中间型指标、区间型指标。转化方法如下:

  • 极小型指标 → 极大型指标

        若所有元素均为正数,也可以直接取倒数:

  • 中间型指标 → 极大型指标

        其中,x_{best}为该指标最佳的数值。

  • 区间型指标 → 极大型指标

        其中,a和b是该指标最佳区间的上下限。

❑ 标准化处理

进行标准化处理是为了平衡指标之间的差异或量纲带来的误差。可采用以下两种方法(注如果在正向化处理的同时也进行了标准化,就可以不用再进行标准化处理):

  • Zscore标准化

  • Mapminmax标准化

正向化和标准化处理后得到规范矩阵 Z :

Step2 计算加权规范矩阵

这里的权重 W 可以由其他方法确定,例如熵权法等。

Step3 计算正负理想解

正理想解为

负理想解为

Step4 计算与正负理想解的距离

计算目标值与正负理想解之间的欧式距离,其中目标到正理想解的距离

到负理想解的距离

Step5 计算与理想解的贴近度

其中0\leqslant S_{i}\leq 1,当 S_{i}=0 时,表示该目标为最劣目标;当 S_{i}=1 时表示该目标为最优目标。在实际的多目标决策中,最优目标和最劣目标存在的可能性很小。

Step6 对目标优劣性进行排序

根据 S_{i} 的值按从小到大的顺序对个评价目标进行排列排序, S_{i} 值越大,该目标越优

3. TOPSIS法的MATLAB代码

clc;clear;
% X = [2.5 2.0 140 10 10 7
%     3.0 2.1 100 4 8 5
%     1.8 1.8 120 20 6 8
%     2.2 2.4 90 12 9 8
%     1.9 1.6 115 18 9 9
%     2.0 2.1 96 15 7 8];
% w = [0.25 0.1 0.15 0.2 0.2 0.1]; %指标权重
X = [89 2
    60 0
    74 1
    99 3];

%Step1数据预处理-指标正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象' num2str(m) '个评价指标']);
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1,不需要输入0:']);

if Judge == 1
    zhibiao_label = input(['请输入需要各指标的类型,其中极大型指标输入1/2,极小型指标输入3/4/5,' ...
        '中间型指标输入6,区间型指标输入7,例如[1,3,3,3,1,1]:']); 
    X = preprocess(X,zhibiao_label);
end

disp('正向化后的矩阵 X =');
disp(X);


%Step1数据预处理-标准化
Z = X./repmat(sum(X.*X).^0.5,n,1);
disp('标准化后的矩阵 Z =');
disp(Z);

%Step2计算加权规范矩阵
disp("有多少指标就有多少个权重数(权重和为1),如[0.25 0.1 0.15 0.2 0.2 0.1]");
w = input(['请输入' num2str(m) '个权重:']);
if abs(sum(w)-1)<0.000001 && size(w,1) ==1 && size(w,2) == m
else 
    w = input('你输入的有误,请重新输入权重行向量:');
end

%Step3计算正负理想解
%Step4计算与正负理想解的距离
D_P = sum(w.*(Z-repmat(max(Z),n,1)).^2,2).^0.5; %最优距离
D_N = sum(w.*(Z-repmat(min(Z),n,1)).^2,2).^0.5; %最劣距离
% D_P = sum(((Z - repmat(max(Z),n,1)) .^ 2 ) .* repmat(w,n,1) ,2) .^ 0.5; 
% D_N = sum(((Z - repmat(min(Z),n,1)) .^ 2 ) .* repmat(w,n,1) ,2) .^ 0.5; 

%Step5计算与理想解的贴近度
S = D_P./(D_P+D_N);

%Step6对目标优劣性进行排序
disp("最后归一化后的得分为和排名:");
std_S = S./sum(S); %归一化得分
[sorted_S,index] = sort(std_S,'descend')

正向化处理和标准化处理函数(即上面原理公式的复现):

function data_ok=preprocess(data,zhibiao_label)
    %正向化处理/+标准化处理
    %行是对象,列是指标
    for i=1:length(zhibiao_label)
        if (zhibiao_label(i)==1)
            data_ok(:,i)=zheng1(data(:,i));
        elseif (zhibiao_label(i)==2)
            data_ok(:,i)=zheng2(data(:,i));
        elseif (zhibiao_label(i)==3)
            data_ok(:,i)=fu3(data(:,i));
        elseif (zhibiao_label(i)==4)
            data_ok(:,i)=fu4(data(:,i));
        elseif (zhibiao_label(i)==5)
            data_ok(:,i)=fu5(data(:,i));
        elseif (zhibiao_label(i)==6)
            prompt = '这是中间型指标,请输入该指标的最优值: ';
            a = input(prompt);
            data_ok(:,i)=dan6(data(:,i),a);
        elseif (zhibiao_label(i)==7)
            prompt = '这是区间型指标,请输入该指标的最佳区间如[5,10]:';
            aa=input(prompt);
            data_ok(:,i)=qu7(data(:,i),aa(1),aa(2));
        end
    end
end


%正向指标法1--填1的时候选择
function data1=zheng1(data)
    data1=(data-min(data))./(max(data)-min(data)); %标准化处理
end

%正向指标法2--填2的时候选择
function data2=zheng2(data)
    data2=data; %不处理
end

%负向指标法1--填3的时候选择
function data3=fu3(data)
    data3=(max(data)-data)./(max(data)-min(data));
end

%负向指标法2--填4的时候选择
function data4=fu4(data)
    data4=(max(data)-data);
end

%负向指标法3--填5的时候选择
function data5=fu5(data)
    data5=1./(max(abs(data))+data);
end

%某点最优--填6的时候选择
function data6=dan6(data,best)
    data6=1-(abs(data-best)./max(abs(data-best)));
end

%区间指标--填7的时候选择
function data7=qu7(data,a,b)
    if ((a-min(data))>=(max(data)-b))
        M=a-min(data);
    else
        M=max(data)-b;
    end
    for i=1:length(data)
        if (data(i)<a)
            data7(i)=1-(a-data)./M;
        elseif (data(i)>=a)&&(data(i)<=b)
            data7(i)=1;
        elseif (data(i)>b)
            data7(i)=1-(x-b)./M;
        end
    end
end
  • 47
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Topsis是一种常用于多属性决策的分析方,通过对每个属性的权重进行评估和确定,以便更准确地进行决策。下面是一个使用MATLAB进行TOPSIS分析的简单代码示例: 首先,假设我们有三个属性A、B和C,每个属性有5个可选项。我们需要计算每个属性的权重并将其标准化。 ```matlab % 属性矩阵 X = [1 3 5; 2 4 2; 3 5 3; 4 2 4; 5 1 1]; % 归一化 normX = X./sqrt(sum(X.^2, 1)); % 正向化 posX = max(normX) - normX; % 权重数组 weights = [0.4 0.3 0.3]; % 加权矩阵 weightX = posX .* weights; % 确定正理想解和负理想解 idealPositive = max(weightX); idealNegative = min(weightX); % 计算与正理想解和负理想解的欧几里德距离 D_positive = sqrt(sum((weightX - idealPositive).^2, 2)); D_negative = sqrt(sum((weightX - idealNegative).^2, 2)); % 计算综合评价得分 closeness = D_negative ./ (D_positive + D_negative); % 输出综合评价得分 closeness ``` 以上代码中,属性矩阵`X`中的每一列对应于一个属性的值。首先,通过将每个属性的值除以该属性值的平方和的开方来对属性矩阵进行归一化。然后,通过从归一化后的矩阵中减去每个属性值的最大值来进行正向化。接下来,通过乘以权重数组,得到加权矩阵。然后,找到正理想解和负理想解,并计算每个样本与两个解的欧几里德距离。最后,通过计算综合评价得分,将其用于排序和决策。 这是一个简单的MATLAB代码示例,可以根据实际需要进行扩展和修改。 ### 回答2: TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种常用的多准则决策方,用于评估候选方案的优劣程度。该方根据每个候选方案与最佳和最差解的接近程度进行评价,从而确定最优解。 在MATLAB中,可以使用以下代码来实现TOPSIS求权重: 1. 首先,需要定义输入矩阵X,其中每行表示一个候选方案,每列表示一个评价指标。 ```matlab X = [3 5 7; 4 6 8; 2 4 6; 5 7 9]; % 示例输入矩阵 ``` 2. 然后,需要对输入矩阵进行归一化处理,将各个指标的取值范围统一化到[0, 1]区间内。 ```matlab normalized_X = X ./ sqrt(sum(X.^2, 1)); ``` 3. 接下来,需要确定每个评价指标的权重。可以使用主成分分析(PCA)来确定权重。 ```matlab [coeff, ~, latent] = pca(normalized_X); weights = latent ./ sum(latent); ``` 4. 然后,需要确定理想解和反理想解。 ```matlab ideal_solution = max(normalized_X, [], 1); worst_solution = min(normalized_X, [], 1); ``` 5. 计算每个候选方案与理想解和反理想解之间的接近度。 ```matlab d_plus = sqrt(sum((normalized_X - ideal_solution).^2, 2)); d_minus = sqrt(sum((normalized_X - worst_solution).^2, 2)); ``` 6. 最后,根据接近度计算每个候选方案的最终得分。 ```matlab score = d_minus ./ (d_plus + d_minus); ``` 通过上述步骤,就可以使用TOPSIS获取权重并计算候选方案的得分。 请注意,上述代码仅为示例,实际应用中可能需要根据具体情况进行适当的修改和调整。 ### 回答3: TOPSIS是一种多属性决策方,用于确定不同属性对决策结果的重要程度。其主要步骤包括:确定决策矩阵、正向化与标准化、计算加权规范化决策矩阵、计算正负理想解、计算相对接近度,并最终得出最优方案。下面是基于MATLAB的TOPSIS求权重的代码示例: 1.首先,我们需要输入决策矩阵data,以及每个属性的权重向量weights。假设有N个决策方案和M个属性: ```matlab data = [x1, x2, x3, ..., xn]; % 输入决策矩阵 weights = [w1, w2, w3, ..., wm]; % 输入权重向量 ``` 2.进行正向化与标准化,将数据归一化到[0, 1]之间。 ```matlab % 正向化 max_data = max(data,[],1); % 每个属性的最大值 min_data = min(data,[],1); % 每个属性的最小值 data_normalized = (data - min_data)./ (max_data - min_data); % 标准化 weights_normalized = weights./sum(weights); ``` 3.计算加权规范化决策矩阵。 ```matlab weighted_normalized_matrix = data_normalized .* weights_normalized; ``` 4.计算正负理想解。 ```matlab PIS = max(weighted_normalized_matrix,[],1); % 正理想解,取每个属性的最大值 NIS = min(weighted_normalized_matrix,[],1); % 负理想解,取每个属性的最小值 ``` 5.计算相对接近度。 ```matlab d_plus = pdist2(weighted_normalized_matrix,PIS); % 计算每个方案与正理想解之间的欧氏距离 d_minus = pdist2(weighted_normalized_matrix,NIS); % 计算每个方案与负理想解之间的欧氏距离 relative_closeness = d_minus ./ (d_plus + d_minus); % 相对接近度 = 负距离 / (正距离 + 负距离) ``` 最终,根据相对接近度,可以获得最优方案或进行决策结果排序。 这是一个简单的TOPSIS求权重的MATLAB代码示例。根据具体的问题和数据,可能需要进行一些调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值