clc
close all
clear all
%% 第一部分 计算CR综合权重
%% 序关系分析法(G1法)
% 设置数据路径
filepath='data.xlsx';
%step1 读取专家重要性排序
Imp_seq=xlsread(filepath,'G1法数据','A2:G2');
%step2 读取专家重要性之比
Imp_rate=xlsread(filepath,'G1法数据','B4:B9');
%step3 计算最低重要性专家的权重(作为基本单位,因为其他专家的权重都是他的倍数)
base_w= cumprod([Imp_rate',1],'reverse');
N=length(Imp_seq); %计算专家人数
weights_G1(N) = 1/sum(base_w);
for n = N-1:-1:1
weights_G1(n) = weights_G1(n+1) * Imp_rate(n);
end
for i=1:N
fprintf('专家%i的主观权重为:%0.4f\n',find(Imp_seq==i),weights_G1(i))
end
disp('------------------------------------------------')
%% 熵权法分析法(EWM)
filepath='data.xlsx';
%step1 读取决策矩阵
data=xlsread(filepath,'专家决策矩阵','B2:Q8');
data=data';
% 将决策矩阵规范化
[n, m] = size(data);
data_norm = zeros(n, m);
for j = 1:m
data_norm(:, j) = data(:, j) / sum(data(:, j));
end
% 计算信息熵值
entropy = -log2(m)*sum(data_norm .* log2(data_norm), 1);
% 计算权重
weights_EWM = (1 - entropy) / sum(1 - entropy);
for i=1:m
fprintf('专家%i的客观权重为:%0.4f\n',i,weights_EWM(i))
end
disp('------------------------------------------------')
%% 综合权重
%% 将G1的权重按照顺序排列
weights_G1_sorted=weights_G1(Imp_seq);
% 计算主客观权重距离
dist=(weights_EWM-weights_G1_sorted).^2;
% 构建二次项系数
H=2*diag(dist);
% 等式约束 :权重和=1
Aeq=ones(1,m);
beq=1;
% 边界条件 0<=w<=1
lb=zeros(m,1);
ub=ones(m,1);
% quadprog 求解器求解
weights_comb = quadprog(H,[],[],[],Aeq,beq,lb,ub);
for i=1:m
fprintf('专家%i的综合权重为:%0.4f\n',i,weights_comb(i))
end
disp('------------------------------------------------')
%% 计算基础重要度
T=data*weights_comb;
for i=1:length(T)
fprintf('CR%i的基本重要度为:%0.4f,二元语义表示为(S%i,%0.4f)\n',i,T(i),round(T(i)),T(i)-round(T(i)))
end
disp('------------------------------------------------')
%% 求解CR的权重
weight_CR=T./sum(T);
for i=1:length(T)
fprintf('CR%i的权重为:%0.4f\n',i,weight_CR(i))
end
disp('------------------------------------------------')
%% 第二部分 求Ta权重以及Ta效果评价
D1=xlsread(filepath,'关联矩阵','B2:K17');
D2=xlsread(filepath,'关联矩阵','A20:k35');
D3=xlsread(filepath,'关联矩阵','A38:k53');
D4=xlsread(filepath,'关联矩阵','A56:k71');
D5=xlsread(filepath,'关联矩阵','A74:k89');
D6=xlsread(filepath,'关联矩阵','A92:k107');
D7=xlsread(filepath,'关联矩阵','A110:k125');
%% 专家加权后的评价矩阵
Dall=D1*weights_comb(1)+D2*weights_comb(2)+D3*weights_comb(3)+...
D4*weights_comb(4)+D5*weights_comb(5)+D6*weights_comb(6)+...
D7*weights_comb(7);
%%
for i=1:size(Dall,1)
rowname{i}=['CR' num2str(i)];
end
for i=1:size(Dall,2)
colname{i}=['TA' num2str(i)];
end
CRname=table('Rownames',rowname');
Dtable=array2table(Dall);
Dtable.Properties.VariableNames=colname;
disp('关联矩阵-实数')
disp([CRname Dtable])
for i=1:size(Dall,1)
for j=1:size(Dall,2)
TTL{i,j}=['(S' num2str(round(Dall(i,j))) ',' num2str(Dall(i,j)-round(Dall(i,j))) ')'];
end
end
disp('------------------------------------------------')
Dtable_TTL=array2table(TTL);
Dtable_TTL.Properties.VariableNames=colname;
disp('关联矩阵-二元语义')
disp([CRname Dtable_TTL])
disp('------------------------------------------------')
%% 计算TA权重
weight_Ta=weight_CR'*Dall;
for i=1:length(weight_Ta)
fprintf('TA%i的权重Z%i为:%0.4f\n',i,i,weight_Ta(i))
end
disp('------------------------------------------------')
%% 计算TA的评价结果
A=xlsread(filepath,'评价矩阵','B2:K8');
Xj=weights_comb'*A;
for i=1:length(Xj)
fprintf('TA%i的评价结果为:%0.4f,二元语义表示为(S%i,%0.4f)\n',i,Xj(i),round(Xj(i)),Xj(i)-round(Xj(i)))
end
disp('------------------------------------------------')
X=sum(Xj.*weight_Ta)/sum(Xj);
for i=1:length(Xj)
fprintf('TA%i的实施效果X%i为:%0.4f\n',i,i,Xj(i))
end
disp('------------------------------------------------')
fprintf('总体实施效果X为:%0.4f\n',X)
%%
filename='结果.xlsx';
writetable([CRname Dtable],filename,'WriteRowNames',true,'Sheet','关联矩阵-专家加权后-实数')
writetable([CRname Dtable_TTL],filename,'WriteRowNames',true,'Sheet','关联矩阵-专家加权后-二元语义')
% xlswrite(filename,Dtable,'Sheet','关联矩阵-专家加权后-实数')
% xlswrite(filename,Dtable_TTL,'Sheet','关联矩阵-专家加权后-二元语义')