python实现AHP算法的方法实例(层次分析法)
一、层次分析法原理
层次分析法(AnalyticHierarchyProcess,AHP)由美国运筹学家托马斯·塞蒂(T.L.Saaty)于20世纪70年代中期提出,用于确定评价模型中各评价因子/准则的权重,进一步选择最优方案。该方法仍具有较强的主观性,判断/比较矩阵的构造在一定程度上是拍脑门决定的,一致性检验只是检验拍脑门有没有自相矛盾得太离谱。
相关的理论参考可见:wiki百科
二、代码实现
需要借助Python的numpy矩阵运算包,代码最后用了一个b1矩阵进行了调试,相关代码如下,具体的实现流程已经用详细的注释标明,各位小伙伴有疑问的欢迎留言和我一起讨论。
importnumpyasnp
classAHP:
"""
相关信息的传入和准备
"""
def__init__(self,array):
##记录矩阵相关信息
self.array=array
##记录矩阵大小
self.n=array.shape[0]
#初始化RI值,用于一致性检验
self.RI_list=[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]
#矩阵的特征值和特征向量
self.eig_val,self.eig_vector=np.linalg.eig(self.array)
#矩阵的最大特征值
self.max_eig_val=np.max(self.eig_val)
#矩阵最大特征值对应的特征向量
self.max_eig_vector=self.eig_vector[:,np.argmax(self.eig_val)].real
#矩阵的一致性指标CI
self.CI_val=(self.max_eig_val-self.n)/(self.n-1)
#矩阵的一致性比例CR
self.CR_val=self.CI_val/(self.RI_list[self.n-1])
"""
一致性判断
"""
deftest_consist(self):
#打印矩阵的一致性指标CI和一致性比例CR
print("判断矩阵的CI值为:"+str(self.CI_val))
print("判断矩阵的CR值为:"+str(self.CR_val))
#进行一致性检验判断
ifself.n==2:#当只有两个子因素的情况
print("仅包含两个子因素,不存在一致性问题")
else:
ifself.CR_val<0.1:#CR值小于0.1,可以通过一致性检验
print("判断矩阵的CR值为"+str(self.CR_val)+",通过一致性检验")
returnTrue
else:#CR值大于0.1,一致性检验不通过
print("判断矩阵的CR值为"+str(self.CR_val)+"未通过一致性检验")
returnFalse
"""
算术平均法求权重
"""
defcal_weight_by_arithmetic_method(self):
#求矩阵的每列的和
col_sum=np.sum(self.array,axis=0)
#将判断矩阵按照列归一化
array_normed=self.array/col_sum
#计算权重向量
array_weight=np.sum(array_normed,axis=1)/self.n
#打印权重向量
print("算术平均法计算得到的权重向量为:\n",array_weight)
#返回权重向量的值
returnarray_weight
"""
几何平均法求权重
"""
defcal_weight__by_geometric_method(self):
#求矩阵的每列的积
col_product=np.product(self.array,axis=0)
#将得到的积向量的每个分量进行开n次方
array_power=np.power(col_product,1/self.n)
#将列向量归一化
array_weight=array_power/np.sum(array_power)
#打印权重向量
print("几何平均法计算得到的权重向量为:\n",array_weight)
#返回权重向量的值
returnarray_weight
"""
特征值法求权重
"""
defcal_weight__by_eigenvalue_method(self):
#将矩阵最大特征值对应的特征向量进行归一化处理就得到了权重
array_weight=self.max_eig_vector/np.sum(self.max_eig_vector)
#打印权重向量
print("特征值法计算得到的权重向量为:\n",array_weight)
#返回权重向量的值
returnarray_weight
if__name__=="__main__":
#给出判断矩阵
b=np.array([[1,1/3,1/8],[3,1,1/3],[8,3,1]])
#算术平均法求权重
weight1=AHP(b).cal_weight_by_arithmetic_method()
#几何平均法求权重
weight2=AHP(b).cal_weight__by_geometric_method()
#特征值法求权重
weight3=AHP(b).cal_weight__by_eigenvalue_method()
总结
到此这篇关于python实现AHP算法(层次分析法)的文章就介绍到这了,更多相关pythonAHP算法(层次分析法)内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。