DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享,与你一起了解前沿科技知识!
本次DeepVisionary带来的是电工杯的详细解读:
完整内容可以在文章末尾全文免费领取&阅读!
问题1:膳食食谱的营养分析评价及调整
数学方法:线性规划模型、营养素评价模型、比较分析
可视化数据图:营养素含量表、营养素摄入量对比图、营养素缺乏情况图
问题2:基于附件3的日平衡膳食食谱的优化设计
数学方法:线性规划模型、经济性评价模型、多目标优化模型
可视化数据图:蛋白质氨基酸评分图、用餐费用对比图、营养素含量对比图
问题3:基于附件3的周平衡膳食食谱的优化设计
数学方法:线性规划模型、经济性评价模型、多目标优化模型
可视化数据图:蛋白质氨基酸评分图、用餐费用对比图、营养素含量对比图
问题一
第一个问题是膳食食谱的营养分析评价及调整。
假设附件1和附件2中的食谱分别为 x 1 x_{1} x1和 x 2 x_{2} x2,其中 x 1 i x_{1i} x1i和 x 2 i x_{2i} x2i表示每种食物的摄入量, i = 1 , 2 , . . . n i=1,2,...n i=1,2,...n,n为总食物种类数目。
假设附件4中给出的营养指标为 d 1 , d 2 , . . . , d m d_{1},d_{2},...,d_{m} d1,d2,...,dm,其中 m m m为营养指标的总数目。
则附件1和附件2的膳食营养评价可表示为:
E ( x 1 ) = [ d 1 ( x 11 + x 12 + . . . + x 1 n ) , d 2 ( x 11 + x 12 + . . . + x 1 n ) , . . . , d m ( x 11 + x 12 + . . . + x 1 n ) ] E(x_{1})=[d_{1}(x_{11}+x_{12}+...+x_{1n}),d_{2}(x_{11}+x_{12}+...+x_{1n}),...,d_{m}(x_{11}+x_{12}+...+x_{1n})] E(x1)=[d1(x11+x12+...+x1n),d2(x11+x12+...+x1n),...,dm(x11+x12+...+x1n)]
E ( x 2 ) = [ d 1 ( x 21 + x 22 + . . . + x 2 n ) , d 2 ( x 21 + x 22 + . . . + x 2 n ) , . . . , d m ( x 21 + x 22 + . . . + x 2 n ) ] E(x_{2})=[d_{1}(x_{21}+x_{22}+...+x_{2n}),d_{2}(x_{21}+x_{22}+...+x_{2n}),...,d_{m}(x_{21}+x_{22}+...+x_{2n})] E(x2)=[d1(x21+x22+...+x2n),d2(x21+x22+...+x2n),...,dm(x21+x22+...+x2n)]
其中, E ( x 1 ) E(x_{1}) E(x1)和 E ( x 2 ) E(x_{2}) E(x2)分别为附件1和附件2的营养指标向量。
根据附件3,我们可以得到每种食物的营养成分,从而得到每种食物的营养指标向量 N N N,则附件1和附件2的膳食营养评价可以改写为:
E ( x 1 ) = ∑ i = 1 n N i x 1 i E(x_{1})=\sum_{i=1}^nN_{i}x_{1i} E(x1)=i=1∑nNix1i
E ( x 2 ) = ∑ i = 1 n N i x 2 i E(x_{2})=\sum_{i=1}^nN_{i}x_{2i} E(x2)=i=1∑nNix2i
为了使得附件1和附件2的膳食营养评价更加科学合理,我们可以通过最小二乘法来调整食物的摄入量,使得 E ( x 1 ) E(x_{1}) E(x1)和 E ( x 2 ) E(x_{2}) E(x2)分别接近于给定的营养指标向量。
假设调整后的食物摄入量向量为 y 1 y_{1} y1和 y 2 y_{2} y2,则调整的目标函数可以表示为:
m i n ∣ ∣ E ( y 1 ) − E ( x 1 ) ∣ ∣ 2 2 + ∣ ∣ E ( y 2 ) − E ( x 2 ) ∣ ∣ 2 2 min||E(y_{1})-E(x_{1})||_{2}^{2}+||E(y_{2})-E(x_{2})||_{2}^{2} min∣∣E(y1)−E(x1)∣∣22+∣∣E(y2)−E(x2)∣∣22
其中, ∣ ∣ ⋅ ∣ ∣ 2 ||\cdot||_{2} ∣∣⋅∣∣2表示向量的2范数。
通过求解上述优化问题,就可以得到调整后的食物摄入量向量 y 1 y_{1} y1和 y 2 y_{2} y2,从而得到调整后的膳食食谱。
首先,对附件1和附件2的食谱进行全面的营养评价,可以计算出每种食物的能量、蛋白质、脂肪、碳水化合物、膳食纤维、维生素和矿物质的摄入量,然后与相应的参考摄入量进行对比,得出每种营养素的摄入量是否达标。同时,还可以计算出每种食物的热量密度,以及每日总的能量摄入量,从而判断是否超过或不足参考摄入量。
其次,根据附件3提供的食堂食物信息统计表,可以对附件1和附件2的食谱进行调整改进。例如,可以增加蔬菜和水果的摄入量,减少高热量、高脂肪的食物的摄入量,从而更好地满足膳食营养的需求。同时,也可以根据每种食物的价格选择更经济实惠的食物,保证在预算范围内营养摄入的均衡。
此外,还可以根据附件4中的平衡膳食基本准则,对食谱进行评价,例如每日吃早餐、合理搭配各类食物、多样化的食物选择等。最后,可以对比附件1和附件2的食谱,分析两者的差异,并提出有针对性的改进建议,以达到更科学合理的膳食营养摄入。
- 对附件1、附件2两份食谱做出全面的膳食营养评价:
根据附件4中的平衡膳食基本准则和能量及各种营养素参考摄入量,我们可以得到以下公式:
能量摄入量(千卡)= 基础代谢率(BMR) x 身高(cm) x 体重(kg) x 活动系数
其中,基础代谢率(BMR)= 66 + (13.7 x 体重(kg)) + (5 x 身高(cm)) - (6.8 x 年龄)
根据附件1和附件2中男女大学生的身高、体重和年龄数据,可计算得出基础代谢率(BMR)和能量摄入量。
接下来,根据附件3中提供的一日三餐主要食物信息统计表,我们可以得到每种食物中各种营养素的含量。根据公式:
各种营养素摄入量(克/毫克)= 食物中营养素含量(克/毫克) x 食物摄入量(克/毫升)
我们就可以计算出每日各种营养素的摄入量。
根据附件4中的指标要求,我们可以对比计算出的营养素摄入量与参考摄入量,从而评价食谱是否科学合理。如果与参考摄入量相差较大,就需要做出调整改进。
# 导入所需的库
import pandas as pd
import numpy as np
# 读取附件1和附件2中的数据
df_male = pd.read_excel('附件1.xlsx')
df_female = pd.read_excel('附件2.xlsx')
# 创建函数来计算每种营养素的摄入量
def nutrient_intake(df):
# 计算能量
energy = df['能量'].sum()
# 计算蛋白质
protein = df['蛋白质'].sum()
# 计算脂肪
fat = df['脂肪'].sum()
# 计算碳水化合物
carbohydrate = df['碳水化合物'].sum()
# 计算膳食纤维
fiber = df['膳食纤维'].sum()
# 计算维生素A
vitamin_a = df['维生素A'].sum()
# 计算维生素C
vitamin_c = df['维生素C'].sum()
# 计算维生素E
vitamin_e = df['维生素E'].sum()
# 计算钙
calcium = df['钙'].sum()
# 计算铁
iron = df['铁'].sum()
# 计算镁
magnesium = df['镁'].sum()
# 计算钾
potassium = df['钾'].sum()
# 计算钠
sodium = df['钠'].sum()
# 计算锌
zinc = df['锌'].sum()
# 计算铜
copper = df['铜'].sum()
# 计算锰
manganese = df['锰'].sum()
# 计算硒
selenium = df['硒'].sum()
# 计算碘
iodine = df['碘'].sum()
# 返回每种营养素的摄入量
return energy, protein, fat, carbohydrate, fiber, vitamin_a, vitamin_c, vitamin_e, calcium, iron, magnesium, potassium, sodium, zinc, copper, manganese, selenium, iodine
# 计算附件1中男大学生的营养素摄入量
male_energy, male_protein, male_fat, male_carbohydrate, male_fiber, male_vitamin_a, male_vitamin_c, male_vitamin_e, male_calcium, male_iron, male_magnesium, male_potassium, male_sodium, male_zinc, male_copper, male_manganese, male_selenium, male_iodine = nutrient_intake(df_male)
# 计算附件2中女大学生的营养素摄入量
female_energy, female_protein, female_fat, female_carbohydrate, female_fiber, female_vitamin_a, female_vitamin_c, female_vitamin_e, female_calcium, female_iron, female_magnesium, female_potassium, female_sodium, female_zinc, female_copper, female_manganese, female_selenium, female_iodine = nutrient_intake(df_female)
# 打印男大学生的营养素摄入量
print("男大学生的营养素摄入量为:")
print("能量:{}千卡".format(male_energy))
print("蛋白质:{}克".format(male_protein))
print("脂肪:{}克".format(male_fat))
print("碳水化合物:{}克".format(male_carbohydrate))
print("膳食纤维:{}克".format(male_fiber))
print("维生素A:{}毫克".format(male_vitamin_a))
print("维生素C:{}毫克".format(male_vitamin_c))
print("维生素E:{}毫克".format(male_vitamin_e))
print("钙:{}毫克".format(male_calcium))
print("铁:{}毫克".format(male_iron))
print("镁:{}毫克".format(male_magnesium))
print("钾:{}毫克".format(male_potassium))
print("钠:{}毫克".format(male_sodium))
print("锌:{}毫克".format(male_zinc))
print("铜:{}毫克".format(male_copper))
print("锰:{}毫克".format(male_manganese))
print("硒:{}毫克".format(male_selenium))
print("碘:{}毫克".format(male_iodine))
# 打印女大学生的营养素摄入量
print("女大学生的营养素摄入量为:")
print("能量:{}千卡".format(female_energy))
print("蛋白质:{}克".format(female_protein))
print("脂肪:{}克".format(female_fat))
print("碳水化合物:{}克".format(female_carbohydrate))
print("膳食纤维:{}克".format(female_fiber))
print("维生素A:{}毫克".format(female_vitamin_a))
print("维生素C:{}毫克".format(female_vitamin_c))
print("维生素E:{}毫克".format(female_vitamin_e))
print("钙:{}毫克".format(female_calcium))
print("铁:{}毫克".format(female_iron))
print("镁:{}毫克".format(female_magnesium))
print("钾:{}毫克".format(female_potassium))
print("钠:{}毫克".format(female_sodium))
print("锌:{}毫克".format(female_zinc))
print("铜:{}毫克".format(female_copper))
print("锰:{}毫克".format(female_manganese))
print("硒:{}毫克".format(female_selenium))
print("碘:{}毫克".format(female_iodine))
# 读取附件3中的数据
df_dining_hall = pd.read_excel('附件3.xlsx')
# 创建函数来计算每种营养素的摄入量
def nutrient_intake_dining_hall(df):
# 计算能量
energy = df['能量'].sum()
# 计算蛋白质
protein = df['蛋白质'].sum()
# 计算脂肪
fat = df['脂肪'].sum()
# 计算碳水化合物
carbohydrate = df['碳水化合物'].sum()
# 计算膳食纤维
fiber = df['膳食纤维'].sum()
# 计算维生素A
vitamin_a = df['维生素A'].sum()
# 计算维生素C
vitamin_c = df['维生素C'].sum()
# 计算维生素E
vitamin_e = df['维生素E'].sum()
# 计算钙
calcium = df['钙'].sum()
# 计算铁
iron = df['铁'].sum()
# 计算镁
magnesium = df['镁'].sum()
# 计算钾
potassium = df['钾'].sum()
# 计算钠
sodium = df['钠'].sum()
# 计算锌
zinc = df['锌'].sum()
# 计算铜
copper = df['铜'].sum()
# 计算锰
manganese = df['锰'].sum()
# 计算硒
selenium = df['硒'].sum()
# 计算碘
iodine = df['碘'].sum()
# 返回每种营养素的摄入量
return energy, protein, fat, carbohydrate, fiber, vitamin_a, vitamin_c, vitamin_e, calcium, iron, magnesium, potassium, sodium, zinc, copper, manganese, selenium, iodine
# 计算食堂一日三餐的营养素摄入量
dining_hall_energy, dining_hall_protein, dining_hall_fat, dining_hall_carbohydrate, dining_hall_fiber, dining_hall_vitamin_a, dining_hall_vitamin_c, dining_hall_vitamin_e, dining_hall_calcium, dining_hall_iron, dining_hall_magnesium, dining_hall_potassium, dining_hall_sodium, dining_hall_zinc, dining_hall_copper, dining_hall_manganese, dining_hall_selenium, dining_hall_iodine = nutrient_intake_dining_hall(df_dining_hall)
# 打印食堂一日三餐的营养素摄入量
print("食堂一日三餐的营养素摄入量为:")
print("能量:{}千卡".format(dining_hall_energy))
print("蛋白质:{}克".format(dining_hall_protein))
print("脂肪:{}克".format(dining_hall_fat))
print("碳水化合物:{}克".format(dining_hall_carbohydrate))
print("膳食纤维:{}克".format(dining_hall_fiber))
print("维生素A:{}毫克".format(dining_hall_vitamin_a))
print("维生素C:{}毫克".format(dining_hall_vitamin_c))
print("维生素E:{}毫克".format(dining_hall_vitamin_e))
print("钙:{}毫克".format(dining_hall_calcium))
print("铁:{}毫克".format(dining_hall_iron))
print("镁:{}毫克".format(dining_hall_magnesium))
print("钾:{}毫克".format(dining_hall_potassium))
print("钠:{}毫克".format(dining_hall_sodium))
print("锌:{}毫克".format(dining_hall_zinc))
print("铜:{}毫克".format(dining_hall_copper))
print("锰:{}毫克".format(dining_hall_manganese))
print("硒:{}毫克".format(dining_hall_selenium))
print("碘:{}毫克".format(dining_hall_iodine))
# 创建函数来计算每种营养素的百分比
def nutrient_percentage(df, total):
# 计算能量百分比
energy_percentage = df['能量'].sum() / total['能量'].sum() * 100
# 计算蛋白质百分比
protein_percentage = df['蛋白质'].sum() / total['蛋白质'].sum() * 100
问题二
第二个问题是基于附件3的日平衡膳食食谱的优化设计。
问题2.基于附件3的日平衡膳食食谱的优化设计
1)以蛋白质氨基酸评分最大为目标建立优化模型,分别设计男生和女生的日食谱,并对日食谱进行膳食营养评价;
优化目标:
M a x i m i z e ∑ i ∑ j x i j P i j \begin{equation} Maximize \quad \sum_{i}^{} \sum_{j}^{} x_{ij}P_{ij} \end{equation} Maximizei∑j∑xijPij
约束条件:
∑ i ∑ j x i j Q i j ≥ E m i n ∑ i ∑ j x i j Q i j ≤ E m a x ∑ i ∑ j x i j F i j ≥ F m i n ∑ i ∑ j x i j F i j ≤ F m a x ∑ i ∑ j x i j C i j ≤ C m a x x i j ∈ Z + \begin{align} &\sum_{i}^{} \sum_{j}^{} x_{ij}Q_{ij} \geq E_{min} \tag{2-1}\\ &\sum_{i}^{} \sum_{j}^{} x_{ij}Q_{ij} \leq E_{max} \tag{2-2}\\ &\sum_{i}^{} \sum_{j}^{} x_{ij}F_{ij} \geq F_{min} \tag{2-3}\\ &\sum_{i}^{} \sum_{j}^{} x_{ij}F_{ij} \leq F_{max} \tag{2-4}\\ &\sum_{i}^{} \sum_{j}^{} x_{ij}C_{ij} \leq C_{max} \tag{2-5}\\ &x_{ij} \in \mathbb{Z}^+ \tag{2-6} \end{align}