【前后端实现】AHP权重计算

news2025/1/12 1:02:11

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 json

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("一致性检验未通过,需要重新调整判断矩阵")

    return weights


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


# 方法,前端传来矩阵维数+上三角值【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,res


if __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',[])  # 获取数值型值 values
    print(len(value))
    matrix,weight= cal_AHP_res(matrix_dimension,value)
    return jsonify({'matrix': matrix,'weight':weight})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1862846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

窗口控制

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 海龟绘图窗口就是在运行了导入turtle模块并调用了绘图方法的Python文件后&#xff0c;打开的窗口。该窗口默认的宽度为屏幕的50%&#xff0c;高度为屏…

怎么样才能让老旧的和颜色受损、丢失的照片重新上色呢?

怎么样才能让老旧的和颜色受损、丢失的照片重新上色呢&#xff1f;大家有时候在家中打扫卫生的时候&#xff0c;偶然发现了自己爸爸妈妈以前拍的照片&#xff0c;但是照片颜色已经受损的很严重了&#xff0c;几乎就是黑白的颜色&#xff0c;很难看清楚爸爸妈妈年轻时候的样子&a…

OpenAI开发者大会:OpenAI如何再次掀起AI领域的浪潮

对于AI行业的从业者来说&#xff0c;他们可能度过了一个不眠之夜。 北京时间2023年11月7日凌晨&#xff0c;美国人工智能公司OpenAI的开发者大会隆重举行。OpenAI的创始人Sam Altman与同事仅用短短45分钟的时间&#xff0c;在台上发布了他们团队的最新成果——GPT-4 Turbo。这一…

【React】portal

createPortal 允许你将 JSX 作为 children 渲染至 DOM 的不同部分。 createPortal(children, domNode, key?) 使用 portal 渲染模态对话框 import NoPortalExample from "./components/NoPortalExample"; import PortalExample from "./components/PortalEx…

学法减分题库最新版,分享几个简单试用的学习和搜题工具 #微信#经验分享#知识分享

告别繁琐的查询步骤&#xff0c;用我们的拍照搜题功能&#xff0c;只需几秒钟&#xff0c;答案就出现在你眼前&#xff0c;让学习变得更加高效便捷。 1.减分侠 这是个辅助学分减分的公众号 根据新的学法减分考试大纲&#xff0c;涵盖小车、客车、货车、摩托车&#xff0c;各…

放弃 VS Code:新代码编辑器 Zed 的时代已经到来(附使用感受)

1.Zed 是什么&#xff1f; Zed 由 Nathan Sobo 和一个曾在 GitHub 开发 Atom 和 Tree-sitter 的团队开发。他们的目标是创建一个快速、简单且用户友好的代码编辑器&#xff0c;以提升开发人员的编码体验。以下是关于 Zed 历史的一些关键点&#xff1a; 起源&#xff1a;团队利…

菲律宾媒体PR发稿:谷歌SEO优化.关键词排名.谷歌收录

1. 引言 在菲律宾&#xff0c;媒体行业的发展日新月异&#xff0c;尤其是在线媒体。为了在这个竞争激烈的市场中脱颖而出&#xff0c;各家媒体纷纷寻求谷歌SEO优化、提升关键词排名和增加谷歌收录的方法。本文将围绕菲律宾的几大主要在线媒体&#xff0c;如菲律宾在线日志Jour…

计算机系统基础知识(下)

嵌入式系统以及软件 嵌入式系统是为了特定应用而专门构建且将信息处理过程和物理过程紧密结合为一体的专用计算机系统&#xff0c;这个系统目前以涵盖军事&#xff0c;自动化&#xff0c;医疗&#xff0c;通信&#xff0c;工业控制&#xff0c;交通运输等各个应用领域&#xff…

Qwen2本地web Demo

Qwen2的web搭建(streamlit) 千问2前段时间发布了&#xff0c;个人觉得千问系列是我用过最好的中文开源大模型&#xff0c;所以这里基于streamlit进行一个千问2的web搭建&#xff0c;来进行模型的测试 一、硬件要求 该文档中使用的千问模型为7B-Instruct&#xff0c;需要5g以…

