【全部更新完毕】2024电工杯B题详细思路代码成品文章教学:大学生平衡膳食食谱的优化设计及评价

大学生平衡膳食食谱的优化设计及评价
摘要
大学阶段是学生获取知识和身体发育的关键时期,也是形成良好饮食习惯的重要阶段。然而,当前大学生中存在饮食结构不合理和不良饮食习惯的问题,主要表现为不吃早餐或早餐吃得马虎,经常食用高油高盐且营养不均衡的外卖和快餐,以及通过不科学的节食减肥,导致营养不良和健康受损。因此,大学生在这一阶段掌握营养知识并形成良好饮食习惯,对于促进生长发育和维护身体健康具有重要意义。

在本文中,针对给出的一份男大学生以及女大学生的食谱,本文从产能营养素、非产能营养素以及蛋白质氨基酸评分入手,分别计算了两个食谱对应的产能营养素、非产能营养素以及蛋白质氨基酸评分并与参考的摄入量进行对比,随后构建了TOPSIS评价模型,对产能营养素、非产能营养素以及蛋白质氨基酸评分三项指标赋予适当的权重,以参考的摄入量作为最优值对给定食谱进行评价,最后根据评价结果,我们对食谱进行一定的调整,分别为男大的食谱中减去了一个炸鸡块以及为女大食谱加上了两份米饭。

对于问题二三来说,我们综合进行考虑。首先针对氨基酸评分最大化这个目标,我们结合实际情况构建了相关的约束条件,分别包含每餐的热量摄入占比,每天的微量元素(非产能营养素)摄入情况、AAS等进行约束,随后分别采用PSO粒子群优化算法以及遗传算法对目标进行优化。最后取得不错的结果。在此基础上,分别考虑了最经济型食谱以及兼顾经济以及氨基酸评分两点作为目标的情况,同样结果不错。最后我们进一步考虑整周的食谱,考虑菜品尽可能不重复,并将其量化成约束条件,进一步给出三个优化目标下优化函数最优的食谱。

关键词:TOPSIS评价模型、遗传算法、PSO粒子群优化算法、整数规划

在这里插入图片描述

在这一小节中,我们需要对给出的附件数据进行数据预处理,以方便我们后续的模型构建。
观察到给出的附件1-3的数据文件是在同一个sheet下的多个表格,这不利于python对其进行读取以及后续操作,因此本文中,根据早餐、午餐以及晚餐三餐,将其划分成3个sheet,保存在新的excel文件中。

这样之后,我们就可以比较容易的提取出男大学生以及女大学生的三餐食谱,分别是:
男大学生:{‘早餐’: [‘小米粥’, ‘油条’, ‘煎鸡蛋’, ‘拌海带丝’],
‘午餐’: [‘大米饭’, ‘拌木耳’, ‘地三鲜’, ‘红烧肉’],
‘晚餐’: [‘砂锅面’, ‘包子’, ‘炸鸡块’]}
女大学生:{‘早餐’: [‘豆浆’, ‘鸡排面’],
‘午餐’: [‘鸡蛋饼’, ‘水饺’, ‘葡萄’],
‘晚餐’: [‘大米饭’, ‘香菇炒油菜’, ‘炒肉蒜台’, ‘茄汁沙丁鱼’, ‘苹果’]}
为了进一步计算两份食谱中的营养素等含量,我们需要对比《中国食物成分表》,从中查询了学校提供食物中包含的所有主要成分的食材对应的营养成分,统计成一个表格,下面将展示部分数据:

5.1.1营养分析评价模型
在收集好相关的膳食营养成分数据之后,下面我们需要对膳食食谱进行全面的营养分析评价,我们将按照以下步骤进行:

  1. 食物结构分析:分析食谱中食物的种类和数量,确保食物种类多样化。对于这一步我们已经在上一小节中提取出了男女两位大学生的一日食谱。
  2. 营养素含量计算:计算每种食物的营养素含量,包括热量、蛋白质、脂肪和碳水化合物。
  3. 能量及营养素评估:将计算出的营养素摄入量与推荐摄入量进行比较,评价摄入量是否符合推荐标准。
  4. 无产营养素以及AAS计算:计算每种食物的营养素含量,包括钙、铁、锌、以及各类维生素含量。随后根据给出的蛋白质氨基酸含量,进一步计算AAS。
  5. TOPSIS综合评价模型:根据计算得到的营养素含量、无产营养素以及AAS,结合推荐的每日营养素摄入量对给出的食谱进行评价。

