【前后端實現】AHP權重計算

AHP權重計算:

需求:前端記錄矩陣維度、上三角值,后端構建比較矩陣、計算權重值并將結果返回給前端

?比較矩陣構建

如果你想要根據上三角(不包括對角線)的值來構建對稱矩陣,那么你可以稍作修改上述的generate_symmetric_matrix函數。在這個情況下,你將從矩陣的左上角開始填充上三角的值,然后利用對稱性填充下三角的值。

def generate_symmetric_matrix_from_upper(i, upper_triangle_values):  """  根據上三角(不包括對角線)的值和矩陣維度生成對稱矩陣  :param i: 矩陣的維度(i x i)  :param upper_triangle_values: 上三角(不包括對角線)的值列表  :return: 生成的對稱矩陣  """  if len(upper_triangle_values) > i * (i - 1) // 2:  raise ValueError("提供的上三角值數量超過了上三角(不包括對角線)的元素總數。")  # 初始化矩陣  matrix = [[1] * i for _ in range(i)]  # 對角線初始化為1  # 填充上三角(不包括對角線)的值  index = 0  for row in range(i):  for col in range(row + 1, i):  # 從當前行的下一個元素開始(跳過對角線)  matrix[row][col] = upper_triangle_values[index]  index += 1  # 填充下三角的值(利用對稱性)  for row in range(i):  for col in range(row):  # 只遍歷到當前行的前一個元素(不包括對角線)  matrix[row][col] = 1/matrix[col][row]  # 下三角的值等于上三角的值  return matrix  # 示例使用  
i = 3  # 矩陣維度  
upper_triangle_values = [0.6, 3, 5]  # 上三角(不包括對角線)的值  
matrix = generate_symmetric_matrix_from_upper(i, upper_triangle_values)  # 打印矩陣  
for row in matrix:  print(row)
  • 在這個函數中,我們首先檢查提供的上三角值的數量是否超過了實際需要的數量。然后,我們初始化一個所有對角線元素都為1的矩陣。接著,我們遍歷上三角(不包括對角線)并填充提供的值。最后,我們利用對稱性來填充下三角的值。
  • 當你運行這個示例時,它將輸出一個3x3的對稱矩陣,其中上三角的值由upper_triangle_values列表提供,而下三角的值則通過對稱性從上三角復制而來。對角線上的值保持為1。

AHP權重計算

層次分析法(Analytic Hierarchy Process, AHP)是一種常用的多屬性決策方法,它允許決策者將復雜的決策問題分解為多個子問題或屬性,并通過兩兩比較的方式來確定這些子問題或屬性的相對重要性。以下是一個簡化的Python示例,展示了如何使用層次分析法求解權重值:

  1. 構造判斷矩陣(通過專家打分等方式)
  2. 一致性檢驗
  3. 求解權重值
import numpy as np  def calculate_consistency_ratio(ci, n):  # 一致性指標RI的值與n(判斷矩陣的階數)有關  ri_values = {  1: 0.0, 2: 0.0, 3: 0.58, 4: 0.9, 5: 1.12,  6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49  }  ri = ri_values[n]  cr = ci / ri  return cr  def calculate_ci(matrix):  # 計算一致性指標CI  n = matrix.shape[0]  eigenvalues, _ = np.linalg.eig(matrix)  max_eigenvalue = np.max(eigenvalues)  ci = (max_eigenvalue - n) / (n - 1)  return ci  def calculate_weights(matrix):  # 計算權重值  eigenvalues, eigenvectors = np.linalg.eig(matrix)  max_eigenvalue = np.max(eigenvalues)  max_eigenvector = eigenvectors[:, eigenvalues == max_eigenvalue]  weights = max_eigenvector.flatten().real / np.sum(max_eigenvector.flatten().real)  return weights  def ahp_analysis(matrix):  # AHP分析主函數  n = matrix.shape[0]  ci = calculate_ci(matrix)  cr = calculate_consistency_ratio(ci, n)  if cr < 0.1:  # 一般情況下,當CR<0.1時,認為判斷矩陣的一致性是可以接受的  weights = calculate_weights(matrix)  print("一致性檢驗通過,權重值為:", weights)  else:  print("一致性檢驗未通過,需要重新調整判斷矩陣")  # 示例判斷矩陣(假設)  
# 注意:這里的判斷矩陣應該是通過專家打分或其他方式構造的,并且應該滿足互反性  
A = np.array([  [1, 3, 5],  [1/3, 1, 3],  [1/5, 1/3, 1]  
])  ahp_analysis(A)

