MATLAB实现AHP层次分析法——以情人节选取礼物为例

问题背景

情人节来临之际,广大直男(女)同胞在给异性朋友选购礼物时会遇到难题——什么才是礼物好坏最重要的标准?基于层次分析法AHP进行计算,得出最高权重的指标,给出各位朋友选购礼物的一种思路,指导大家选到更为贴切的礼物。

使用模型:

AHP层次分析法

反思与总结

  1. AHP算法的主观性还是很强,虽然较直男的主观臆断来说相对好些,但在构造判断矩阵时的主观臆断很难规避。
  2. 另外,对于性别、职业等问题,AHP的局限性更加明显。
  3. 解决方法,就是在大量的调查数据中取平均,构造尽可能客观的判断矩阵

目录

一.指标确定(建立准则层)

二.权值确定:

三.举例验证(建立方案层) 

四.AHP的理论知识

五.MATLAB代码实现


一.指标确定(建立准则层)

(1)问题分析

学生党在给自己的couple挑选礼物时,需要考虑哪些主要方面?根据知乎、b站、抖音等自媒体平台和知网上面的相关文献,得出以下几个比较主要的考虑指标:

  1. 实用性
  2. 纪念价值(心意):
  3. 价位
  4. 外观
  5. 主权(“有个人身份的象征标志:如戒指上面刻字”):
  6. 他(她)的喜好

        …………等

为了便于统计分析,选取其中“心意、价位、实用性、喜好”四项作为本次分析的指标。

接下来我们将计算各种指标的权值,具体有如下三种方式:

  1. 笔者角度:作为0.5倍的直男,对指标进行打分
  2. 统计分析:分别统计100+个男生、女生对权重的打分,取平均值
  3. 进行层次分析法思想:实现分而治之,对各种指标两两比较,理性计算权值

如上三种统计方式中:

  1. 对于男性,按照0.1、0.1,0.8的权重再取各自的加权,计算最终指标的权重。
  2. 对于女性,由于笔者是男性,出于减少主观性的角度考虑,第一项和第三项均无法计算,直接按照第二项——问卷取平均分即可。

(2)对于男性:

1.笔者自己赋予的权重

根据笔者的直男思想,赋予如下表中的权值:

2.统计分析13位男生:

由于调查方式有限,本次调查仅获取到13位男生的想法,为了保证结果的严谨性,首先对异常值进行剔除,最后有11名男生的数据认为真实有效,并使用算术平均计算各项的均分,结果经可视化处理后如下:

3.层次分析法思想:

  • 原理:

如果一次性考虑全部四个指标,往往会考虑不周;如果我们采取分而治之的思想,两两比较,最终根据结果推算权重,相比之下会周到很多。

  • 局限性:

出于笔者自身角度考虑,故赋予权值时主观性仍然很强。

(优化方法:调查问卷取平均,不过该方法比较专业化,面向大众调查时统计数据由一定的难度)。

4.具体实现步骤:

  • 首先,给出两两比较的重要程度表:

  • 进行判断:根据组合数原理C(4,2),一共需要比较6次。

       如下图:黄色越深代表越重要,蓝色越深代表越不重要

上图得到的结果,即为层次分析法中的判断矩阵。

  • 判断矩阵的一致性检验

在层次分析法的判断矩阵中,可能会出现这样的问题:不一致现象。

我们做出如下假设:A代表心意,B代表价位,C代表实用性。

在矩阵中的(2,1)号元素,我们发现,A之于B的重要程度为5——即心意远大于价位这件事是正确的。假设此时(3,1)号元素的值也为1,则有A=C成立——即心意和实用性一样重要。但当我们观察(2,3)号元素,会发现:实用性之于价位的重要程度为2,与心意之于价位的重要程度是不相同的,我们把这样的矛盾称为不一致现象。

在层次分析法中有如下的定义,若判断矩阵为完全一致矩阵,则必有(m,n)的元素与(n,k)的元素相乘的结果与(m,k)中的元素值相等。

