数学建模:综合评价类问题算法应用案例

综合评价类问题算法应用案例

评价前的数据处理

1、极大型指标

(也称为“正向指标”,即数值越大越好的指标)

一般不做处理

(1)方法一

%正向指标1
%填1的时候选择
function data=zheng1(data1)
	data=(data1-min(data1))./(max(data1)-min(data1));
end
(2)方法二

%正向指标2
%填2的时候选择
function data=zheng2(data1)
	data=datal;
end

2、极小型指标

(也称“负向指标”,即数值越小越好的指标)

一般要把极小型指标化成极大型指标,如(2)

(1)方法一

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

%负向指标2
%填4的时候选择
function data=fu3(data1)
	data=(max(data1)-data1);
end
(3)方法三

%填5的时候选择
function data=fu3(data1)
	data=1./(max(abs(data1))+data1);
end

3、中间型指标

(也称“单点型指标”,即数值即某个值的时候是最好的指标)

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

4、区间型指标

%区间指标1
%填7的时候选择
function data=qu7(data1,a,b)
    for i=1:length(data1)
        if(data1>a)&&(data1<b)
        	data(0)=1;
        elseif(data1<a)
        	data(i)=data1/a;
        elseif (data1>b)
        	data(i)=b/data1;
    	end
	end
end

5、标准化处理

消除量纲

指标正向化后还需要对所有的指标进行标准化处理,对每一列都进行处理:

(1)Zscore标准化

(2)mapminmax标准化

层次分析法

简称AHP

基本思想

是定性与定量相结合的多准则决策、评价方法。将决策的有关元素分解成目标层、准则层和方案层,并通过人们的判断对决策方案的优劣进行排序,在此基础上进行定性和定量分析。它把人的思维过程层次化、数量化,并用数学为分析、决策、评价、预报和控制提供定量的依据。

基本步骤

  • 构建层次结构模型;

  • 构建成对比较矩阵;

  • 层次单排序及一致性检验(即判断主观构建的成对比较矩阵在整体上是否有较好的一致性);

  • 层次总排序及一致性检验(检验层次之间的一致性)。

优点

它完全依靠主观评价做出方案的优劣排序,所需数据量少,决策花费的时间很短。从整体上看,AHP在复杂决策过程中引入定量分析,并充分利用决策者在两两比较中给出的偏好信息进行分析与决策支持,既有效地吸收了定性分析的结果,又发挥了定量分析的优势,从而使决策过程具有很强的条理性和科学性,特别适合在社会经济系统的决策分析中使用。

缺点

用AHP进行决策主观成分很大。当决策者的判断过多地受其主观偏好影响,而产生某种对客观规律的歪曲时,AHP的结果显然就靠不住了。

适用范围

尤其适合于人的定性判断起重要作用的、对决策结果难于直接准确计量的场合。要使AHP的决策结论尽可能符合客观规律,决策者必须对所面临的问题有比较深入和全面的认识。另外,当遇到因素众多,规模较大的评价问题时,该模型容易出现问题,它要求评价者对问题的本质、包含的要素及其相互之间的逻辑关系能掌握得十分透彻,否则评价结果就不可靠和准确。

改进方法

(1)成对比较矩阵可以采用德尔菲法(匿名打分法,多人决策)获得。

(2)如果评价指标个数过多(一般超过9个),利用层次分析法所得到的权重就有一定的偏差,继而组合评价模型的结果就不再可靠。可以根据评价对象的实际情况和特点,利用一定的方法,将各原始指标分层和归类,使得每层各类中的指标数少于9

案例分析

问题:选这两人其中之一当男朋友,你会选谁?

显然,不同维度的权重会产生不同的结果,所以找到每个维度的权重是最核心的问题!!!

标度参考表

下面的 λ λ λmax是判断矩阵的最大特征向量(最大特征值是指线性代数意义上的|A-λE|max), n n n是样本数量。


为什么要进行一致性检验?

  1. 确保决策过程的合理性:一致性检验可以帮助评估决策者的判断是否存在矛盾或不一致,从而确保决策过程是合理的、可靠的。
  2. 提高决策结果的可信度:通过一致性检验,可以评估判断矩阵的一致性程度,如果判断矩阵不够一致,可能会导致决策结果不够可信,因此一致性检验可以提高决策结果的可信度。
  3. 帮助确定权重的相对重要性:一致性检验可以帮助确定各个准则或方案的权重,确保这些权重是相对合理和一致的,从而更好地反映实际情况。
代码
%% 层次分析法
clear;clc;
P=[8,7,6,8;7,8,8,7]; % 每一行代表一个对象的指标评分
%%
% A为自己构造的输入判别矩阵
A=[1,3,1,1/3;
    1/3,1,1/2,1/5;
    1,2,1,1/3;
    3,5,3,1];