注意:

  • 上述代碼中的判斷矩陣A是假設的,實際應用中需要根據實際情況構造。
  • 一致性檢驗的閾值通常是0.1,但也可以根據具體需求進行調整。
  • 判斷矩陣的構造應該遵循AHP方法的規則,即對角線元素為1,且滿足互反性(即A[i][j] = 1 / A[j][i])。
  • 權重值是通過求解判斷矩陣的最大特征值對應的特征向量得到的,并且需要對該特征向量進行歸一化處理。

前后端設計

在前后端通信中,當前端需要傳遞兩個參數給后端,其中一個參數是數組,另一個是int類型時,你需要在前端正確地構造請求,并在后端Flask應用中設計相應的路由和請求處理函數來接收這些參數。

前端(JavaScript 使用?fetch?API)

假設你正在使用JavaScript的fetch?API來發送POST請求,你可以將數組和int值作為JSON對象的一部分發送。這里是一個例子:

// 假設你的后端API的URL是'http://example.com/api/data'  
const arrayParam = [1, 2, 3]; // 數組參數  
const intParam = 42; // int類型參數  // 將參數包裝在一個對象中  
const dataToSend = {  arrayParam: arrayParam,  intParam: intParam  
};  // 將對象轉換為JSON字符串  
const jsonData = JSON.stringify(dataToSend);  fetch('http://example.com/api/data', {  method: 'POST',  headers: {  'Content-Type': 'application/json'  },  body: jsonData  
})  
.then(response => response.json())  
.then(data => console.log(data))  
.catch((error) => {  console.error('Error:', error);  
});

后端(Flask)

在后端,你需要在Flask應用中創建一個路由,并使用request.json來獲取前端發送的JSON數據。這里是一個例子:

from flask import Flask, request, jsonify  app = Flask(__name__)  @app.route('/api/data', methods=['POST'])  
def receive_data():  if request.method == 'POST':  # 從JSON中解析參數  array_param = request.json.get('arrayParam', [])  # 默認值為空數組  int_param = request.json.get('intParam', None)  # 默認值為None,你可以根據需要設置默認值  # 檢查int_param是否為int類型  if int_param is not None and not isinstance(int_param, int):  return jsonify({'error': 'intParam must be an integer'}), 400  # 在這里處理你的數據...  # 例如,你可以返回接收到的參數作為確認  return jsonify({'message': 'Data received!', 'arrayParam': array_param, 'intParam': int_param}), 200  else:  return jsonify({'error': 'Invalid request method'}), 405  if __name__ == '__main__':  app.run(debug=True)

在這個例子中,receive_data函數首先檢查請求方法是否為POST。然后,它從request.json中獲取arrayParamintParam。注意,我使用了get方法來安全地獲取這些值,并為它們提供了默認值(對于arrayParam是一個空數組,對于intParamNone)。然后,它檢查intParam是否是一個整數,如果不是,則返回一個錯誤響應。最后,它返回一個包含接收到的參數的JSON響應。

postman測試:?

后端模塊與接口 :
AHP.py
import jsonimport numpy as npdef calculate_consistency_ratio(ci, n):# 一致性指標RI的值與n(判斷矩陣的階數)有關ri_values = {1: 0.0, 2: 0.0, 3: 0.58, 4: 0.9, 5: 1.12,6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45, 10: 1.49}ri = ri_values[n]cr = ci / rireturn crdef calculate_ci(matrix):# 計算一致性指標CIn = matrix.shape[0]eigenvalues, _ = np.linalg.eig(matrix)max_eigenvalue = np.max(eigenvalues)ci = (max_eigenvalue - n) / (n - 1)return cidef calculate_weights(matrix):# 計算權重值eigenvalues, eigenvectors = np.linalg.eig(matrix)max_eigenvalue = np.max(eigenvalues)max_eigenvector = eigenvectors[:, eigenvalues == max_eigenvalue]weights = max_eigenvector.flatten().real / np.sum(max_eigenvector.flatten().real)return weightsdef ahp_analysis(matrix):# AHP分析主函數n = matrix.shape[0]ci = calculate_ci(matrix)cr = calculate_consistency_ratio(ci, n)if cr < 0.1:  # 一般情況下,當CR<0.1時,認為判斷矩陣的一致性是可以接受的weights = calculate_weights(matrix)print("一致性檢驗通過,權重值為:", weights)else:print("一致性檢驗未通過,需要重新調整判斷矩陣")return weightsdef generate_symmetric_matrix_from_upper(i, upper_triangle_values):"""根據上三角(不包括對角線)的值和矩陣維度生成對稱矩陣:param i: 矩陣的維度(i x i):param upper_triangle_values: 上三角(不包括對角線)的值列表:return: 生成的對稱矩陣"""if len(upper_triangle_values) != i * (i - 1) / 2:raise ValueError("提供的上三角值數量不匹配。")# 初始化矩陣matrix = [[1] * i for _ in range(i)]  # 對角線初始化為1# 填充上三角(不包括對角線)的值index = 0for row in range(i):for col in range(row + 1, i):  # 從當前行的下一個元素開始(跳過對角線)matrix[row][col] = upper_triangle_values[index]index += 1# 填充下三角的值(利用對稱性)for row in range(i):for col in range(row):  # 只遍歷到當前行的前一個元素(不包括對角線)matrix[row][col] = 1/matrix[col][row]  # 下三角的值等于上三角的值return matrix# 方法,前端傳來矩陣維數+上三角值【row1Value1,row1Value2,row2Value2】數組,自動生成矩陣并返回AHP分析結果值
def cal_AHP_res(matrixDimension,upper_triangle_values):matrix = generate_symmetric_matrix_from_upper(matrixDimension,upper_triangle_values)A = np.array(matrix)matrix_res=json.dumps(matrix)arr= ahp_analysis(A)# 將其轉換為 Python 列表list_arr = arr.tolist()# 將列表轉換為 JSON 字符串res = json.dumps(list_arr)return matrix_res,resif __name__ == '__main__':# 生成矩陣示例i = 3  # 矩陣維度upper_triangle_values = [3, 0.75, 0.5]  # 上三角(不包括對角線)的值matrix_res, res=cal_AHP_res(i,upper_triangle_values)//flask接口
@app.route('/ahp', methods=['POST'])
def getAHPRes():matrix_dimension=request.json.get('matrix_dimension')value = request.json.get('upper_values',[])  # 獲取數值型值 valuesprint(len(value))matrix,weight= cal_AHP_res(matrix_dimension,value)return jsonify({'matrix': matrix,'weight':weight})

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35253.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET 語言特定指南