5.1.2 模型公式

  1. 营养素含量计算公式
    对于每种食物i,其营养素 j的含量可以表示为:

    其中:
    表示食物 中营养素 的含量。
    表示食物 i 每100克中营养素 j 的含量。
    表示食物 i 的可食部重量(克)。

  2. 总营养素含量计算公式
    一日三餐的总营养素含量为所有食物营养素含量的总和:

在这里插入图片描述

5.2 问题二建模与求解

问题二包括三个优化目标:用餐费用最经济、最大化蛋白质氨基酸评分和兼顾蛋白质氨基酸评分及经济性。下面我们将详细描述每个优化目标的建模过程及数据处理步骤。

优化目标一:用餐费用最经济

  1. 数据准备:
    食物数据:包括食物名称、主要成分、价格、热量、蛋白质、脂肪、碳水化合物和蛋白质氨基酸评分(AAS)。

  2. 决策变量:
    X ij : 第 i 天第 j 种食物的份数,其中 i = 1, 2, …, j 是食物种类索引。

  3. 目标函数:

    • 最小化总费用:

    其中, c_j 是第 j 种食物的价格,N 是食物种类总数。

  4. 约束条件:

    • 每天的热量需求:

    其中, e_j 是第 j 种食物的热量。

    • 每天的蛋白质需求:

    其中, p_j 是第 j 种食物的蛋白质含量。

    • 每天的脂肪需求:

    其中, f_j 是第 j 种食物的脂肪含量。

    • 每天的碳水化合物需求:

    其中, c_j 是第 j 种食物的碳水化合物含量。

    • 每天的食物份数限制:

    • 食物份数非负:

优化目标二:最大化蛋白质氨基酸评分

  1. 数据准备:

    • 同优化目标一的数据准备步骤。
  2. 决策变量:
    x_ij : 第 i 天第 j 种食物的份数,其中 i = 1, 2, …, j 是食物种类索引。

  3. 目标函数:

    • 最大化总蛋白质氨基酸评分:

其中, aas_j 是第 j 种食物的蛋白质氨基酸评分。

  1. 约束条件:同优化目标一的约束条件。

优化目标三:兼顾蛋白质氨基酸评分及经济性

在这里插入图片描述

核心代码:

# 定义评估函数以最小化费用
def evaluate_cost(individual):x_morning = individual[:len(foods_morning_grouped)]x_lunch = individual[len(foods_morning_grouped):len(foods_morning_grouped)+len(foods_lunch_grouped)]x_dinner = individual[len(foods_morning_grouped)+len(foods_lunch_grouped):]total_cost = np.dot(x_morning, foods_morning_grouped['价格\n(元/份)'].values) + np.dot(x_lunch, foods_lunch_grouped['价格\n(元/份)'].values) + np.dot(x_dinner, foods_dinner_grouped['价格\n(元/份)'].values)total_energy = np.dot(x_morning, foods_morning_grouped['热量 (kcal)'].values) + np.dot(x_lunch, foods_lunch_grouped['热量 (kcal)'].values) + np.dot(x_dinner, foods_dinner_grouped['热量 (kcal)'].values)total_protein = np.dot(x_morning, foods_morning_grouped['蛋白质 (g)'].values) + np.dot(x_lunch, foods_lunch_grouped['蛋白质 (g)'].values) + np.dot(x_dinner, foods_dinner_grouped['蛋白质 (g)'].values)total_fat = np.dot(x_morning, foods_morning_grouped['脂肪 (g)'].values) + np.dot(x_lunch, foods_lunch_grouped['脂肪 (g)'].values) + np.dot(x_dinner, foods_dinner_grouped['脂肪 (g)'].values)total_carb = np.dot(x_morning, foods_morning_grouped['碳水化合物 (g)'].values) + np.dot(x_lunch, foods_lunch_grouped['碳水化合物 (g)'].values) + np.dot(x_dinner, foods_dinner_grouped['碳水化合物 (g)'].values)total_servings = np.sum(individual)penalty = 0if total_energy > 4000:penalty += (total_energy - 4000) * 10if total_energy < 2400:penalty += (2400 - total_energy) * 10if total_protein < 60:penalty += (60 - total_protein) * 10if total_fat < 53:penalty += (53 - total_fat) * 10if total_carb < 300:penalty += (300 - total_carb) * 10if total_servings > 25:penalty += (total_servings - 25) * 10return total_cost + penalty,toolbox.register("evaluate", evaluate_cost)

