1. 程式人生 > 程式設計 >python實現AHP演算法的方法例項(層次分析法)

python實現AHP演算法的方法例項(層次分析法)

一、層次分析法原理

層次分析法(Analytic Hierarchy Process,AHP)由美國運籌學家托馬斯·塞蒂(T. L. Saaty)於20世紀70年代中期提出,用於確定評價模型中各評價因子/準則的權重,進一步選擇最優方案。該方法仍具有較強的主觀性,判斷/比較矩陣的構造在一定程度上是拍腦門決定的,一致性檢驗只是檢驗拍腦門有沒有自相矛盾得太離譜。

相關的理論參考可見:wiki百科

二、程式碼實現

需要藉助Python的numpy矩陣運算包,程式碼最後用了一個b1矩陣進行了除錯,相關程式碼如下,具體的實現流程已經用詳細的註釋標明,各位小夥伴有疑問的歡迎留言和我一起討論。

import numpy as np
class AHP:
  """
  相關資訊的傳入和準備
  """

  def __init__(self,array):
    ## 記錄矩陣相關資訊
    self.array = array
    ## 記錄矩陣大小
    self.n = array.shape[0]
    # 初始化RI值,用於一致性檢驗
    self.RI_list = [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])

  """
  一致性判斷
  """

  def test_consist(self):
    # 列印矩陣的一致性指標CI和一致性比例CR
    print("判斷矩陣的CI值為:" + str(self.CI_val))
    print("判斷矩陣的CR值為:" + str(self.CR_val))
    # 進行一致性檢驗判斷
    if self.n == 2: # 當只有兩個子因素的情況
      print("僅包含兩個子因素,不存在一致性問題")
    else:
      if self.CR_val < 0.1: # CR值小於0.1,可以通過一致性檢驗
        print("判斷矩陣的CR值為" + str(self.CR_val) + ",通過一致性檢驗")
        return True
      else: # CR值大於0.1,一致性檢驗不通過
        print("判斷矩陣的CR值為" + str(self.CR_val) + "未通過一致性檢驗")
        return False

  """
  算術平均法求權重
  """

  def cal_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)
    # 返回權重向量的值
    return array_weight

  """
  幾何平均法求權重
  """

  def cal_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)
    # 返回權重向量的值
    return array_weight

  """
  特徵值法求權重
  """

  def cal_weight__by_eigenvalue_method(self):
    # 將矩陣最大特徵值對應的特徵向量進行歸一化處理就得到了權重
    array_weight = self.max_eig_vector / np.sum(self.max_eig_vector)
    # 列印權重向量
    print("特徵值法計算得到的權重向量為:\n",array_weight)
    # 返回權重向量的值
    return array_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演算法(層次分析法)的文章就介紹到這了,更多相關python AHP演算法(層次分析法)內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!