.NET Language-Specific Guide 本指南將教您如何使用 Docker 創建容器化的 .NET 應用程序。通過本指南&#xff0c;您將學習如何&#xff1a; 容器化并運行 .NET 應用程序設置本地環境以使用容器開發 .NET 應用程序使用容器運行 .NET 應用程序測試使用 GitHub Actions 配置容…

量化交易面臨的難題

量化交易面臨的難題 1、監管機構對于算法交易、量化交易的監管越來越嚴格3、回測場景于實盤交易場景的不匹配性4、策略并非100%有效&#xff0c;并非100%的收益5、股票、基本面、市場新聞之間的關系時刻在變化并且難以捉摸6、很難使用一套通用的交易規則去匹配所有的股票/市場/…

U盤數據恢復實戰:兩大方案助您找回珍貴數據

在數字化時代&#xff0c;U盤作為我們隨身攜帶的數據存儲工具&#xff0c;承載著無數重要的文件和信息。然而&#xff0c;由于誤操作、系統崩潰或硬件故障等原因&#xff0c;U盤中的數據可能會突然消失&#xff0c;給我們帶來極大的困擾。本文將深入探討U盤數據恢復的概念、方法…

常見大功率藍牙應用有哪些?

在無線通信技術飛速發展的今天&#xff0c;藍牙技術以其低功耗和易用性優勢成為短距離無線通信的佼佼者。然而&#xff0c;隨著智能家居、工業4.0等新型應用的興起&#xff0c;藍牙應用設備對通信距離和穩定性的要求越來越高。為了滿足更大范圍的無線通信需求&#xff0c;大功率…

山寨幣大額解鎖拋壓拖累比特幣:10X Research 深度剖析市場動蕩

加密貨幣市場大幅下跌&#xff0c;山寨幣損失慘重 在經歷了幾個月的強勁表現后&#xff0c;加密貨幣市場最近經歷了一輪大幅下跌&#xff0c;特別是山寨幣損失慘重。10X Research 最近在其Newsletter中發表了觀點&#xff0c;認為山寨幣大額解鎖所帶來的拋壓正在拖累比特幣。本…

使用Birdeye訪問Sui上加密市場數據

是一個鏈上加密交易數據聚合器&#xff0c;于2024年4月開始整合Sui數據。 個人DeFi用戶可以在Birdeye的首頁找到豐富的數據&#xff0c;包括關于主流區塊鏈上的tokens、交易和交易者錢包的詳細信息。 Birdeye提供API和WebSockets數據服務&#xff0c;涵蓋token價格和其他DeFi…

聚星文社ai工具下載

您可以在聚星文社官方網站上下載他們的AI工具。請訪問他們的官方網站&#xff0c; 然后找到下載頁面&#xff0c;從中選擇并下載所需的AI工具。下載 如果您對下載過程有任何問題&#xff0c;建議您直接聯系聚星文社的客服人員尋求幫助。