在这里插入图片描述

问题三核心代码:

# 删除已存在的类
if hasattr(creator, "FitnessMin"):del creator.FitnessMin
if hasattr(creator, "Individual"):del creator.Individual# 创建最小化问题的fitness function
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))# 创建个体和种群
creator.create("Individual", list, fitness=creator.FitnessMin)toolbox = base.Toolbox()# 定义个体生成函数,生成整数列表,表示每种食物的份数
toolbox.register("attr_int", random.randint, 0, 10)
toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_int, n=len(foods_grouped) * 7)# 定义种群生成函数
toolbox.register("population", tools.initRepeat, list, toolbox.individual)# 注册选择函数
toolbox.register("select", tools.selTournament, tournsize=3)# 注册交叉和变异函数
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutUniformInt, low=0, up=10, indpb=0.2)# 评估函数:兼顾蛋白质氨基酸评分及经济性
def evaluate_weekly_combined(individual):total_cost = 0total_aas = 0penalty = 0unique_meals = set()for day in range(7):x_day = individual[day*len(foods_grouped):(day+1)*len(foods_grouped)]x_morning = x_day[:len(foods_morning_grouped)]x_lunch = x_day[len(foods_morning_grouped):len(foods_morning_grouped)+len(foods_lunch_grouped)]x_dinner = x_day[len(foods_morning_grouped)+len(foods_lunch_grouped):]day_cost = np.dot(x_morning, foods_morning_grouped['价格\n(元/份)'].values) + \np.dot(x_lunch, foods_lunch_grouped['价格\n(元/份)'].values) + \np.dot(x_dinner, foods_dinner_grouped['价格\n(元/份)'].values)total_cost += day_costday_aas = np.dot(x_morning, foods_morning_grouped['AAS'].values) + \np.dot(x_lunch, foods_lunch_grouped['AAS'].values) + \np.dot(x_dinner, foods_dinner_grouped['AAS'].values)total_aas += day_aasday_energy = np.dot(x_morning, foods_morning_grouped['热量 (kcal)'].values) + \np.dot(x_lunch, foods_lunch_grouped['热量 (kcal)'].values) + \np.dot(x_dinner, foods_dinner_grouped['热量 (kcal)'].values)day_protein = np.dot(x_morning, foods_morning_grouped['蛋白质 (g)'].values) + \np.dot(x_lunch, foods_lunch_grouped['蛋白质 (g)'].values) + \np.dot(x_dinner, foods_dinner_grouped['蛋白质 (g)'].values)day_fat = np.dot(x_morning, foods_morning_grouped['脂肪 (g)'].values) + \np.dot(x_lunch, foods_lunch_grouped['脂肪 (g)'].values) + \np.dot(x_dinner, foods_dinner_grouped['脂肪 (g)'].values)day_carb = np.dot(x_morning, foods_morning_grouped['碳水化合物 (g)'].values) + \np.dot(x_lunch, foods_lunch_grouped['碳水化合物 (g)'].values) + \np.dot(x_dinner, foods_dinner_grouped['碳水化合物 (g)'].values)day_servings = np.sum(x_day)# 计算不重复食谱的惩罚day_meal = tuple(x_day)if day_meal in unique_meals:penalty += 1000  # 对重复食谱进行高惩罚else:unique_meals.add(day_meal)if day_energy > 4000:penalty += (day_energy - 4000) * 10if day_energy < 2400:penalty += (2400 - day_energy) * 10if day_protein < 60:penalty += (60 - day_protein) * 10if day_fat < 53:penalty += (53 - day_fat) * 10if day_carb < 300:penalty += (300 - day_carb) * 10if day_servings > 25:penalty += (day_servings - 25) * 10return total_cost - total_aas + penalty,toolbox.register("evaluate", evaluate_weekly_combined)# 设置遗传算法的参数
population = toolbox.population(n=1000)  # 种群大小
ngen = 3000  # 迭代次数
cxpb = 0.7  # 交叉概率
mutpb = 0.2  # 变异概率# 运行遗传算法
algorithms.eaSimple(population, toolbox, cxpb, mutpb, ngen, stats=None, halloffame=None, verbose=True)# 获取最优解
best_individual = tools.selBest(population, k=1)[0]print("最优解:", best_individual)
print("最优值:", toolbox.evaluate(best_individual))
## 2024电工杯助攻详情
## docs.qq.com/doc/DVWRIQUlKaVNqcWFr

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

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