且很容易得出结论:一致矩阵的行和列之间是成倍数关系的。

在层次分析法中,的要求各指标形成的判断矩阵必须一致,才可以进一步计算各指标的权值。然而,结合实际问题与主观因素的影响,构造绝对的一致性矩阵往往是不现实的。

因此我们采用一致性检验。所谓一致性检验,就是检查真实构造出的判断矩阵和一致性矩阵是否有较大差距。原理大致如下,这里不予证明。

使用MATLAB计算本文中判断矩阵的最大特征值,结果为4.1580,代码段在附录之中。

接下来开始一致性检验,步骤不再赘述,大致如下:

经计算,CR的值为0.5918,因为CR>0.1,所以上述判断矩阵未经过一致性检验,需要对判断矩阵进行修正!上述情况也一定程度体现出了AHP方法的局限性。

后经过6次修改,得到崭新的判断矩阵,如下图。

上述判断矩阵的一致性比例是0.0598<0.1,故我们可以认为其满足一致性检验,且上述矩阵为真正使用的矩阵。

  • 计算各项指标的权值

在满足一致性检验之后,即可对判断矩阵进行加权的计算。在计算加权时,我们有三种计算方法,分别是算术平均法、几何平均法以及特征值法,为了保证结果的严谨性,此处的三种计算方式将全部使用。此外,无论哪种计算权重的方法,在计算前先要对判断矩阵进行归一化处理。

经MATLAB计算,归一化处理的矩阵为上图。

接下来分别使用三种方式计算4项指标各自的权重:

算术平均法:

根据MATLAB软件,计算得权重为以下值:

指标

权值

心意

0.4091

价位

0.0825

实用性

0.1585

喜好

0.3499

几何平均法:

根据MATLAB软件,计算得权重为以下值:

指标

权值

心意

0.4094

价位

0.0827

实用性

0.1581

喜好

0.3498

特征值法:

根据MATLAB软件,计算得权重为以下值:

指标

权值

心意

0.4098

价位

0.0824

实用性

0.1579

喜好

0.3499

综上所述,三种方式求得的指标权值如下表所示:

指标

算术平均法

几何平均法

特征值法

心意

0.4091

0.4094

0.4098

价位

0.0825

0.0827

0.0824

实用性

0.1585

0.1581

0.1579

喜好

0.3499

0.3498

0.3499

从上表可以看出,三种方法求得的权值近乎相同,这与一致性指标较小——即矩阵一致性较强有关。这里我们采用进一步的算术平均法,为三种方式赋予相同的权重,计算最后的指标权重,如下图:

指标

AHP法权值

心意

0.4094

价位

0.0825

实用性

0.1582

喜好

0.3499

总和

1.0000

上表即为层次分析法APH所求得的指标权值。

(3)对于女生

由于笔者是男生,所以无法通过方法一及方法三计算权值,只能通过搜集问卷来统计分析。

问卷中调查了120位给出的结果,在去除异常值后,得到如下的权值分布(此处的饼图按照整数制作,具体数值在之后会给出):

二.权值确定:

对于男生,三种方式的计算结果分别如下:

指标

直男主观臆断

调查统计

层次分析法AHP

心意

0.5

0.38

0.4094

价位

0.1

0.26

0.0825

实用性

0.15

0.13

0.1582

喜好

0.25

0.23

0.3499

权值

0.1

0.1

0.8

则最终得到的男生选礼物时的权重为:

指标

最终权值

心意

0.4035

价位

0.1028

实用性

0.1545

喜好

0.3402

对于女生,直接按照统计结果,即可得出各项指标的权重。

指标

最终权值

心意

0.3208

价位

0.2025

实用性

0.2009

喜好

0.2758

三.举例验证(建立方案层) 

在问卷中,笔者还调查了两性在送另一半礼物时典型的几种选择,归纳整理后,大致如下(各四类):

男生:

  1. 零食
  2. 首饰类
  3. 小玩偶
  4. 护肤(化妆)品

