数学建模(层次分析法 python代码 案例)

目录

介绍: 

模板:

例题:从景色、花费、饮食,男女比例四个方面去选取目的地

 准则重要性矩阵:

 每个准则的方案矩阵:​编辑

 一致性检验:

 特征值法求权值:

完整代码:

运行结果:

介绍: 

层次分析法(Analytic Hierarchy Process, AHP)是一种多准则决策分析方法,它将多个准则组织成一个层次结构,通过对各个层次之间的比较和权重的计算,最终得到准则的相对重要性和最优解决方案。

层次分析法的基本思想是将复杂的决策问题分解为一系列层次,从总体目标到具体准则和方案,建立层次结构模型。在层次结构模型中,各层次之间的关系通过比较矩阵来表示,比较矩阵中的元素表示各个准则或方案之间的相对重要性。

在层次分析法中,通过对比较矩阵进行一系列计算,可以得到各个准则和方案的权重,从而评估它们的相对重要性。最终,通过计算各个方案的综合评价值,可以选择最优解决方案。

层次分析法的特点是能够处理多个准则之间的相对重要性,能够量化主观判断,并且易于理解和应用。它广泛应用于决策分析、资源分配、评估和排序等领域。

 

模板:

#以下是一个使用Python实现层次分析法的简单模板:

```python
import numpy as np

def ahp(criteria_matrix):
    n = len(criteria_matrix)
    weights_matrix = np.zeros((n, n))
    
    # Step 1: 计算准则矩阵的列向量归一化
    column_sums = criteria_matrix.sum(axis=0)
    normalized_matrix = criteria_matrix / column_sums
    
    # Step 2: 计算每个准则的权重
    weights = normalized_matrix.sum(axis=1) / n
    
    # Step 3: 计算每个准则之间的相对重要性
    for i in range(n):
        for j in range(n):
            weights_matrix[i, j] = weights[i] / weights[j]
    
    # Step 4: 计算最终权重
    final_weights = weights_matrix.sum(axis=1) / n
    
    return final_weights

# 测试代码
criteria_matrix = np.array([[1, 1/2, 2], [2, 1, 3], [1/2, 1/3, 1]])
weights = ahp(criteria_matrix)
print("准则的权重:", weights)
```

在这个模板中,我们首先定义了一个名为`ahp`的函数,它接收一个准则矩阵作为参数。准则矩阵是一个n×n的二维数组,表示准则之间的相对重要性。

在函数内部,我们首先计算准则矩阵的列向量归一化,然后计算每个准则的权重。接下来,我们通过两层循环计算每个准则之间的相对重要性,并将结果存储在权重矩阵中。

最后,我们计算权重矩阵每一行的平均值作为最终的权重,并返回结果。

在测试代码中,我们创建了一个准则矩阵`criteria_matrix`,然后调用`ahp`函数计算准则的权重,并打印出结果。

请注意,这只是一个简单的模板,可以根据具体的应用场景进行修改和扩展。

例题:从景色、花费、饮食,男女比例四个方面去选取目的地

 

 准则重要性矩阵:

# 准则重要性矩阵,即为我们在这里的时候要输入准则性矩阵
    criteria = np.array([
                        [1,1/2,4,3],
                        [2,1,5,5],
                        [1/4,1/5,1,1/4],
                        [1/3,1/5,4,1]])

 每个准则的方案矩阵:

# 对每个准则,方案优劣排序,即为方案层也会有一个一致矩阵,所以需要判
    b1 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])
    b2 = np.array([[1, 2, 3], [1 / 2, 1, 2], [1 / 3, 1 / 2, 1]])
    b3 = np.array([[1,1,3],[1,1,2],[1/3,1/2,1]])
    b4 = np.array([[1,3,5],[1/3,1,4],[1/5,1/4,1]])
    b = [b1, b2, b3, b4]

 一致性检验:

进行一致性检验是为了确定层次分析法的结果是否可信和可靠。一致性检验是通过计算一致性指标来评估判断矩阵的相对一致性。

