matlab:基于组合赋权的topsis法

帮朋友忙时,最后不得已帮她实现,特此记录。

参考文献:[1]杨宝臣, 陈跃, YANG,等. 基于组合赋权TOPSIS模型的项目评标方法研究[J]. 电子科技大学学报:社会科学版, 2011, 13(1):6.

基本实现文献代码复现。

其中组合权重这样定义:

                                    \omega _{j}=\frac{\alpha _{j}\beta _{j}}{\sum_{j=1} ^{n}\alpha _{j}\beta _{j} }

其中\alpha _{j}是熵权法(客观)算出来的权重,\beta _{j}是AHP法(主观)算出来的权重。

加权标准化决策矩阵Z :

                         matlab:基于组合赋权的topsis法_第1张图片

 

现给出matlab代码:

五个函数部分:

一、数据处理:

1.极大型:

function [v] = toMax(x)
    M = max(x)-min(x);
    v = (x - min(x)) / M;
end

2.极小型:

function [v] = toMin(x)
    M = max(x)-min(x);
    v = (max(x)-x) / M;
end

3.中间型:

function v=toMean(x,xb)
%xb是你认为最优的值
M=max(abs(x-xb));
v=1-abs(x-xb)/M;
end

二、熵权法计算权重:

function weights = EntropyWeight(R)
%% 熵权法求指标权重,R为输入矩阵,返回权重向量weights

[rows,cols]=size(R);   % 输入矩阵的大小,rows为对象个数,cols为指标个数
k=1/log(rows);        % 求k

f=zeros(rows,cols);   % 初始化fij
sumBycols=sum(R,1);   % 输入矩阵的每一列之和(结果为一个1*cols的行向量)
% 计算fij
for i=1:rows
    for j=1:cols
      f(i,j)=R(i,j)./sumBycols(1,j);
   end
end

lnfij=zeros(rows,cols);  % 初始化lnfij
% 计算lnfij
for i=1:rows
    for j=1:cols
       if f(i,j)==0
          lnfij(i,j)=0;
       else
          lnfij(i,j)=log(f(i,j));
       end
   end
end

Hj=-k*(sum(f.*lnfij,1)); % 计算熵值Hj
weights=(1-Hj)/(cols-sum(Hj));
end

三、AHP法计算权重:

function weights = AHP(A)
[V,D] = eig(A)
[Lmax,ind] = max(diag(D));     % 求最大特征值及其位置
weights = V(:,ind) / sum(V(:,ind))   % 最大特征值对应的特征向量做归一化, 即权向量

四、主代码:

load x.mat;
z=x;
%指标数据处理
for i=1:6
        z(:,i)=toMean(z(:,i),0)
end
%我这是直接输入AHP中的比较矩阵
A=[1 1/2 1/3 1/2 2 0.25;2 1 1/2 1/4 1/2 1/4;3 2 1 2 2 1/4;2 4 1/2 1 1 1/4;1/2 2 1/2 1 1 1/4;4 4 4 4 4 1];
%熵权重
weight1=EntropyWeight(z);
weight1
%AHP权重
weight2=AHP(A);
weight2
%组合权重
weight3=weight1.*(weight2)';
weight=weight3/sum(weight3);
weight
%加权标准化矩阵Z
for i=1:5
    z(i,:)=weight.*z(i,:)
end
%% 计算与最大值和最小值的距离,并计算得分
D_P = sum((z - repmat(max(z),5,1)) .^ 2 ,2) .^ 0.5;   % D+ 与最大值的距离向量
D_N = sum((z - repmat(min(z),5,1)) .^ 2 ,2) .^ 0.5;   % D- 与最小值的距离向量
S = D_N ./ (D_P+D_N);    % 未归一化的得分
disp('最后的得分为:');
stand_S = S / sum(S)
[sorted_S,index] = sort(stand_S ,'descend');
disp('标准化后得分为:');
disp(sorted_S);
disp('对应的下标为:');
disp(6-index);

你可能感兴趣的:(算法,矩阵,线性代数)