女生:

  1. 自己亲手做的一类物品(画画,蛋糕等)
  2. 衣服
  3. 游戏
  4. 体育用品

1.男生选择礼物的最佳方案

对于男生,我们采用上述四种礼物作为方案层,计算各项指标的得分。

首先,我们使用同样的方式,建立各种物品在4种指标下的权重,并建立判断矩阵,并用MATLAB检验是否满足一致性,代码部分同样在附录之中。

为了节约篇幅,此处直接给出经计算过后的结果:

 


用CR1,CR2,CR3,CR4个变量分别代表四个判断矩阵的一致性指标,计算结果如下:

一致性指标

结果大小

CR1

0.0790

CR2

0.0536

CR3

0.0667

CR4

0.0380

由于4个一致性指标均小于0.1,则可认为上述4个判断矩阵均满足一致性。

接下来计算判断矩阵中的各项权值,计算结果如下表

心意

权值

零食

0.0759

首饰类

0.4428

小玩偶

0.2310

化妆品

0.2503

价位

权值

零食

0.5235

首饰类

0.0959

小玩偶

0.2951

化妆品

0.0856

实用性

权值

零食

0.5478

首饰类

0.1276

小玩偶

0.0751

化妆品

0.2496

喜好

权值

零食

0.1402

首饰类

0.5192

小玩偶

0.0810

化妆品

0.2596

计算完权值后,接下来将计算各个选择(方案)的得分,对应得分与权值相乘后再*100后得到最终得分:

如下表:

指标

权值

零食

首饰类

小玩偶

化妆品

心意

0.4035

0.0759

0.5235

0.5478

0.1402

价位

0.1028

0.4428

0.0959

0.1276

0.5192

实用性

0.1545

0.2310

0.2951

0.0751

0.0810

喜好

0.3402

0.2503

0.0856

0.2496

0.2596

得分

-------

19.698705

17.179195

34.253791

21.393074

根据上表可以得知,从男生送礼物的角度考虑,小玩偶是最合适的选择。

2.女生选择礼物的最佳方案:

由于笔者为男性,此处出于客观性考虑,无法建立判断矩阵,故女生的最佳选择这里不予以计算。

四.AHP的理论知识

1.建立层次结构

在本次模型建立过程中,目标层——即最终解决的问题是:出于自身情况考虑,哪种礼物更适合送给异性?准则层的4项指标,则是出于送礼物时需要考虑的方向。目标层的4个元素,是在统计分析后抽取出的典例,用于计算得分后给出最佳方案。故对于男生,建立的层次结构如下图所示:

 

对于女生,出于客观性考虑,本次不建立层次结构,只给出大众化的一个考虑指标权重。

2.构造判断矩阵

对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)。

本文之前已经给出了准则层与方案层各个元素的判断矩阵,这里不再赘述。

3.计算指标权值

构造出一致性判断矩阵后,对结果进行计算,计算方式为方案层判断矩阵得分乘以准则层判断矩阵权值,此处同样省略计算步骤。

4.计算最终得分(得出目标层)

根据计算结果,选择得分最高的一项作为目标层的结果。本文中男生选礼物的最佳方案为小玩偶。

五.MATLAB代码实现

直接整合到一起了,大家根据注释自行阅读~