在层次分析法中,判断矩阵是用专家主观判断准则之间的相对重要性构成的,因此可能存在主观性的偏差和一致性问题。如果判断矩阵不一致,那么使用该矩阵计算得到的权重可能是不准确的,从而导致决策结果的偏离。

一致性检验通常使用一致性比率(Consistency Ratio,CR)来进行评估。CR是通过计算判断矩阵的最大特征值和一致性指标的比值得到的。如果CR小于某个阈值(通常为0.1),那么判断矩阵被认为是一致的,可以用来计算权重。如果CR大于阈值,那么判断矩阵存在较大的一致性问题,需要重新进行调整或修改。

通过一致性检验,我们可以对层次分析法的结果进行质量控制,确保决策结果的准确性和可信度。

# 一致性检验
def calculate_weight(data):
    RI = (0, 0.00001, 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)
    # 转化为array类型的对象
    in_matrix = np.array(data)
    n, n2 = in_matrix.shape
    # 判断矩阵是否为方阵,而且矩阵的大小为n,n2
    if n != n2:
        print("不是一个方阵,所以不能进行接下来的步骤")
        return None
    for i in range(0, n):
        for j in range(0, n2):
            if np.abs(in_matrix[i, j] * in_matrix[j, i] - 1) > 1e-7:
                raise ValueError("不为正互反矩阵")

    eig_values, eig_vectors = np.linalg.eig(in_matrix)  # np.linalg.eig(matri)返回特征值和特征向量
    # eigvalues为特征向量,eigvectors为特征值构成的对角矩阵(而且其他位置都为0,对角元素为特征值)
    max_index = np.argmax(eig_values)  # argmax为获取最大特征值的下标,而且这里是获取实部
    # print(max_index)

    max_eig = eig_values[max_index].real  # 这里max_eig是最大的特征值
    # print(max_eig)

    #eig_=calculate_feature_weight(in_matrix,n)

    if n > 15:#超过十五个特征,相对效果差
        CR = None
        warnings.warn(("无法判断一致性"))
    else:
        CI = (max_eig - n) / (n - 1)
        if RI[n - 1] != 0:
            CR = CI / RI[n - 1]
        if CR < 0.1:
            print("一致性可以被接受")
        else:
            print("一致性不能被接受")
    return max_eig, CR, eig_

 特征值法求权值:

# 特征值法求权重
def calculate_feature_weight(matrix, n):
    # 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重
    eigValue, eigVectors = np.linalg.eig(matrix)# np.linalg.eig(matri)返回特征值和特征向量

    max_index = np.argmax(eigValue)# argmax为获取最大特征值的下标,而且这里是获取实部

    max_eig = eigValue[max_index].real#这里max_eig是最大的特征值

    eig_ = eigVectors[:, max_index].real#最大特征值对应的特征向量

    eig_ = eig_ / eig_.sum()

    return eig_# 这里返回的是特征向量

完整代码:

#coding=gbk
import numpy as np
import pandas as pd
import warnings

# 一致性检验
def calculate_weight(data):
    RI = (0, 0.00001, 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)
    # 转化为array类型的对象
    in_matrix = np.array(data)
    n, n2 = in_matrix.shape
    # 判断矩阵是否为方阵,而且矩阵的大小为n,n2

    eig_values, eig_vectors = np.linalg.eig(in_matrix)  # np.linalg.eig(matri)返回特征值和特征向量
    # eigvalues为特征向量,eigvectors为特征值构成的对角矩阵(而且其他位置都为0,对角元素为特征值)
    max_index = np.argmax(eig_values)  # argmax为获取最大特征值的下标,而且这里是获取实部
    # print(max_index)

    max_eig = eig_values[max_index].real  # 这里max_eig是最大的特征值
    # print(max_eig)

    eig_=calculate_feature_weight(in_matrix,n)

    if n > 15:#超过十五个特征,相对效果差
        CR = None
        warnings.warn(("无法判断一致性"))
    else:
        CI = (max_eig - n) / (n - 1)
        if RI[n - 1] != 0:
            CR = CI / RI[n - 1]
        if CR < 0.1:
            print("一致性可以被接受")
        else:
            print("一致性不能被接受")
    return max_eig, CR, eig_


