【数学建模】利用 python实现层次分析法

前言

层次分析法是数学建模过程中最基础的模型之一,主要应用于评价问题。层次分析法(AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,其适用于那些难以完全定量分析的问题。

基本步骤

评价类问题

在处理评价类问题时,应当首先注意一下三个问题:
(1)评价的目标是什么?
(2)备选方案有哪些?
(3)评价指标是什么?
在解决这类评价类问题时,可以使用AHP方法来解决。首先要将问题条理化、层次化,并构造出一个有层次的结构模型。这种模型一般依据以上三个问题形成三个层级:目标层(O),准则层(C)和方案层(P)。通过查阅文献、询问专家等方式,可以得到各层之间的判断矩阵,并通过判断矩阵来得到个决策之间的评分,以此来决定进行哪些决策。

AHP基本步骤

(1)确定三个层级,确定评价指标
(2)确定判断矩阵
(3)对判断矩阵进行一致性检验
(4)计算各决策的权重

实例

现在小明要外出旅游,经过初步调查之后决定选择苏杭、北戴河与桂林三地作为备选方案,并挑选了景色、消费、居住环境、饮食、交通五个指标作为判断的主要依据。现对各景点进行评价。
(1)首先应当确定该评价体系的层级关系,如下图所示:
【数学建模】利用 python实现层次分析法_第1张图片
(2)构造了层次关系之后,对于同一层次的铬元素关于上一层次的某一准则的重要性进行两两比较,构造判断矩阵。
如目标层与准则层之间的判断矩阵(O-C矩阵):

【数学建模】利用 python实现层次分析法_第2张图片
(3)对各判断矩阵进行一致性检验。
一致性检验的步骤:
1.计算一致性指标 C I CI CI
2.查找对应的平均随机一致性指标 R I RI RI
3.计算一致性比例
定义python函数如下:

#一致性检验函数
def check(A):
    eigen = np.linalg.eig(A)[0]
    n = A.shape[0]
    CI = (max(eigen) - n) / (n - 1)
    RI = [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-1]
    CI = float(CI)
    CR = float(CR)
    #若CI过小,为防止计算误差出现,取0即可
    if abs(CI) < 0.0001:
        CI = 0
    if abs(CR) < 0.0001:
        CR = 0
    print('The CI is:{}'.format(CI))
    print('The CR is:{}'.format(CR))
    if CR < 0.1:
        return 1
    else:
        return 0 #对CR进行判断,用于下面计算权重函数。

(4)计算权重:
定义python代码如下:

#计算权重函数
def count_p(A):
    q = check(A)
    n = A.shape[0]
    while q:
        weight1 = (np.sum(A/np.sum(A,axis = 0),axis = 1)) / n                         #算术平均权重
        weight2 = pow(np.prod(A,axis = 1),1/n) / np.sum(pow(np.prod(A,axis = 0),1/n)) #几何平均权重
        eigen,F_vector = np.linalg.eig(A)
        for i in range(n):
            if eigen[i] == np.max(eigen):
                index_e = i
        best = F_vector[:,index_e]
        weight3 = best / np.sum(best)                                                 #特征值权重
        print(weight1,'\n',weight2,'\n',weight3,'\n')
        return weight1,weight2,weight3
    else:
        print('Consistency check not pass')
        return 0,0,0

最后可以计算得三个旅游地的评分。

完整代码如下:

#利用层次分析法(AHP)进行评价

import numpy as np

#一致性检验函数
def check(A):
    eigen = np.linalg.eig(A)[0]
    n = A.shape[0]
    CI = (max(eigen) - n) / (n - 1)
    RI = [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-1]
    CI = float(CI)
    CR = float(CR)
    #若CI过小,为防止计算误差出现,取0即可
    if abs(CI) < 0.0001:
        CI = 0
    if abs(CR) < 0.0001:
        CR = 0
    print('The CI is:{}'.format(CI))
    print('The CR is:{}'.format(CR))
    if CR < 0.1:
        return 1
    else:
        return 0 #对CR进行判断,用于下面计算权重函数。

#计算权重函数
def count_p(A):
    q = check(A)
    n = A.shape[0]
    while q:
        weight1 = (np.sum(A/np.sum(A,axis = 0),axis = 1)) / n                         #算术平均权重
        weight2 = pow(np.prod(A,axis = 1),1/n) / np.sum(pow(np.prod(A,axis = 0),1/n)) #几何平均权重
        eigen,F_vector = np.linalg.eig(A)
        for i in range(n):
            if eigen[i] == np.max(eigen):
                index_e = i
        best = F_vector[:,index_e]
        weight3 = best / np.sum(best)                                                 #特征值权重
        print(weight1,'\n',weight2,'\n',weight3,'\n')
        return weight1,weight2,weight3
    else:
        print('Consistency check not pass')
        return 0,0,0

#数据获取与处理
tx = open('O-C-P.txt').readlines()
for i in range(len(tx)):
    tx[i] = np.array(list(eval(tx[i])))
    n0 = int((np.size(tx[i]))**0.5)
    tx[i] = tx[i].reshape(n0,n0)

A0 = tx[0]
print(A0)
o_c1,o_c2,o_c3 = count_p(A0)
C_P = []
for Ai in tx[1:]:
    print(Ai)
    c_p1,c_p2,c_p3 = count_p(Ai)
    C_P.append(list(c_p3))

c_p = np.array(C_P)
score = []
for i in range(len(c_p[0,:])):
    score.append(sum(o_c3*c_p[:,i]))  #计算权重

print(score)

O-C-P文件内容:
1,1/2,4,3,3,2,1,7,5,5,1/4,1/7,1,1/2,1/3,1/3,1/5,2,1,1,1/3,1/5,3,1,1
1,2,5,1/2,1,2,1/5,1/2,1
1,1/3,1/8,3,1,1/3,8,3,1
1,1,3,1,1,3,1/3,1/3,1
1,3,4,1/3,1,1,1/4,1,1
1,1,1/4,1,1,1/4,4,4,1

最终结果:
得分分别为0.299,0.245,0,455

参考文献

[1]清风教学视频第一讲
[2]司守奎, 徐珂文, 李日华. 数学建模算法与程序[J]. 海军航空工程学院, 2007, 9: 95-98

你可能感兴趣的:(数学建模)