%%1.首先计算最大特征值  X= [1,5,3,0.333;0.2,1,0.5,0.2;0.333,2,1,0.333;3,5,3,1];  
[V,D] = eig(X);   
% 求出A的特征值矩阵D和特征向量V  
max_eig=max(max(D));  
%获得最大特征值max_eig(拉姆达):4.1580  
%%2.计算相关变量,并完成一致性检验  
CI = (max_eig - 4) / (4-1);  
%%计算一致性指标CI(此处n的值为4)  
RI=0.089;  
%查表得到随机平均一致性指标,本次总共有4个决策元素(即挑选礼物的指标)  
%查表得知n=4时,RI=0.089  
CR=CI/RI;  
%计算一致性指标  
%CR=0.5918,第一次写出的判断矩阵未通过一致性检验,故需要对判断矩阵进行修正。  
Y=[1    5   3   1;  
0.2 1   0.5 0.25;  
0.3333  2   1   0.5;  
1   4   2   1;  
];  
[VN,DN] = eig(Y);   
max_eigN=max(max(DN));  
CIN = (max_eigN - 4) / (4-1);  
RIN=0.089;  
CRN=CIN/RIN;  
%CR1的值为0.0580,符合一致性检验  
%%3.对矩阵进行归一化处理(每一个元素除以其所在列的和)  
Sum_Y = sum(Y);  
[~,n] = size(Y);    
SUM_Y = repmat(Sum_Y,4,1);     
%%定义矩阵Stand_Y,即为最后的归一化处理矩阵。  
Stand_Y = Y ./ SUM_Y;  
%%4.算术平均法计算权重  
disp('算术平均法求权重的结果为:');  
disp(sum(Stand_Y,2)./4);  
%%5.几何平均法计算权重  
Prduct_Y = prod(Y,2);  
Prduct_4_Y = Prduct_Y .^ (1/4);  
disp('几何平均法求权重的结果为:');  
disp(Prduct_4_Y ./ sum(Prduct_4_Y));  
%%6.特征值法求权重:  
[a,b] = eig(Y);  
Max_eigN2 = max(max(b));  
[r,c]=find(b == Max_eigN2 , 1);  
disp('特征值法求权重的结果为:');  
disp( a(:,c) ./ sum(a(:,c)) );  
%%7.对四个方案层的元素分别构造判断矩阵,并计算权值  
%1号矩阵  
X1= [1  0.2 0.3333  0.25;  5  1   2   2;  3  0.5 1   1;  4  0.5 1   1;  
];  
[V1,D1] = eig(X1);   
max_eig1=max(max(D1));  
CI1 = (max_eig1 - 4) / (4-1);  
RI1=0.089;  
CR1=CI1/RI1;  
Sum_X1 = sum(X1);  
[~,n] = size(X1);    
SUM_X1 = repmat(Sum_X1,4,1);     
Stand_X1 = X1 ./ SUM_X1;  
disp('1号矩阵算术平均法求权重的结果为:');  
disp(sum(Stand_X1,2)./4);  
%2号矩阵  X2= [1 5   2   6;  
0.2 1   0.333   1;  
0.5 3   1   4;  
0.1667  1   0.25    1;  
];  
[V2,D2] = eig(X2);   
max_eig2=max(max(D2));  
CI2 = (max_eig2 - 4) / (4-1);  
RI2=0.089;  
CR2=CI2/RI2;  
Sum_X2 = sum(X2);  
[~,n] = size(X2);    
SUM_X2 = repmat(Sum_X2,4,1);     
Stand_X2 = X2 ./ SUM_X2;  
disp('2号矩阵算术平均法求权重的结果为:');  
disp(sum(Stand_X2,2)./4);  
%3号矩阵  X3= [1 5   7   2;  0.2    1   2   0.5;  
0.1429  0.5 1   0.3333;  
0.5 2   3   1;  
];  
[V3,D3] = eig(X3);   
max_eig3=max(max(D3));  
CI3 = (max_eig3 - 4) / (4-1);  
RI3=0.089;  
CR3=CI3/RI3;  
Sum_X3 = sum(X3);  
[~,n] = size(X3);    
SUM_X3 = repmat(Sum_X3,4,1);     
Stand_X3 = X3 ./ SUM_X3;  
disp('3号矩阵用算术平均法求权重的结果为::');  
disp(sum(Stand_X3,2)./4);  
%4号矩阵  
X4=[ 1  0.25    2   0.5;  
4   1   6   2;  
0.5 0.1667  1   0.333;  
2   0.5 3   1;  
];  
[V4,D4] = eig(X4);   
max_eig4=max(max(D4));  
CI4 = (max_eig4 - 4) / (4-1);  
RI4=0.089;  
CR4=CI4/RI4;  
Sum_X4 = sum(X4);  
[~,n] = size(X4);    
SUM_X4 = repmat(Sum_X4,4,1);     
Stand_X4 = X4 ./ SUM_X4;  
disp('4号矩阵用算术平均法求权重的结果为:');  
disp(sum(Stand_X4,2)./4);  

