程晓华
2025-5-16
很多“高等数学”理念和方法论因为业界实践者的数学水平问题而在导致实践中无法使用。更重要的是,因为大家对这些数学的东西望而却步,导致的另外一个问题就是,明明是很简单、很实用的理念,即使单纯的理解,我们都懒得去做了。
这很可惜,毕竟,数学是全世界人类几千年的知识和智慧的结晶,我们如果能多掌握一点不是更有利于我们的工作吗?
还好,除了Excel,我们还有R和Python。
AHP的英文全称是Analytic Hierarchy Process,即所谓的层次分析法。
AHP的根本目的是把定性与定量的评价体系有机结合,最终输出单一的、定量的评价指标。
AHP的基本方法论是把问题分成三层,分别是目标层(Objective,O),准则层(Criteria,C)及方案层(Solutions,S)。
以上三者之间的关系是:O就是要解决的问题,为了解决O的问题从而设立了C,基于C对S进行评价。
基于C而建立一个评价指标两两对比矩阵(C矩阵),其中的元素Cij=Ci/Cj,通俗地理解就是Ci、Cj对O的重要性程度的比值。
基于C对S进行评价的结果也需要建立矩阵(S矩阵),有几个S就建立几个评价矩阵,每一个S矩阵的行和列都是Ci和Cj。
以上过程的建立与传统的“打分”评价并没有什么大的区别,但接下来的问题就是:
一, 我们需要对C矩阵、S矩阵分别做一致性检验以确保评价准则本身及依据评价准则对各个解决方案的评价保持一致性。这就需要计算每个矩阵的最大特征值及其对应的特征向量。
二, 对以上得到的特征向量做归一化出来,使其成为对应的权重,然后用S矩阵的权重矩阵与C矩阵的权重矩阵相乘,最终得到S的唯一的量化指标。
以上计算对于很多像我这样线性代数没有学好的人来讲是个不小的挑战,从而导致很多人直接放弃对AHP的理解和使用。但如果借助R语言,这个过程就会变得比较轻松。
关于这个AHP,我最初是听过中南大学郑洲顺老师的学堂在线课程《科学计算与数学建模》。坦白地讲,我当时并没有怎么听懂郑老师讲的这部分内容。
后来又买了郑老师的书(与课程同名)来研究这个AHP,也是看得稀里糊涂的。
再后来,我决定动手用R语言模拟郑老师书上的例子,终于是搞明白了这个AHP是什么意思了 – 至少我自己认为是懂了。我甚至还发现了郑老师书上的一个计算方面的小错误。
下面我用一个简单的例子来解释运用R语言进行AHP分析的全过程:
我们面试了3个供应链计划员候选人,我们的目标(O)是从中选出一个最优秀的计划员录取。
为了这个目标,我们根据ASCK模型(参考文章:《供应链管理能力模型ASCK》,程晓华,2024)设置了四个准则(C),并设置了相应的权重:
options(digits=3)
suppressMessages(library(openxlsx))
df<-read.xlsx('/users/johnc/desktop/rml/ahp_asck.xlsx',sheet=1)
print(df)
## 准则 A S C K
## 1 A 1 0.333 1 0.5
## 2 S 3 1.000 3 2.0
## 3 C 1 0.333 1 0.5
## 4 K 2 0.500 2 1.0
接下来是对以上C矩阵做权重一致性检查:
#准则处理 - 一致性检查
mt<-as.matrix(df[,-1])
eg<-eigen(mt)
lambda_max<-as.numeric(eg$values[1])
ci<-(lambda_max-4)/3
ri<-0.9
c(ci/ri)<0.1
## [1] TRUE
一致性检查没有问题,我们接着计算C矩阵的最大特征值及其对应的特征向量,并做归一化处理:
#准则处理 - 计算归一化权重(lambda_max对应的向量)
vct<-as.numeric(eg$vectors[,1])
weights_asck<-as.matrix(vct/sum(vct))
print(weights_asck)
## [,1]
## [1,] 0.141
## [2,] 0.455
## [3,] 0.141
## [4,] 0.263
此时,我们得到了人工设置的判断准则的量化权重。
对S矩阵,我们做类似的过程处理:
# 评价处理 - 整理数据
file_path<-c('/users/johnc/desktop/rml/ahp_asck.xlsx')
sheet_names<-c(paste0('sheet',2:5))
sheet_list<-list()
for (sheet in sheet_names){
sheet_list[[sheet]]<-read.xlsx(file_path,sheet=sheet)
}
print(sheet_list)
## $sheet2
## A P1 P2 P3
## 1 P1 1 0.5 0.5
## 2 P2 2 1.0 1.0
## 3 P3 2 1.0 1.0
##
## $sheet3
## S P1 P2 P3
## 1 P1 1 0.143 0.333
## 2 P2 7 1.000 2.000
## 3 P3 3 0.500 1.000
##
## $sheet4
## C P1 P2 P3
## 1 P1 1 1 0.2
## 2 P2 1 1 0.2
## 3 P3 5 5 1.0
##
## $sheet5
## K P1 P2 P3
## 1 P1 1.0 2 0.2
## 2 P2 0.5 1 0.1
## 3 P3 5.0 10 1.0
for (i in 1:4){
sheet_list[[i]]<-as.matrix(sheet_list[[i]][,-1])
}
#评价处理 - 一致性检查
eg<-lapply(sheet_list,eigen)
lambda_maxs<-0
for (i in 1:4){
lambda_maxs[i]<-as.numeric(eg[[i]]$values[1])
}
ci<-(lambda_maxs-3)/2
ri<-0.58
print(ci/ri<0.1)
## [1] TRUE TRUE TRUE TRUE
#评价处理 - 计算归一化权重(lambda_max对应的向量)
weights_a_s_c_k<-matrix(0,ncol=4,nrow=3)
for (i in 1:4){
vct<-as.numeric(eg[[i]]$vectors[,1])
weights_a_s_c_k[,i]<-as.matrix(vct/sum(vct))
}
print(weights_a_s_c_k)
## [,1] [,2] [,3] [,4]
## [1,] 0.2 0.0925 0.143 0.1538
## [2,] 0.4 0.6153 0.143 0.0769
## [3,] 0.4 0.2922 0.714 0.7692
最终我们得到如下结果:
# 计算最终评价结果
weights_a_s_c_k%*%weights_asck
## [,1]
## [1,] 0.131
## [2,] 0.377
## [3,] 0.492
计算结果显示,第三个计划员候选人(P3)是最优秀的。
作者程晓华(John Cheng),全面库存管理(TIM)咨询独立顾问、制造业库存控制技术与策略课程创始人、讲师,《制造业库存控制技巧》《首席物料官》《决战库存》《制造业全面库存管理》《全面库存管理数学分析》著作者;1995年开始接触MRP,深耕制造业供应链管理近30年,一直聚焦于库存与交付问题的实践和咨询。
新书预告:《全面库存管理数学分析》第2版预计2025年底上市
全面库存管理(TIM)文章订阅号:ITOOTD
Mail: johnchengbj@126.com