2024年 电工杯 (B题)大学生数学建模挑战赛 | 大学生平衡膳食食谱的优化设计 | 数学建模完整代码解析

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=1nNix1i
E ( x 2 ) = ∑ i = 1 n N i x 2 i E(x_{2})=\sum_{i=1}^nN_{i}x_{2i} E(x2)=i=1nNix2i
为了使得附件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. 对附件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} MaximizeijxijPij

约束条件:
∑ 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}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值