%%
[n,m]=size(A); % size()计算n为行数,m为列数
% 求特征值特征向量,找到最大特征值对应的特征向量
[V,D]=eig(A); % 求特征值和特征向量 V代表特征向量 D记录特征值
tzz=max(max(D)); % 找到最大的特征值
c1=find(max(D)==tzz); % 找到最大的特征值位置
%%
tzx=V(:,c1); % 最大特征值对应的特征向量
% 赋权重
quan=zeros(n,1);
for i=1:n
    quan(i,1)=tzx(i,1)/sum(tzx);
end
%%
Q=quan;
% 一致性检验
CI=(tzz-n)/(n-1);
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
% 判断是否通过一致性检验
CR=CI/RI(1,n);
if CR>=0.1
	fprintf('没有通过一致性检验\n');
else
	fprintf('通过一致性检验\n');
end
%%
% 显示出所有评分对象的评分值
 score=P*Q;
 for i=1:length(score)
     name=['object_score',num2str(i)];
    eval([name,'=score(i)'])
 end

Topsis法

基本思想

TOPSIS法(模型)是根据评价对象与理想化目标的接近程度进行排序的方法,是一种距离综合评价方法。基本思路是通过假定正、负理想解,测算各样本与正、负理想解的距离,得到其与理想方案的相对贴近度。

基本步骤

  • 指标同向化、标准化并得到权重;

  • 得到加权后的规范化矩阵;

  • 确定正、负理想解;

  • 计算各样本距离正、负理想解的距离;

  • 计算各评价对象与最优方案的贴近程度。

优点

  • 避免了数据的主观性,不需要目标函数,不用通过检验,而且能够很好的刻画多个影响指标的综合影响力度。

  • 对于数据分布及样本量、指标多少无严格限制,既适于小样本资料,也适于多评价单元、多指标的大系统,较为灵活、方便。

缺点

  • 需要的每个指标的数据,对应的量化指标选取会有一定难度;

  • 不确定指标的选取个数为多少适宜,才能够去很好刻画指标的影响力度;

  • 必须有两个以上的研究对象才可以进行使用。

适用范围

Topsis法被广泛用于企业管理、市场营销、投资决策等领域。主要适用于评价指标相对较多,指标间相互独立

改进方法

在 TOPSIS 当中,默认了各个评价指标所占的权重相同,但在实际的评价过程当中由于各种主观客观因素的影响,导致每一个评价指标所占的权重是有差异的;

  • 主观权重——层次分析法(AHP)

  • 客观权重——熵权法

案例分析

该算法是直接用来评价的,它也可以和赋权方法一起用。逼近理想解排序法(the technique for order preference by similarity to an ideal solution,TOPSIS)是一种通过比较样本值与理想值的距离实现综合评价的方法。逼近理想解排序法采用相对接近度来表征各个评价对象与参考点的距离。

首先在空间确定出参考点,包括最优和最劣点,然后计算各个评价对象与参考点的距离,与最优点越近或与最劣点越远说明被评价对象的综合特性越好现设得到指标的权重为 w w wj,可以是均匀权重,也可以通过层次分析法等确定权重的方法获取,设正向化标准化后数据为 x x xij’,可以得到加权重后的数据为 r r rij

得到数据与最值之间的距离,处理过后可以构成数据矩阵 R = ( R=( R=( r r rij ) ) )m×n

定义每个指标即每列的最大值为 r r rj+ r r rj+ = m a x =max =max ( ( ( r r r1j, r r r2j,…, r r rnj ) ) )

定义每个指标即每列的最小值为 r r rj- r r rj- = m i n =min =min ( ( ( r r r1j, r r r2j,…, r r rnj ) ) )

定义第 i i i 个评价对象与最大值距离为 d d di+在这里插入图片描述
定义第i个评价对象与最小值距离为 d d di

计算评分:

代码

%% TOPSIS
 clc;clear;
data=[220	6	30	10	10	5
190	8	25	9	8	3
180	8	28	7	7	4
170	7	23	8	7	2];
index=3;
for i=1:length(index)
	data1(:,index(i))=(max(data(:,index(i)))-data(:,index(i)))/(max(data(:,index(i)))-min(data(:,index(i))));
end

%% 正向指标准化处理
index_all=1:size(data1,2); 
index_all(index)=[]; % 除负向指标外其余所有指标
index=index_all;
for i=1:length(index)
     data1(:,index(i))=(data(:,index(i))-min(data(:,index(i))))/(max(data(:,index(i)))-min(data(:,index(i))));
