Ⅰ.问题引入

张三决定从三种车型中选购一种,选择标准主要有:价格、耗油量、舒适程度、外表。经过反复思考,构造它们之间的成对比较判断矩阵如下:

三种车型a、b、c关于价格、耗油量、舒适程度、外表的成对比较判断矩阵如下:

问题:

i.  根据上述矩阵可以看出四项指标在张三心中的比重是不同的,请按由重到轻顺序将它们排列;

ii.  哪辆车型最便宜,哪辆车型最省油,哪辆车型最舒适,哪辆车型最漂亮?

iii.  用层次分析法确定张三对这三种车型的喜欢程度。

Ⅱ.问题分析与求解

根据题意,建立模型结构图如下:

根据成对比较判断矩阵,对矩阵具体数值标度作出说明如下:

标度

含义

1

表示两个因素相比,具有相同重要性

3

表示两个因素相比,一个因素比另一个因素稍微重要

5

表示两个因素相比,一个因素比另一个因素明显重要

7

表示两个因素相比,一个因素比另一个因素强烈重要

9

表示两个因素相比,一个因素比另一个因素极端重要

2,4,6,8

上述两相邻标度判断的中值

倒数

因素i与j比较的判断aij,则因素j与i比较的判断aji=1/aij

符号说明如下:

符号

符号说明

λmax

最大特征值

n

成对比矩阵的阶数

w1

准则层对目标层的特征向量

wi

方案层对目标层的特征向量

CI

一致性指标

RI

随机一致性指标

CR

一致性比率

A

车型选购

B1

价格

B2

耗油量

B3

舒适程度

B4

外表

数据处理如下:

查询随机一致性指标RI:

阶数

1

2

3

4

5

6

7

RI

0

0

0.52

0.89

1.12

1.26

1.36

8

9

10

11

12

13

14

15

1.41

1.46

1.49

1.52

1.54

1.56

1.58

1.59

对于正互反矩阵A,阶数n=4,可得RI=0.89

计算一致性比率CR:

CR=CI/RI

按照规定,若CR=0,有完全的一致性;若CR接近0(一般以CR≤0.1为参照),有较好的一致性;若CR>0.1,则偏离一致性。

解得:CR=0.0743<0.1,通过一致性检验。同理,分别检验矩阵B1、B2、B3、B4的一致性。

汇总各指标权重如下:

B1

B2

B3

B4

w1

0.5755

0.2761

0.0965

0.0518

wi

0.5390

0.1109

0.6194

0.1932

0.2973

0.7311

0.2842

0.7235

0.1638

0.1580

0.0964

0.0833

λmax

3.0092

3.1190

3.0858

3.0649

Ⅲ.结果说明

i.  对于问题一,可知准则层对目标层的特征向量w1=[0.5755,0.2761,0.0965,0.0518],因此,四项指标在心中的比重从重到轻顺序为B1>B2>B3>B4,即价格>耗油量>舒适程度>外表。

ii.  对于问题二,方案层对目标层的特征向量

可知各方案在不同指标中的权重

价格由便宜到昂贵:

车型a(0.5390)>车型b(0.2973)>车型c(0.1638)

耗油量由少到多:

车型b(0.7311)>车型c(0.1580)>车型a(0.1109)

舒适程度由舒适到不适:

车型a(0.6194)>车型b(0.2842)>车型c(0.0964)

外表由漂亮到一般:

车型b(0.7235)>车型a(0.1932)>车型c(0.0833)

因此,在价格这一指标中,车型a最便宜;在耗油量这一指标中,车型b最省油;在舒适程度这一指标中,车型a最舒适;在外表这一指标中,车型b最漂亮。

iii.  对于问题三,各方案对目标的组合权重如下:

车型a对目标的组合权重为:

0.5755*0.5390+0.2761*0.1109+0.0965*0.6194+0.0518*0.1932=0.4106

车型b对目标的组合权重为:0.5755*0.2973+0.2761*0.7311+0.0965*0.2842+0.0518*0.7235=0.4379

车型c车型c对目标的组合权重为:

0.5755*0.1638+0.2761*0.1580+0.0965*0.0964+0.0518*0.0833=0.1515

因此,方案层对目标的组合向量为:

(0.4106,0.4379,0.1515)T

转换为百分比,即对车型a的喜欢程度为41.06%,对车型b的喜欢程度为43.79%,对车型c的喜欢程度为15.15%。综合各指标的权重后,对车型的喜欢程度排序为:车型b>车型a>车型c。

Ⅳ.matlab程序实现

此处提供3种matlab程序作为参考:

%第一种matlab程序
function result=AHP(mat)
%% 数据加载(判断矩阵载入)
A=mat;
n=size(A,1);
%% 特征值法求权重
% 第一步:求出矩阵A的最大特征值以及其对应的特征向量

[V,D]=eig(A);%V是特征向量, D是由特征值构成的对角矩阵(除了对角线元素外,其余位置元素全为0)
Max_eig=max(max(D)); 

D==Max_eig;
[r,c]=find(D == Max_eig,1);%找到D中第一个与最大特征值相等的元素的位置,记录其行和列

%对求出的特征向量进行归一化即可得到权重
V(:,c);
disp('特征值法求权重的结果为:');
disp(V(:,c)./sum(V(:,c)));
%找到的最大特征值的列数c找到对应的特征向量,然后再进行标准化。
result=V(:,c)./sum(V(:,c));

