Python实现层次分析法

Python实现层次分析法

一、层次分析法有三种求法

  • 算术平均权重
  • 几何平均权重
  • 特征值求权重

通常情况下,我们会将这几种方法结合使用,来增加说服力
**【划重点】**下面我直接分享可执行的代码,读者可直接使用,有基础的也可以拿去研究,整个代码我已重构,虽然手法可能略显粗糙,但是逻辑还是清楚的。

import numpy as np
from numpy import linalg

def s_s_a(n, C):
    """算术平均值求权重"""
    w_1 = sum(C) / n
    print("算术平均权重为:\n", w_1)
    print("")
def j_h_a(n, A):
    """几何平均值求权重"""
    B_2 = pow(np.prod(A, 1), 1/n) # 0是按行,1是按列
    w_2 = B_2 / sum(B_2)
    print("几何平均值权重:\n", w_2)
    print("")    
def t_v(V,eig_max,D):
    """特征值法求权重"""
    c = np.where(V == eig_max)
    B_3 = D[:, c.index(0)]
    w_3 = B_3 / sum(B_3)
    print("特征值法求权重:\n", w_3)
def main(A,B_z,C_z,D_z,R_I,n):
    """主程序"""
    if D_z[1,:].all() == (np.array(B_z)*np.array(C_z)).all():
        print("该矩阵是正互反矩阵!\n")
        V,D = np.linalg.eig(A)
        eig_max = max(V)
        CI = (eig_max-n) / (n-1)
        RI = R_I[n-1]
        CR = CI / RI
        if CR < 0.1:
            print("一致性检验通过!\n")
            B_1 = np.zeros([n,n])
            for i in range(0,n):
                B_1[0:n,i] = A[0:n,i] / sum(A[0:n,i])
                C = B_1.T     
            s_s_a(n, C)
            j_h_a(n, A)
            t_v(V,eig_max,D)
        else:
            print("一致性检验失败,请修改!")
    else:
        print("您输入的矩阵非正互反矩阵")
    
               
R_I = np.array([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])
A = np.array([[1, 1, 4, 1/3, 3], 
              [1, 1, 4, 1/3 ,3], 
              [1/4, 1/4, 1, 1/3, 1/2,], 
              [3, 3, 3, 1, 3], 
              [1/3, 1/3, 2, 1/3, 1]])
n = len(A) 
B_z = []
C_z = []
for i in range(0,n):
    for j in range(0,n):
        B_z.append(A[i,j])
        C_z.append(A[j,i])
D_z = np.ones([len(B_z), len(B_z)])
main(A,B_z,C_z,D_z,R_I,n)

程序运行的截图
在这里插入图片描述

结语

至此,层次分析法就已经分享完了,如果你觉得有用就辛苦点个赞,毕竟劳动是光荣的,应该值得被尊重;此外,如果你有不懂的地方,欢迎留言,因为这个部分我没有做理论以及代码的解释,实在是有点时间不够,敬请谅解。

  • 25
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pynotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值