end
data1=zscore(data);
% for j=1:size(data1,2)
%     data1(:,j)= data(:,j)./sqrt(sum(data(:,j).^2));
% end

% 得到加权重后的数据
w=[0.3724, 0.1003,0.1991, 0.1991,0.0998,0.0485]; % 使用求权重的方法求得
R=data1.*w;

% 得到最大值和最小值距离
r_max=max(R); % 每个指标的最大值
r_min=min(R); % 每个指标的最小值
d_z = sqrt(sum([(R-repmat(r_max,size(R,1),1)).^2 ],2)); % d+向量
d_f = sqrt(sum([(R-repmat(r_min,size(R,1),1)).^2 ],2)); % d-向量  
% sum(data,2)对行求和,sum(data)默认对列求和
% 得到得分
s=d_f./(d_z+d_f );
Score=100*s/max(s);
for i=1:length(Score)
    fprintf('第%d个投标者百分制评分为:%d\n',i,Score(i));   
end

灰色关联综合评价法

(也称“灰色关联度分析”)。

基本思想

灰色关联分析的实质就是,可利用各方案与最优方案之间关联度大小对评价象进行比较、排序。关联度越大,说明比较序列与参考序列变化的态势越一致,反之,变化态势则相悖。由此可得出评价结果。

基本步骤

建立原始指标矩阵;确定最优指标序列;进行指标标准化或无量纲化处理;求差序列、最大差和最小差;计算关联系数;计算关联度。

优点

是一种评价具有大量未知信息的系统的有效模型,是定性分析和定量分析相结合的综合评价模型,该模型可以较好地解决评价指标难以准确量化和统计的问题,可以排除人为因素带来的影响,使评价结果更加客观准确。整个计算过程简单,通俗易懂,易于为人们所掌握;数据不必进行归一化处理,可用原始数据进行直接计算,可靠性强;评价指标体系可以根据具体情况增减;无需大量样本,只要有代表性的少量样本即可。

缺点

要求样本数据且具有时间序列特性;只是对评判对象的优劣做出鉴别,并不反映绝对水平,故基于灰色关联分析综合评价具有“相对评价”的全部缺点。

适用范围

对样本量没有严格要求,不要求服从任何分布,适合只有少量观测数据的问题;应用该种方法进行评价时,指标体系及权重分配是一个关键的题,选择的恰当与否直接影响最终评价结果。

改进方法

  • 采用组合赋权法:根据客观赋权法和主观赋权法综合而得权系数。

  • 结合TOPSIS法:不仅关注序列与正理想序列的关联度,而且关注序列与负理想序列的关联度,依据公式计算最后的关联度。

案例分析


灰色关联分析

灰色关联计算评分



由以上的案例我们分析一组银行数据:

代码

clc;clear ;close all
data_table1=readtable('银行数据.xlsx');
data_get1=table2array(data_table1(:,3:end));
%%
%最后求到的数据在数组B中然后都进行指标的正向化
%1,2 正向指标
%3,4,5 负向指标
%6 单点最优
%7 区间最优指标
zhibiao_label=[1,1,3,3,1,1,4];  %给出指标所需要处理标签
data_last=jisuan(data_get1,zhibiao_label);  %全部正向化之后的数据
%%
%A的排序结果
A_data=data_last;
%% 不同的方法
%  带有权重的TOPSIS法
W=1/length(zhibiao_label)*ones(1,length(zhibiao_label));  %可以根据层次分析法求
%%
scoreB=TOPSIS(A_data,W);  

%%
for n=1:100
    for i=1:length(W)-1
        rand1=rand(1)*0.5*max(W);
        rand2=rand(1);
        if(rand2>0.5)
            rand1=W(i)-rand1;
        else
            rand1=W(i)+rand1; 
        end
     W1(i)=rand1;

    end
    W2=W1;
    W2(length(W))=1-sum(W1);
    W_all(n,:)=W2;
end
%%
W_all=mapminmax(W_all,0,1);
% W_all=W_all'/sum(W_all');
for i=1:length(W_all)
    W_all1(i,:)=W_all(i,:)/sum(W_all(i,:));
end
%%
W_all=W_all1;
%%
for N=1: 100
    score_all(:,N)=TOPSIS(A_data,W_all(N,:));