结束语:本贴旨在通过该例说明AHP的思想,在选择礼物时要结合具体情况谨慎考虑,避免雷区~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PY32F003F18P单片机概述

PY32F003F18P单片机是普冉的一款ARM微控制器&#xff0c;内核是Cortex-M0。这个单片机的特色&#xff0c;就是价格便宜&#xff0c;FLASH和SRAM远远超过8位单片机&#xff0c;市场竞争力很强大。 一、硬件资源&#xff1a; 1)、FLASH为64K字节&#xff1b; 2)、SRAM为8K字节&…

无涯教程-JavaScript - CUBEKPIMEMBER函数

描述 该函数返回关键绩效指标(KPI)属性,并在单元格中显示KPI名称。 语法 CUBEKPIMEMBER (connection, kpi_name, kpi_property, [caption])争论 Argument描述Required/OptionalconnectionName of the connection to the cube - A text stringRequiredkpi_nameName of the K…

LuatOS 开发指南

NDK 开发 官方教程 官方例程 API 下载软件 下载官方NDK例程压缩包到本地&#xff0c;并解压。可以看到目录如下&#xff1a; doc: 文档教程 env: 编译环境 example: NDK示例 platform: 需要编译的平台&#xff08;air72x/air8xx&#xff09; tools: 其他辅助软件 VSCode 使…

设计模式-7--代理模式(Proxy Pattern)

一、什么是代理模式&#xff08;Proxy Pattern&#xff09; 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许一个对象&#xff08;代理&#xff09;充当另一个对象&#xff08;真实对象&#xff09;的接口&#xff0c;以控制对该对象的…

【数据结构】 二叉树面试题讲解->叁

文章目录 &#x1f30f;引言&#x1f332;[根据二叉树创建字符串](https://leetcode.cn/problems/construct-string-from-binary-tree/submissions/)&#x1f431;‍&#x1f464;题目描述&#xff1a;&#x1f431;‍&#x1f409;示例&#xff1a;&#x1f4cc;示例一&#x…

Autofac中多个类继承同一个接口,如何注入?与抽象工厂模式相结合

多个类继承同一个接口,如何注入&#xff1f;与抽象工厂模式相结合 需求: 原来是抽象工厂模式,多个类继承同一个接口。 现在需要使用Autofac进行选择性注入。 Autofac默认常识: Autofac中多个类继承同一个接口,默认是最后一个接口注入的类。 解决方案&#xff1a;(约定大于配…

Scala的函数式编程与高阶函数,匿名函数,偏函数,函数的闭包、柯里化,抽象控制,懒加载等

Scala的函数式编程 函数式编程 解决问题时&#xff0c;将问题分解成一个一个的步骤&#xff0c;将每个步骤进行封装&#xff08;函数&#xff09;&#xff0c;通过调用这些封装好的步骤&#xff0c;解决问题。 例如&#xff1a;请求->用户名、密码->连接 JDBC->读取…

分布式session的4种解决方案

分布式session的4种解决方案 1、cookie和session cookie和session都是用来跟踪用户身份信息的会话方式。 cookie存储的数据保存在本地客户端&#xff0c;用户获取容易&#xff0c;但安全性不高&#xff0c;存储数据小。 session存储的数据保存在服务器&#xff0c;用户不易获取…

linux中busybox与文件系统的关系

busybox与文件系统 在 Linux 中&#xff0c;BusyBox 是一个精简的、多功能的工具集合&#xff0c;它包含了一系列常用的命令和实用程序&#xff0c;如 ls、cp、mkdir 等。BusyBox 的目标是提供一个功能完整而又占用空间较小的工具集合&#xff0c;适用于嵌入式系统或资源受限的…

安防监控视频平台EasyCVR视频汇聚平台定制项目增加AI智能算法详细介绍