相关文章

宝塔面板修改端口后无法登入

今天通过宝塔面板登录腾讯云主机&#xff0c;看到下面的提醒&#xff0c;顺便点进去随便改了个端口 本以为改端口是很简单事情&#xff0c;结果我改完之后面板立马登不上了&#xff0c;接下来我改了登录地址和端口也不行&#xff0c;我以为是防火墙的问题&#xff0c;增加了防火…

ViT:1 从DETR说起

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提供了大模型领域最新技…

Pycharm在下载安装第三方库时速度慢或超时问题 / 切换国内镜像地址

pycharm下载第三方库速度极慢&#xff0c;搜索了一下&#xff0c;发现方法非常乱&#xff0c;稍作整理。这个问题一般都会出现&#xff0c;在我们开发中遇到的常见问题&#xff0c;根据以下解决方法&#xff0c;基本可以解决&#xff0c;但是不能100%保证 Installing packages …

打造一个增强版Kimi:可以生成图片、PPT、PDF文档、数据分析等

Kimi虽然在国内AI大模型中表现不错&#xff0c;但是和ChatGPT还是差不少功能。现在有一个很简单的方法&#xff0c;把kimi功能增强&#xff0c;使用效果大大改善&#xff0c;比如生成图片&#xff1a; 具体方法如下&#xff1a; 打开coze网站&#xff1a;https://www.coze.cn/…

C++容器之位集(std::bitset)

目录 1 概述2 使用实例3 接口使用3.1 constructor3.2 count_and_size3.3 test3.4 any3.5 none3.6 all3.7 set3.8 reset3.9 filp3.10 to_string3.11 to_ulong3.12 to_ullong3.13 operators1 概述 位集存储位(只有两个可能值的元素:0或1,true或false,…)。   该类模拟bool…

推荐一款自助分析的财务分析软件:奥威BI软件

奥威BI软件是一款支持多维度动态自助分析的软件&#xff0c;预设了智能财务分析方案&#xff0c;提供内存行列计算模型解决财务指标计算难题&#xff0c;界面简洁&#xff0c;以点击、拖曳操作为主&#xff0c;十分适合没有IT背景的财务人做财务分析。因此也经常有人说奥威BI软…

Spark搭建 Standalone模式详细步骤

Standalone模式概述&#xff1a; Standalone模式是Spark自带的一种集群模式&#xff08;本地集群&#xff0c;不依赖与外部集群&#xff0c;比如Yarn&#xff09;&#xff0c;可以真实地在多个机器之间搭建Spark集群的环境。 Standalone是完整的Spark运行环境,其中: Master角…

OpenFeign微服务调用组件使用

前言&#xff1a;OpenFeign是可以跨服务、跨进程的调用方式。 什么是Feign Feign是Netflix开发的声明式、模版化的HTTP客户端。 优势: Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验&#xff0c;开发者完全感知不到这是远程方法&#xff0c;更感知不到这…

【TB作品】stm32单片机读取DS2401程序