計算機SCI期刊,中科院3區,1個月錄用,易過審

一、期刊名稱 Visual Computer 二、期刊簡介概況 期刊類型&#xff1a;SCI 學科領域&#xff1a;計算機科學 影響因子&#xff1a;3.5 中科院分區&#xff1a;3區 三、期刊簡介 視覺計算機發表有關捕獲、識別、建模、分析和生成形狀和圖像的所有研究領域的文章。 計算機…

DDMA信號處理以及數據處理的流程---doa估計

Hello,大家好,我是Xiaojie,好久不見,歡迎大家能夠和Xiaojie一起學習毫米波雷達知識,Xiaojie準備連載一個系列的文章—DDMA信號處理以及數據處理的流程,本系列文章將從目標生成、信號仿真、測距、測速、cfar檢測、測角、目標聚類、目標跟蹤這幾個模塊逐步介紹,這個系列的…

蘇寧易購通用卡怎么使用?

現在還有人用蘇寧的禮品卡嗎 前兩天618&#xff0c;想買點家電&#xff0c;但是在蘇寧上看價格還不如京東淘寶優惠 最后手里的蘇寧卡也沒用出去 本來想著要不送人算了&#xff0c;但是收卡云的價格也還不錯&#xff0c;最后就賣出去了 500塊錢的蘇寧卡買了475&#xff0c;到…

消費疲軟,如何提振市場信心

消費疲軟是一個復雜的市場現象&#xff0c;提振市場信心需要從多個方面入手。以下是一些具體的建議&#xff0c;旨在幫助提振市場信心并應對消費疲軟&#xff1a; 增加消費者購買力&#xff1a; 提高居民收入水平&#xff0c;特別是中低收入群體。通過經濟發展、政策扶持等手段…

MySQL死鎖

目錄 死鎖的原因 死鎖的解決方法 預防MySQL死鎖的策略 檢測MySQL中的死鎖 MySQL死鎖是指在MySQL數據庫中,兩個或多個事務在執行過程中,因爭奪鎖資源而造成的相互等待的現象,若無外力干涉它們都將無法繼續執行。 死鎖的原因 事務競爭資源:多個事務同時競爭同一資源,其…

google瀏覽器無法訪問大端口的處理方式

屬性的目標中添加后綴內容或者修改后臺端口為常用端口&#xff0c;比如8080等。 “C:\Program Files\Google\Chrome\Application\chrome.exe” --explicitly-allowed-ports8888

責任鏈模式(設計模式)

責任鏈模式&#xff08;Chain of Responsibility Pattern&#xff09;是一種行為設計模式&#xff0c;它允許多個對象有機會處理請求&#xff0c;從而避免請求的發送者和接收者之間的耦合。將這些對象連成一條鏈&#xff0c;并沿著這條鏈傳遞請求&#xff0c;直到有一個對象處理…

【Excel】單元格如何設置可選項、固定表頭

設置可選項 固定表頭&#xff1a;視圖---凍結窗口

c++ 線程安全與線程管理

C11引入了標準庫中的多線程支持&#xff0c;包括std::thread類和各種同步機制 互斥鎖std::mutex &#xff1a; 互斥鎖用于保護共享資源&#xff0c;確保同一時間只有一個線程能夠訪問該資源&#xff0c;以防止數據競爭。 條件變量std::condition_variable &#xff1a; 條件變…

埃特巴什碼加解密小程序

埃特巴什碼加解密小程序 這幾天在看CTF相關的課程&#xff0c;涉及到古典密碼學和近代密碼學還有現代密碼學。 簡單替換密碼 Atbash Cipher 埃特巴什碼(Atbash Cipher)其實可以視為下面要介紹的簡單替換密碼的特例&#xff0c;它使用字母表中的最后 一個字母代表第一個字母…

springboot學習01-[springboot介紹、配置文件介紹、自動配置讀取原理]

springboot介紹、配置文件介紹、自動配置讀取原理 springBoot學習代碼說明為什么java -jar springJar包后項目就可以啟動 配置文件介紹配置文件加載順序其他約定配置文件加載順序profile配置文件加載配置文件綁定類屬性通過Value的方式進行屬性注入通過ConfigurationProperties…

力扣62 不同路徑

一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖中標記為 “Finish” &#xff09;。 問總共有多少條不同的路徑&#xff1f; 輸入&…

【LC刷題】DAY16:530 501 236

【LC刷題】DAY16&#xff1a;530 501 236 文章目錄 【LC刷題】DAY16&#xff1a;530 501 236530. 二叉搜索樹的最小絕對差 [link](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/)501.二叉搜索樹中的眾數236. 二叉樹的最近公共祖先 [link](htt…