安防视频集中存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

hadoop学习:mapreduce入门案例四:partitioner 和 combiner

先简单介绍一下partitioner 和 combiner Partitioner类 用于在Map端对key进行分区 默认使用的是HashPartitioner 获取key的哈希值使用key的哈希值对Reduce任务数求模决定每条记录应该送到哪个Reducer处理自定义Partitioner 继承抽象类Partitioner&#xff0c;重写getPartiti…

udig下载、安装及汉化,生成geoserver图层样式sld文件

uDig是一款开源免费的桌面地理信息系统框架软件。uDig汉化版主要采用RCP技术构建&#xff0c;内置的多专业的水文工具&#xff0c;拥有复杂专业的分析能力&#xff0c;既可以作为独立程序运行&#xff0c;还可以作为插件使用。 uDig是一个 open source (EPL and BSD) 桌面应用程…

【高阶产品策略】设计有效的AB测试

文章目录 1、A/B测试概述2、A/B测试实施过程3、A/B测试中需要注意的地方4、从一个案例中看A/B测试 1、A/B测试概述 2、A/B测试实施过程 3、A/B测试中需要注意的地方 4、从一个案例中看A/B测试

JAVA基础-JDBC

本博客记录JAVA基础JDBC部分的学习内容 JDBC基本概念 JDBC : JAVA链接数据库&#xff0c;是JAVA链接数据库的技术的统称&#xff0c;包含如下两部分&#xff1a; 1. JAVA提供的JDBC规范&#xff08;即各种数据库接口&#xff09;存储在java.sql 和 javax.sql中的api 2. 各个数…

【小吉送书—第一期】Kali Linux高级渗透测试

文章目录 &#x1f354;前言&#x1f6f8;读者对象&#x1f388;本书资源&#x1f384;彩蛋 &#x1f354;前言 对于企业网络安全建设工作的质量保障&#xff0c;业界普遍遵循PDCA&#xff08;计划&#xff08;Plan&#xff09;、实施&#xff08;Do&#xff09;、检查&#x…

【计算机网络】HTTP

文章目录 1.HTTP概念2. URLurlencode 和 urldecode转义规则 3. HTTP的宏观理解HTTP的请求HTTP的响应 4. 见一见HTTP请求和响应请求报头 1. 模拟一个简单的响应response响应报头 2. 从路径中获取内容ReadFile函数的实现 3.不同资源进行区分反序列化的实现ReadOneLine函数的实现P…

C++异常

文章目录 C异常异常语法代码示例 栈解旋示例代码 noexcept代码示例 异常的声明周期示例代码 异常的多态使用代码示例 C标准异常库代码示例 重写自己的异常示例代码 C异常 异常是处理程序中的错误。所谓的错误时指程序运行的过程中发生的一些异常事件(如&#xff1a;除零错误&a…

百数应用中心——生产制造管理解决方案解决行业难题

传统生产制造业面临着许多挑战&#xff0c;其中一些主要问题包括效率低下、交期压力大、需求预测不准确、生产模式复杂、异常响应慢、库存高和计划脱节等。这些问题不仅影响了生产效率和质量&#xff0c;也导致了不必要的成本和客户满意度下降。 生产制造管理应用对于企业的生产…

介绍几种使用工具

FileWatch&#xff0c;观测文件变化&#xff0c;源码地址&#xff1a;https://github.com/ThomasMonkman/filewatch nlohmann::json&#xff0c;json封装解析&#xff0c;源码地址&#xff1a;https://github.com/nlohmann/json optionparser&#xff0c;解析选项&#xff0c;源…

前端 js实现 选中数据 动态 添加在表格中

如下图展示&#xff0c;表格上方有属性内容&#xff0c;下拉选中后&#xff0c;根据选中的内容&#xff0c;添加在下方的表格中。 实现方式&#xff0c;&#xff08;要和后端约定&#xff0c;因为这些动态添加的字段都是后端返回的&#xff0c;后端自己会做处理&#xff0c…