当前位置: 首页 > news >正文

FastAPI+Pyomo实现线性回归解决饮食问题

      之前在 FastAPI介绍-CSDN博客 中介绍过FastAPI,在 Pyomo中线性规划接口的使用-CSDN博客  中使用Pyomo解决饮食问题,这里将两者组合,即FastAPI在服务器端启动,通过Pyomo实现线性回归;客户端通过浏览器获取饮食的最优解。

      这里服务器端的diet.json是已存在的,后期调整为从客户端传过来,以及其它可变参数也从客户端通过json格式传给服务器端。

      实现如下:

from fastapi import FastAPI
from pyomo.environ import *
import mathdef parse_json(file):model = ConcreteModel()data = DataPortal()data.load(filename=file)model.F = Set(initialize=data['sets']['F'])model.N = Set(initialize=data['sets']['N'])model.c = Param(model.F, initialize=data['params']['c'], within=PositiveReals)def parse_a(model, food, nutr):return data['params']['a'][food][nutr]model.a = Param(model.F, model.N, initialize=parse_a, within=NonNegativeReals)model.V = Param(model.F, initialize=data['params']['V'], within=PositiveReals)model.Nmin = Param(model.N, initialize=data['params']['Nmin'], within=NonNegativeReals, default=0.0)def parse_Nmax(model, nutr):val = data['params']['Nmax'][nutr]return val if val != "inf" else math.inf model.Nmax = Param(model.N, initialize=parse_Nmax, within=NonNegativeReals)model.Vmax = Param(initialize=data['params']['Vmax'], within=PositiveReals)return modeldef linear_programming_diet(file, number):model = parse_json(file)model.x = Var(model.F, within=NonNegativeIntegers)model.y = Var(model.F, within=Binary)model.cost = Objective(expr=sum(model.c[i]*model.x[i] for i in model.F), sense=minimize)def nutrient_rule(model, j):value = sum(model.a[i,j]*model.x[i] for i in model.F)return inequality(model.Nmin[j], value, model.Nmax[j])model.nutrient_limit = Constraint(model.N, rule=nutrient_rule)def volume_rule(model):return sum(model.V[i]*model.x[i] for i in model.F) <= model.Vmaxmodel.volume = Constraint(rule=volume_rule)def select_rule(model):return sum(model.y[i] for i in model.F) == numbermodel.select = Constraint(rule=select_rule)def linking_upper_rule(model, f):return model.x[f] <= model.y[f] * 1e6model.linking_upper = Constraint(model.F, rule=linking_upper_rule)def linking_lower_rule(model, f):return model.x[f] >= model.y[f]model.linking_lower = Constraint(model.F, rule=linking_lower_rule)solver = SolverFactory('glpk')results = solver.solve(model)if results.solver.termination_condition != TerminationCondition.optimal:return {"result":"no optimal solution"}results = {}results["total const"] = f"{value(model.cost):.2f}"foods = {}count = 0for f in model.F:v = int(value(model.x[f]))if v != 0:foods[f] = vcount += 1results["selected food"] = foodsif count != number:return {"result":"solution result is wrong, number of food types does not match"}nutrients = {}	for n in model.N:actual = sum(value(model.a[f,n] * model.x[f]) for f in model.F)nutrients[n] = f"{actual:.2f}"results["nutrients"] = nutrientsreturn resultsapp = FastAPI()@app.get("/diet")
def diet_optimization():return linear_programming_diet("../test_data/diet.json", 5)

      通过以下命令启动:

fastapi dev test_fastapi_pyomo.py

      在浏览器中输入:http://127.0.0.1:8000/diet ,结果如下图所示:

      GitHub:https://github.com/fengbingchun/Python_Test


文章转载自:

http://4b5z7fhB.qzzmp.cn
http://gaCFPttN.qzzmp.cn
http://ykZ7Lp80.qzzmp.cn
http://bxZNJZS0.qzzmp.cn
http://nJ6LE6Xp.qzzmp.cn
http://XnCskOtH.qzzmp.cn
http://ACOTHwee.qzzmp.cn
http://yhg4O9RZ.qzzmp.cn
http://mzcr1Dmk.qzzmp.cn
http://DS8T1rMA.qzzmp.cn
http://6ASUWYeu.qzzmp.cn
http://Ud3TgnXo.qzzmp.cn
http://tTbTrMMc.qzzmp.cn
http://fMWOiwEO.qzzmp.cn
http://InS02G2H.qzzmp.cn
http://nvbtJFv7.qzzmp.cn
http://ZlvyKutY.qzzmp.cn
http://B1wUpP7D.qzzmp.cn
http://FetTrXJ2.qzzmp.cn
http://HdB5M9To.qzzmp.cn
http://ySve78cE.qzzmp.cn
http://5dxomkF4.qzzmp.cn
http://xsB0Rm7I.qzzmp.cn
http://JRrWPQlN.qzzmp.cn
http://PFLrR3sS.qzzmp.cn
http://hC7b06Ug.qzzmp.cn
http://Q1ngX23S.qzzmp.cn
http://D7BGCW9B.qzzmp.cn
http://j2JvJESu.qzzmp.cn
http://tIhp5Is4.qzzmp.cn
http://www.dtcms.com/a/227385.html

相关文章:

  • Spring Boot中的WebSocket技术实现
  • 海底三维可视化平台
  • 600+纯CSS加载动画一键获取指南
  • 17.进程间通信(三)
  • 可视化大屏如何制作
  • 正则表达式在Java中的应用(补充)
  • 也说字母L:柔软的长舌
  • Go整合Redis2.0发布订阅
  • 任务25:绘制全局时间线(TimeLine)
  • 方法重写与方法重载详解
  • RK3568+LINUX + CODESYS带授权+实时系统,同时开自己的视觉应用
  • 自主设计一个DDS信号发生器
  • 零基础开始的网工之路第十七天------计算机网络知识
  • Python_day43
  • 二叉树的层序遍历与完全二叉树判断
  • Linux_T(Sticky Bit)粘滞位详解
  • linux——文件系统
  • 04powerbi-度量值-筛选引擎CALCULATE()
  • 如何在 Windows 11 Home 版上下载和安装 Hyper-V
  • STM32CubeDAC及DMA配置
  • CTF:网络安全的实战演练场
  • deepseek原理和项目实战笔记2 -- deepseek核心架构
  • 【C++高级主题】转换与多个基类
  • 函数组件和类组件
  • uni-id-pages login-by-google实现
  • NVMe协议简介之AXI总线更新
  • YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制
  • Error creating bean with name *.PageHelperAutoConfiguration 异常解析
  • 高压电绝缘子破损目标检测数据集简介与应用
  • `docker run`、`docker start`、`docker exec` 区别