DS2401是由Analog Devices公司生产的一种硅序列号芯片&#xff0c;它提供了一个绝对唯一的64位ROM识别码&#xff0c;用于确保可追溯性。以下是对DS2401器件的分析&#xff1a; 特点和优势&#xff1a; 唯一性&#xff1a;每个DS2401芯片都有一个独一无二的64位注册码&#x…

[less配置]vue2引入less

1、终端输入&#xff1a;npm install less less-loader --save-dev 2、在package.json查看是否安装less依赖 3、调用

vue2快速安装环境,从0-1创建vue2项目教程

vue2快速安装环境&#xff0c;从0-1创建vue2项目教程(windows) 一、node下载 1.如何查看node版本和npm版本 二、npm安装脚手架 1.注意事项 三、vue2选项解读 四、运行脚手架 一、node下载 1、(node.js中文网) 下载长期稳定版本就行 解释下node.js和npm的关系? 想象你在…

原始字面常量(C++11)

原始字面常量&#xff08;C11&#xff09; 文章目录 原始字面常量&#xff08;C11&#xff09;前言一、原始字面量二、代码示例总结 前言 字面量一般是指数值&#xff08;12、454等&#xff09;和字符串&#xff08;“Hw”、“h\t”&#xff09;&#xff0c;但是有时候我们想表…

PyTorch安装与配置

前言 参考文档&#xff1a;https://github.com/TingsongYu/PyTorch-Tutorial-2nd 环境配置之Anaconda 解释器——python.exe&#xff0c;是人类与CPU之间的桥梁&#xff0c;需要配置系统环境变量 Anaconda&#xff1a;集成环境&#xff0c;包管理器 Conda 安装 Anaconda&am…

WXSS模板样式-全局样式和局部样式

一、WXSS 1.WXSS WXSS(WeiXin Style Sheets)是一套样式语言&#xff0c;用于美化WXML的组件样式&#xff0c;类似于网页开发中的CSS 2.WXSS和CSS的关系 WXSS具有CSS大部分特性&#xff0c;同时&#xff0c;WXSS还对CSS进行了扩充以及修改&#xff0c;以适应微信小程序的开发…

CSDN 自动评论互动脚本

声明 该脚本的目的只是为了提升博客创作效率和博主互动效率&#xff0c;希望大家还是要尊重各位博主的劳动成果。 数据库设计 尽量我们要新建一个数据库csdn_article&#xff0c;再在其中建一个数据表article -- csdn_article-- article-- 需要进行自动评论的表格信息...CR…

ClickHouse 24.4 版本发布说明

本文字数&#xff1a;13148&#xff1b;估计阅读时间&#xff1a;33 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布&#xff01; 发布概要 本次ClickHouse 24.4版本包含了13个新功能&#x1f381;…

ML307R OpenCPU DEMO_SDK环境搭建

一、工程目录 二、环境搭建 三、编译 四、下载 五、添加自定义文件打印 hello 一、工程目录 OpenCPU SDK代码目录结构&#xff0c;如下图所示&#xff1a; | 名称 | 描述 | | ---------------- | --------------------------| | custom …

软件设计师中级

计算机系统 运算器和控制器 算术逻辑单元 累加寄存器器 状态寄存器 数据缓冲寄存器 指令寄存器 程序计数器 地址寄存器 指令译码器 内存按字节编址 内存存储单元16位 1 浮点数 浮点数范围&#xff1a;-2的(2的阶码次)-1到-2的(2的阶码次)-1 乘 1-2负尾数次 海明码 海明码&…

自定义一个SpringBoot场景启动器

前言 一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章&#xff0c;如有大神发现错误&#xff0c;敬请斧正&#xff0c;不胜感激。 分析SpringBoot自动配置原理 SpringBoot的启动从被SpringBootApplication修饰的启动类开始,SpringBootApplicaiotn注解中最…

C语言 宏

目录 一、宏定义 1.1 预定义符号 1.2 预处理指令 #define 1.3 带有副作用宏定义 1.4 宏和函数的一个对比 ​编辑 1.5 #undef 二、条件编译 2.1 #if、#else、#elif、#endif 2.2 #ifdef和#ifndef 2.3 C语言中如何通过条件编译来预防头文件的重复包含&#xff1f; 一、宏定义 在C语…