帮朋友忙时,最后不得已帮她实现,特此记录。
参考文献:[1]杨宝臣, 陈跃, YANG,等. 基于组合赋权TOPSIS模型的项目评标方法研究[J]. 电子科技大学学报:社会科学版, 2011, 13(1):6.
基本实现文献代码复现。
其中组合权重这样定义:
其中是熵权法(客观)算出来的权重,
是AHP法(主观)算出来的权重。
加权标准化决策矩阵Z :
现给出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);