end
%%
mean_score_all=mean(score_all');
%%
[AAA,BBB]=sort(mean_score_all','descend');
% data_resultA(:,1)= data_table1( BBB,1);
data_resultA(:,1)= data_table1( BBB,2);
data_resultA(:,2)= array2table(AAA);   %排序
% data_resultA  %最后结果 
std_score_all=std(score_all');
%%
x_test=1:length(mean_score_all);
limit(1,:)=mean_score_all-std_score_all;
limit(2,:)=mean_score_all+std_score_all;

COLOR=[184  184  246]/255;
COLOR1=[207  155  255]/255;
COLOR2=[190  210  254]/255;
COLOR3=[184  184  246]/255;
h1=fill([x_test,fliplr(x_test)],[limit(1,:),fliplr(limit(2,:))],COLOR,'DisplayName','不确定范围');
hold on
h1.FaceColor = COLOR;%定义区间的填充颜色      
h1.EdgeColor =[1,1,1];%边界颜色设置为白色
alpha .2   %设置透明色
plot(x_test,mean_score_all,'Color',COLOR1,'LineWidth',1,'DisplayName','评价均值') 
hold on
plot(x_test,limit(1,:),'--','Color',COLOR2,'DisplayName','评价下限')
hold on
plot(x_test,limit(2,:),'--','Color',COLOR3,'DisplayName','评价上限')
hold on
legend('show','Location','Best');
xticks([1:length(scoreB)])
xlabel('评价对象')
ylabel('分值')
set(gca,"FontSize",12,"LineWidth",2)
box off
legend Box off
disp('评分结果')
disp(mean_score_all)
%%  函数部分
function data=zheng1(data1)
%正向指标1
% 填1的时候选择
data=(data1-min(data1))./(max(data1)-min(data1));
end
function data=zheng2(data1)
%正向指标2
% 填2的时候选择
data=data1;
end
function data=fu3(data1)
%负向指标1
% 填3的时候选择
data=(max(data1)-data1)./(max(data1)-min(data1));
end
function data=fu4(data1)
%负向指标2
% 填4的时候选择
data=(max(data1)-data1);
end
function data=fu5(data1)
%负向指标3
% 填5的时候选择
data=1./(max(abs(data1))+data1);
end
function data=qu6(data1,a)
%某点最优
% 填6的时候选择
data=1./(abs(data1-a)/max(abs(data1-a)));
end
function data=qu7(data1,a,b)
%区间指标1
% 填7的时候选择
for i=1:length(data1)
    if(data1>a)&&(data1<b)
        data(i)=1;
    elseif (data1<a)
        data(i)=data1/a;
    elseif (data1>b)
        data(i)=b/data1;
    end
end
end
%%
function data1=jisuan(data,zhibiao_label)
if isa(data,'double')
    for i=1:length(zhibiao_label)
        if (zhibiao_label(i)==1)
            data1(:,i)=zheng1(data(:,i));
        elseif (zhibiao_label(i)==2)
            data1(:,i)=zheng2(data(:,i));
    elseif (zhibiao_label(i)==3)
            data1(:,i)=fu3(data(:,i));
    elseif (zhibiao_label(i)==4)
            data1(:,i)=fu4(data(:,i));
   elseif (zhibiao_label(i)==5)
            data1(:,i)=fu5(data(:,i));
  elseif (zhibiao_label(i)==6)
      prompt = '这是单点最优,请输入单点最优值 ';
       a = input(prompt);
           data1(:,i)=qu6(data(:,i),a);
  elseif (zhibiao_label(i)==7)
     prompt = '这是区间最优,请输入单点最区间如[5,10] ';
      aa=prompt;
           data1(:,i)=qu7(data(:,i),aa(1),aa(2));
    end
    end
elseif isa(data,'cell')
%     data2=data;
    for j=1:length(data)
        data2=data{j};
        if size(zhibiao_label,1)==1
            zhibiao_label1=repmat(zhibiao_label,3,1);
        else
            zhibiao_label1=zhibiao_label;
       end
        for i=1:length(zhibiao_label1(j,:))
               if (zhibiao_label(i)==1)
            data1{j}(:,i)=zheng1(data2(:,i));
        elseif (zhibiao_label(i)==2)
            data1{j}(:,i)=zheng2(data2(:,i));
       elseif (zhibiao_label(i)==3)
            data1{j}(:,i)=fu3(data2(:,i));
       elseif (zhibiao_label(i)==4)
            data1{j}(:,i)=fu4(data2(:,i));
      elseif (zhibiao_label(i)==5)
            data1{j}(:,i)=fu5(data2(:,i));
     elseif (zhibiao_label(i)==6)
      prompt = '这是单点最优,请输入单点最优值 ';
       a = input(prompt);
           data1{j}(:,i)=qu6(data2(:,i),a);
    elseif (zhibiao_label(i)==7)
     prompt = '这是区间最优,请输入单点最区间如[5,10] ';
      aa=prompt;
           data1{j}(:,i)=qu7(data2(:,i),aa(1),aa(2));
    end
        end
    end
end
end


  • 23
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值