CI=(Max_eig - n) / (n-1);
RI=[0 0 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; 
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
    disp('因为CR < 0.10,所以该判断矩阵A的一致性可以接受!');
else
    disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end
end


%% 在命令窗口输入判断矩阵
clc;clear;
%% 4指标评价
A=[ 1   3   7   8;
    1/3 1   5   5;
    1/7 1/5 1   3;
    1/8 1/5 1/3 1]
AHP_A=AHP(A);

%% 价格
A1=[1   2   3;
    1/2 1   2;
    1/3 1/2 1]
AHP_A1=AHP(A1);

%% 耗油量
A2=[1 1/5 1/2;
    5 1   7  ;
    2 1/7 1]
AHP_A2=AHP(A2);

%% 舒适程度
A3=[1   3   5;
    1/3 1   4;
    1/5 1/4 1]
AHP_A3=AHP(A3);

%% 外表
A4=[1   1/5 3;
    5   1   7;
    1/3 1/7 1]
AHP_A4=AHP(A4);

%% 计算
s=[AHP_A1 AHP_A2 AHP_A3 AHP_A4] %汇总
s1=[s(:,1)*AHP_A(1) s(:,2)*AHP_A(2) s(:,3)*AHP_A(3) s(:,4)*AHP_A(4)] %乘比例

evaluate=[sum(s1(1,:)) sum(s1(2,:)) sum(s1(3,:))]
%第二种matlab程序
clc,clear 
fid=fopen('C:/Users/Administrator/Desktop/txt3.txt','r');  
n1=4;n2=3; a=[]; 
for i=1:n1    
    tmp=str2num(fgetl(fid));      
    a=[a;tmp]; %读准则层判断矩阵 
end
for i=1:n1     
    str1=char(['b',int2str(i),'=[];']);     
    str2=char(['b',int2str(i),'=[b',int2str(i),';tmp];']);     
    eval(str1);     
    for j=1:n2         
        tmp=str2num(fgetl(fid));         
        eval(str2); %读方案层的判断矩阵     
    end
end
ri=[0,0,0.58,0.90,1.12,1.24,1.32,1.41,1.45]; %一致性指标 
[x,y]=eig(a); 
lamda=max(diag(y)); 
num=find(diag(y)==lamda); 
w0=x(:,num)/sum(x(:,num)); 
cr0=(lamda-n1)/(n1-1)/ri(n1) 
for i=1:n1     
    [x,y]=eig(eval(char(['b',int2str(i)])));     
    lamda=max(diag(y));     
    num=find(diag(y)==lamda);     
    w1(:,i)=x(:,num)/sum(x(:,num));     
    cr1(i)=(lamda-n2)/(n2-1)/ri(n2); 
end
%第三种matlab程序
clear,clc 
A=[1 3 7 8;
1/3 1 5 5;    
1/7 1/5 1 3;    
1/8 1/5 1/3 1]; 
v=sum(A);  %列求和 
d=diag(v);  %生成以向量v为对角的对角矩阵 
norm_a=A*(d^-1);  %列归一化矩阵 
norm_a=sum(norm_a,2);  %行求和 
w_a=norm_a./sum(norm_a)  %求特征向量 
Aw_a=A*w_a  %求权重向量 
eigenvalue=diag(eig(A));  %求特征值 
lambda_a=eigenvalue(1)  %求最大特征值 
ci_a=(lambda_a-4)/3  %求一致性指标 
cr_a=ci_a/0.89  %求一致性比率  

B1=[1 2 3;
1/2 1 2;
1/3 1/2 1];
v=sum(B1);
d=diag(v);
norm_b1=B1*(d^-1);
norm_b1=sum(norm_b1,2);
w_b1=norm_b1./sum(norm_b1)
B1w_b1=B1*w_b1
eigenvalue=diag(eig(B1));
lambda_b1=eigenvalue(1)
ci_b1=(lambda_b1-3)/2
cr_b1=ci_b1/0.52

B2=[1 1/5 1/2;     
5 1 7;     
2 1/7 1]; 
v=sum(B2);
d=diag(v);
norm_b2=B2*(d^-1);
norm_b2=sum(norm_b2,2);
w_b2=norm_b2./sum(norm_b2)
B2w_b2=B2*w_b2
eigenvalue=diag(eig(B2));
lambda_b2=eigenvalue(1)
ci_b2=(lambda_b2-3)/2
cr_b2=ci_b2/0.52

B3=[1 3 5;     
1/3 1 4;     
1/5 1/4 1]; 
v=sum(B3);
d=diag(v);
norm_b3=B3*(d^-1);
norm_b3=sum(norm_b3,2);
w_b3=norm_b3./sum(norm_b3)
B3w_b3=B3*w_b3
eigenvalue=diag(eig(B3));
lambda_b3=eigenvalue(1)
ci_b3=(lambda_b3-3)/2
cr_b3=ci_b3/0.52

B4=[1 1/5 3;     
5 1 7;     
1/3 1/7 1]; 
v=sum(B4);
d=diag(v);
norm_b4=B4*(d^-1);
norm_b4=sum(norm_b4,2);
w_b4=norm_b4./sum(norm_b4)
B4w_b4=B4*w_b4
eigenvalue=diag(eig(B4));
lambda_b4=eigenvalue(1)
ci_b4=(lambda_b4-3)/2
cr_b4=ci_b4/0.52

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