【前后端实现】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 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})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kivy tutorial 004: Making the GUI do stuff, binding to events

Kivy tutorial 004: Making the GUI do stuff, binding to events – Kivy Blog Central themes: Events and Kivy properties 中心主题&#xff1a;事件和kivy属性 We left the last tutorial with a calculator app GUI with some nice automatic behaviour, but which doe…

嵌入式C语言中常见寄存器的控制方法

使用C语言对寄存器赋值时,常常需要用到C语言的位操作方法。 把寄存器某位清零 假设a代表寄存器,且其中本来已有值。如果要把其中某一位清零且其它位不变,代码如下。 //定义一个变量 a = 1001 1111 b (二进制数)unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<…

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

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

springboot+vue+mybatis门窗管理系统+PPT+论文+讲解+售后

如今社会上各行各业&#xff0c;都在用属于自己专用的软件来进行工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。互联网的发展&#xff0c;离不开一些新的技术&#xff0c;而新技术的产生往往是为了解决现有问题而产生的。针对于仓库信息管理方…

[学习笔记] 禹神:一小时快速上手Electron笔记,附代码

课程地址 禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 笔记地址 https://github.com/sui5yue6/my-electron-app 进程通信 桌面软件 跨平台的桌面应用程序 chromium nodejs native api 流程模型 main主进程 .js文件 node…

攻克PS之路——Day1(A1-A8)

#暑假到了&#xff0c;作为可能是最后一个快乐的暑假&#xff0c;我打算学点技能来傍身&#xff0c;首先&#xff0c;开始PS之旅 这个帖子作为我跟着B站up主学习PS的记录吧&#xff0c;希望我可以坚持下去&#xff01; 学习的链接在这里&#xff1a;A02-PS软件安装&#xff0…

Qt | 子类化 QStyle(Qt自带图标大全)

01、简介 1、把绘制自定义部件外观的步骤大致分为三大板块,如下: ①、样式元素:即指定需要绘制的图形元素(比如焦点框、按钮,工具栏等)。样式元素使 用 QStyle 类中的一系列枚举(共有 11 个枚举)进行描述。 ②、样式选项:包含了需要绘制的图形元素的所有信息,比如包含…

【QCustomPlot实战系列】QCPGraph区域高亮

使用QCPDataSelection来设置选中的区域&#xff0c;并将QCPGraph的可选择区域设置成QCP::stMultipleDataRanges void AreaPieces::initCustomPlot(QCustomPlot *parentPlot) {QVector<double> x {0, 1, 2, 3, 4, 5, 6, 7, 8};QVector<double> y {200, 560, 750…

asp.net core反向代理

新建项目 新建空白的asp.net core web项目 安装Yarp.ReverseProxy包版本为2.2.0-preview.1.24266.1 编写代码 namespace YarpStu01;public class Program {public static void Main(string[] args){var builder WebApplication.CreateBuilder(args);builder.Services.AddRev…

昇思25天学习打卡营第01天|基本介绍

作为曾经的javaer&#xff0c;本着不断学习的初心&#xff0c;报名了昇思25天的课程&#xff0c;希望自己能学会点东西的目的。 昇思MindSpore介绍 昇思MindSpore是一个全场景深度学习框架&#xff0c;旨在实现易开发、高效执行、全场景统一部署三大目标。 其中&#xff0c;…

AI大模型日报#0625:OpenAI停止不支持国家API、大模型「考上」一本、苹果上新视觉模型4M-21

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE-4.0-8K-latest&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff01;《AI大模型日报》今日要点&#xf…

【LeetCode】一、数组相关(双指针算法 + 置换)

文章目录 1、算法复杂度1.1 时间复杂度1.2 空间复杂度 2、数组3、leetcode485&#xff1a;最大连续1的个数4、leetcode283&#xff1a;移动05、leetcode27&#xff1a;移除元素 1、算法复杂度 1.1 时间复杂度 算法的执行时间与输入值之间的关系&#xff08;看代码实际总行数的…

MySQL 5.7.42 主从复制环境搭建

MySQL 5.7.42 主从复制环境搭建 下载MySQL二进制包操作系统环境配置安装过程搭建从库 本次安装环境&#xff1a; OS版本&#xff1a;Red Hat Enterprise Linux Server release 6.8 (Santiago) MySQL版本&#xff1a;5.7.42 架构&#xff1a;同一台机器&#xff0c;多实例安装搭…

洁净室(区)浮游菌检测标准操作规程及GB/T 16292-2010测试方法解读

洁净室(区)空气中浮游菌的检测。洁净区浮游菌检测是一种评估和控制洁净区(如实验室、生产车间等)内空气质量的方法。这种检测的目的是通过测量空气中的微生物(即浮游菌)数量&#xff0c;来评估洁净区的清洁度或污染程度。下面中邦兴业小编带大家详细看下如何进行浮游菌采样检测…

TSLANet:时间序列模型的新构思

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

Python --- 如何修改Jupyter Notebook保存文件的路径?

如何修改Jupyter Notebook在本地保存文件的默认路径&#xff1f; 一直以来都比较喜欢jupter notebook&#xff0c;自从用了以后就爱上了。平时用的时候&#xff0c;因为大多都是临时调用&#xff0c;每次在界面里直接new一个新的file就开干。 曾经也想过我创建的这些python文件…

Android开发系列(十)Jetpack Compose之Card

Card是一种常用的UI组件&#xff0c;用于显示一个具有卡片样式的容器。Card组件通常用于显示列表项、卡片式布局或任何需要显示边框和阴影的UI元素。 使用Card组件&#xff0c;您可以轻松地创建带有卡片效果的UI元素。以下是一些Card组件的常见属性和功能&#xff1a; elevati…

微软专家分享 | AIGC开发者沙龙上海站来啦!

为了向技术开发者、业务人员、高校学生、以及个体创业人员等AI技术关注者们提供更深入的行业洞察、技术交流平台和创新思维的启发&#xff0c;AIGC开放社区联合微软Reactor特别组织了一系列城市巡回沙龙分享活动。在上海站中&#xff0c;我们有幸邀请到多位微软专家进行深入的主…

操作系统实训复习笔记(第7关:生产者消费者问题实践)

目录 第7关&#xff1a;生产者消费者问题实践 第1关&#xff1a;生产者消费者问题实践 1、在主线程中初始化锁为解锁状态 2、访问对象时的加锁操作与解锁操作 3、&#xff08;生产和消费进程操作后&#xff09;信号量操作实现进程同步 4、先等待&#xff08;生产还是消费…

数字孪生为何在智慧工业中备受青睐

数字孪生在智慧工业中为何愈发受到重视&#xff1f;随着工业4.0时代的到来&#xff0c;制造业正经历着前所未有的变革。数字孪生技术作为一项革新性的科技手段&#xff0c;通过构建物理实体的数字化复制品&#xff0c;为工业生产、管理和优化提供了全新的方法和视角。其独特的优…