【大数据】大数据时代的黎明

目录 前言 深入解读大数据的本质 大数据的起源与演进轨迹 大数据对社会经济的深远影响 经济领域的革新 社会治理与公共服务的智能化 创新体系的重构 面临的挑战与应对 前言 步入21世纪以来&#xff0c;人类文明正站在一个历史性的转折点上&#xff0c;迎来了大数据时代的…

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念&#xff0c;将逐步规范化一个例子&#xff0c;逐级说明每个范式的要求和变换过程。 示例&#xff1a;学生课程登记系统 初始…

汽车零部件制造企业如何选择合适的ESOP电子作业指导书系统

随着汽车产业的不断发展&#xff0c;汽车零部件制造企业在提高生产效率和产品质量方面面临着越来越大的挑战。为了解决这些问题&#xff0c;越来越多的汽车零部件制造企业开始采用ESOP电子作业指导书系统&#xff0c;以帮助他们管理和优化生产流程。但是&#xff0c;在选择合适…

win7使用vue-cli创建vue3工程

1.创建名为test的项目 vue create test 回车以后选择第三个,进行手动选择 2.选择配置 向下箭头表示下一个&#xff0c;空格表示*选中&#xff0c;按照我的选择来选即可&#xff0c;选完后回车 3.选择vue.js版本 上线箭头进行选择&#xff0c;选择后回车 4.选择不同的配置&#…

一个实例配置多个服务名

更改参数实现配置多个服务名 需求背景 在做案例模拟的时候发现博主的环境配置的是3个服务名&#xff0c;通常都是一个服务名&#xff0c;服务名就是数据库名&#xff0c;出于好奇进行了以下实验。 环境&#xff1a;Oracle 11.2.0.4 单点 配置多个服务名的意义 可以通过服务…

【CT】LeetCode手撕—72. 编辑距离

目录 题目1- 思路动规五部曲 2- 实现⭐72. 编辑距离——题解思路 3- ACM 实现 题目 原题连接&#xff1a;72. 编辑距离 1- 思路 模式识别&#xff1a;编辑举例 ——> 动态规划 动规五部曲 1.dp数组的含义 int[][] dp new int[word1.length()][word2.length()];以 i-1 …

正则表达式;grep、sed、awk、soft、uniq、tr 详解

正则表达式 概念 正则表达式&#xff08;Regular Expression&#xff0c;常简写为regex、regexp或RE&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种模式匹配。 标准正则表达式 首先安装正则表达式pcre库 创…

10--7层负载均衡集群

前言&#xff1a;动静分离&#xff0c;资源分离都是在7层负载均衡完成的&#xff0c;此处常被与四层负载均衡比较&#xff0c;本章这里使用haproxy与nginx进行负载均衡总结演示。 1、基础概念详解 1.1、负载均衡 4层负载均衡和7层负载均衡是两种常见的负载均衡技术&#xff…

黑马程序员——Spring框架——day08——maven高级

目录&#xff1a; 分模块开发与设计 分模块开发的意义 问题导入模块拆分原则分模块开发&#xff08;模块拆分&#xff09; 问题导入创建Maven模块书写模块代码通过maven指令安装模块到本地仓库&#xff08;install指令&#xff09;依赖管理 依赖传递 问题导入可选依赖 问题导入…

这就是人性的丑恶,很残酷但很现实

这些年我喜欢跟垃圾撕破脸&#xff0c;包括垃圾亲戚&#xff0c;我是不会跟你讲什么感情的&#xff0c;该滚蛋就滚蛋。我最不喜欢听什么今日留一线&#xff0c;日后好相见。 之前我还不懂事的时候&#xff0c;就有那种亲戚叫我帮他介绍工作&#xff0c;我照做了。 结果&#xf…

实现批量自动化电商数据采集|商品详情页面|店铺商品信息|订单详情数据

电商数据采集是指通过技术手段获取电商平台上的商品信息、店铺信息和订单信息等数据。这些数据可以用于市场分析、竞品分析、用户行为分析等。 商品详情页面是指电商平台上展示商品详细信息的页面&#xff0c;包括商品名称、价格、图片、描述、评价等信息。通过采集商品详情页…