原理 TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)法是一种多准则决策分析方法,用于在多个备选方案中选择最优的方案。该方法基于这样的假设:最佳的备选方案应当与理想解最接近,同时与负理想解最远。理想解是指每个评价指标都达到最优值的假想方案,而负理想解则是指每个评价指标都是最差值的假想方案。
以下是使用TOPSIS法进行决策分析的基本步骤:
构建决策矩阵 :首先确定评估的备选方案和评价指标,并根据这些信息建立一个决策矩阵,其中行表示不同的备选方案,列表示不同的评价指标。
标准化决策矩阵 :由于各个指标可能有不同的量纲和数量级,因此需要对决策矩阵中的数据进行标准化处理,以消除量纲的影响。
计算加权标准化矩阵 :为每个评价指标分配权重,反映其重要性程度,然后将权重与标准化后的决策矩阵相乘得到加权标准化矩阵。
确定理想解和负理想解 :对于每一个评价指标,找出最大值构成理想解(正理想解),最小值构成负理想解(负理想解)。注意对于成本型指标(越小越好)和效益型指标(越大越好),理想解和负理想解的定义是相反的。
计算各方案与理想解及负理想解的距离 :使用欧几里得距离公式分别计算每个备选方案到理想解和负理想解的距离。
计算相对贴近度 :通过计算每个备选方案到理想解的距离与到负理想解的距离的比例来衡量相对贴近度,即C_i = D_i^- / (D_i^+ + D_i^-),其中C_i代表第i个方案的相对贴近度,D_i^+和D_i^-分别是到理想解和负理想解的距离。
排序并选择最优方案 :根据相对贴近度对所有备选方案进行排序,相对贴近度越接近于1的方案被认为是最优的。
TOPSIS法因其简单易用、结果直观等优点,在工程、经济、管理等领域得到了广泛的应用。然而,它也依赖于合理的权重设定,如果权重设置不合理,可能会导致决策结果出现偏差。
四种指标的正向化:
代码 极小型 1 2 3 4 function [posit_x] = Min2Max (x) posit_x = max (x) - x; end
中间型 1 2 3 4 function [posit_x] = Mid2Max (x,best) M = max (abs (x-best)); posit_x = 1 - abs (x-best) / M; end
区间型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function [posit_x] = Inter2Max (x,a,b) r_x = size (x,1 ); M = max ([a-min (x),max (x)-b]); posit_x = zeros (r_x,1 ); for i = 1 : r_x if x(i ) < a posit_x(i ) = 1 -(a-x(i ))/M; elseif x(i ) > b posit_x(i ) = 1 -(x(i )-b)/M; else posit_x(i ) = 1 ; end end end
正向化函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function [posit_x] = Positivization (x,type,i) if type == 1 disp (['第' num2str(i ) '列是极小型,正在正向化' ] ) posit_x = Min2Max(x); disp (['第' num2str(i ) '列极小型正向化处理完成' ] ) disp ('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~' ) elseif type == 2 disp (['第' num2str(i ) '列是中间型' ] ) best = input('请输入最佳的那一个值: ' ); posit_x = Mid2Max(x,best); disp (['第' num2str(i ) '列中间型正向化处理完成' ] ) disp ('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~' ) elseif type == 3 disp (['第' num2str(i ) '列是区间型' ] ) a = input('请输入区间的下界: ' ); b = input('请输入区间的上界: ' ); posit_x = Inter2Max(x,a,b); disp (['第' num2str(i ) '列区间型正向化处理完成' ] ) disp ('~~~~~~~~~~~~~~~~~~~~分界线~~~~~~~~~~~~~~~~~~~~' ) else disp ('没有这种类型的指标,请检查Type向量中是否有除了1、2、3之外的其他值' ) end end
topsis函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 X=input('指标矩阵A=' ); [n,m] = size (X); disp (['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标' ]) Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ' ]); if Judge == 1 Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: ' ); disp ('请输入需要处理的这些列的指标类型(1:极小型, 2:中间型, 3:区间型) ' ) Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: ' ); for i = 1 : size (Position,2 ) X(:,Position(i )) = Positivization(X(:,Position(i )),Type(i ),Position(i )); end disp ('正向化后的矩阵 X = ' ) disp (X) end Z = X ./ repmat (sum(X.*X) .^ 0.5 , n, 1 ); disp ('标准化矩阵 Z = ' )disp (Z)D_P = sum([(Z - repmat (max (Z),n,1 )) .^ 2 ],2 ) .^ 0.5 ; D_N = sum([(Z - repmat (min (Z),n,1 )) .^ 2 ],2 ) .^ 0.5 ; S = D_N ./ (D_P+D_N); disp ('最后的得分为:' )stand_S = 100 *S / sum(S) [sorted_S,index] = sort (stand_S ,'descend' )