# 特征值法求权重
def calculate_feature_weight(matrix, n):
    # 特征值法主要是通过求出矩阵的最大特征值和对应的特征向量,然后对其特征向量进行归一化,最后获得权重
    eigValue, eigVectors = np.linalg.eig(matrix)# np.linalg.eig(matri)返回特征值和特征向量

    max_index = np.argmax(eigValue)# argmax为获取最大特征值的下标,而且这里是获取实部

    max_eig = eigValue[max_index].real#这里max_eig是最大的特征值

    eig_ = eigVectors[:, max_index].real#最大特征值对应的特征向量

    eig_ = eig_ / eig_.sum()

    return eig_# 这里返回的是特征向量

if __name__ == "__main__":
    # 准则重要性矩阵,即为我们在这里的时候要输入准则性矩阵
    criteria = np.array([
                        [1,1/2,4,3],
                        [2,1,5,5],
                        [1/4,1/5,1,1/4],
                        [1/3,1/5,4,1]])

    # 对每个准则,方案优劣排序,即为方案层也会有一个一致矩阵,所以需要判
    b1 = np.array([[1, 2, 5], [1 / 2, 1, 2], [1 / 5, 1 / 2, 1]])
    b2 = np.array([[1, 2, 3], [1 / 2, 1, 2], [1 / 3, 1 / 2, 1]])
    b3 = np.array([[1,1,3],[1,1,2],[1/3,1/2,1]])
    b4 = np.array([[1,3,5],[1/3,1,4],[1/5,1/4,1]])
    b = [b1, b2, b3, b4]

    matrix_in = criteria
    max_eigen, CR, criteria_eigen = calculate_weight(matrix_in)

    print("准则层:最大特征值:{:.5f},CR={:<.5f},检验{}通过".format(max_eigen, CR, '' if CR < 0.1 else "不"))
    print("准则层权重为{}\n".format(criteria_eigen))

    max_eigen_list = []
    CR_list = []
    eigen_list = []
    for i in b:
        max_eigen, CR, eigen = calculate_weight(i)#每个准则
        max_eigen_list.append(max_eigen)#存最大特征值
        CR_list.append(CR)#存CR
        eigen_list.append(eigen)#存特征向量
    pd_print = pd.DataFrame(eigen_list, index=["准则" + str(i) for i in range(0, criteria.shape[0])],
                            columns=["方案" + str(i) for i in range(0, b[0].shape[0])])
    pd_print.loc[:, '最大特征值'] = max_eigen_list
    print("方案层")
    print(pd_print)
    print("\n")


    # 目标层
    object = np.dot(criteria_eigen.reshape(1, -1), np.array(eigen_list))
    print("\n目标层", object)
    print("最优选择方案{}".format(np.argmax(object)))
    print("即为苏杭")

运行结果:

相关推荐

  1. 数学(Topsis python代码 案例

    2024-03-20 11:26:03       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-20 11:26:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-20 11:26:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-20 11:26:03       82 阅读
  4. Python语言-面向对象

    2024-03-20 11:26:03       91 阅读

热门阅读

  1. 【数据库】MySQL表的增删改查(二)

    2024-03-20 11:26:03       37 阅读
  2. clickhouse使用心得

    2024-03-20 11:26:03       48 阅读
  3. Day23 二叉树09

    2024-03-20 11:26:03       37 阅读
  4. SQL的ON DUPLICATE KEY UPDATE使用方法

    2024-03-20 11:26:03       37 阅读
  5. 写了几个难一点的sql

    2024-03-20 11:26:03       40 阅读
  6. 部署dagu_1.12.10+replicadb0.15.1+sqlline1.12

    2024-03-20 11:26:03       41 阅读
  7. accessToken

    2024-03-20 11:26:03       43 阅读
  8. 理解C#和.NET的应用模型

    2024-03-20 11:26:03       39 阅读
  9. 拌合楼管理系统(七) 海康威视摄像头视频预览

    2024-03-20 11:26:03       41 阅读