2025年电工杯数学建模竞赛B题高质量建模过程(点赞收藏下,后续会更新)

现分享2024年电工杯数学建模竞赛B题,供大家学习

第一个问题是膳食食谱的营养分析评价及调整。

设男生和女生的一日食谱分别为 X m X f ,其中 X m =( x m 1 , x m 2 ,..., x m n ) , X f =( x f 1 , x f 2 ,..., x f n ) , n 为食物种类数目。

1)对两份食谱做出全面的膳食营养评价:

假设每一种食物中含有的各种营养素的含量已知,分别为 N m 1 , N m 2 ,..., N m n N f 1 , N f 2 ,..., N f n ,其中 N m i

N f i 表示男生和女生食谱中第 i 种食物中含有的营养素总量。则男生和女生食谱的总营养素含量分别为:

$$N_m=\sum_{i=1}^n N_{mi}x_{mi}$$

$$N_f=\sum_{i=1}^n N_{fi}x_{fi}$$

根据平衡膳食基本准则,男生和女生每日能量的实际摄入量应与目标相差在±10%之内,即:

0.9 N 0 ≤ N m ≤1.1 N 0

0.9 N 0 ≤ N f ≤1.1 N 0

其中 N 0 为每日能量目标。

同时,根据营养素参考摄入量的要求,男生和女生每日各种营养素的摄入量应满足以下条件:

R m 1 ≤ N m R m 2

R f 1 ≤ N f R f 2

其中 R m i R f i 分别为男生和女生各种营养素的参考摄入量。

综上所述,对两份食谱进行全面的膳食营养评价,需要求解以下优化问题:

max X m N m

max X f N f

满足以下约束条件:

0.9 N 0 ≤ N m ≤1.1 N 0

0.9 N 0 ≤ N f ≤1.1 N 0

R m 1 ≤ N m R m 2

R f 1 ≤ N f R f 2

x m i , x f i ≥0,( i =1,2,..., n )

2)对两份食谱进行较少的调整改进,并且再做出全面的膳食营养评价:

在第一个问题的基础上,假设现在要对男生和女生的食谱进行少量调整改进,即分别增加或减少某些食物的摄入量,记为 X

m X f ,其中 X m =( x m 1 , x m 2 ,..., x m n ) , X f =( x f 1 , x f 2 ,..., x f n ) 。

则对食谱进行少量调整改进的优化问题为:

满足以下约束条件:

 

max X m N m

max X f N f

0.9 N 0 ≤ N m ≤1.1 N 0

0.9 N 0 ≤ N f ≤1.1 N 0

R m 1 ≤ N m R m 2

R f 1 ≤ N f R f 2

x m i , x f i ≥0,( i =1,2,..., n )

再对调整后的食谱进行全面的膳食营养评价即可。

对于两份食谱,我们可以分别计算出其能量及各种营养素的实际摄入量,与参考摄入量进行比较,以此评价其营养结构的合   理性。同时,可以根据每餐的能量分配比例,评价餐次比是否符合要求。若发现营养素摄入不足或超标,可以对食谱进行适   当调整,例如增加或减少某些食物的摄入量,或者选择其他食物替代。调整后再次对食谱进行营养评价,直到符合营养需求   标准为止。

此外,除了营养结构的评价,还需要注意食谱中是否存在不良的饮食习惯,例如早餐不吃或吃得不够充分、经常食用外卖   等。针对这些问题,可以提出相应的建议,例如增加早餐的摄入量,减少外卖的消费频率等。

总的来说,膳食食谱的营养分析评价需要综合考虑能量及各种营养素的摄入量、餐次比、饮食习惯等因素,通过适当调整来   达到营养平衡的目标。同时,也需要提供个性化的建议,帮助个人形成健康的饮食习惯。

1)对两份食谱做出全面的膳食营养评价:

首先,根据男生和女生的食谱记录,计算出每种食物的营养成分(如能量、蛋白质、脂肪、碳水化合物等)和每餐的总能量   摄入量。然后,根据每日能量摄入量和每餐的能量摄入量目标,计算出实际摄入量与目标摄入量的差值,判断是否符合“男、女生每日能量实际摄入量与摄入量目标相差在±10%之内”的基本要求。

接下来,根据男生和女生的食谱,计算出蛋白质、脂肪、碳水化合物等营养素的摄入量占总能量的百分比,判断是否符合   “产能营养素占总能量百分比尽量满足蛋白质10%-15%、脂肪20%-30%、碳水化合物50%-65%”的基本要求。

然后,根据男生和女生的食谱,计算出钙、铁、锌、维生素A、维生素B1、维生素B2、维生素C的实际摄入量,与参考摄入   量进行比较,判断是否符合“非产能主要营养素钙、铁、锌、维生素A、维生素B1、维生素B2、维生素C的实际摄入量尽可   能接近参考摄入量”的基本要求。

最后,根据每餐的能量摄入量,计算出早餐、午餐、晚餐的比例,判断是否符合“餐次比尽可能满足早餐25%-35%,中   餐、晚餐各30%-40%”的基本要求。

2)对两份食谱进行较少的调整改进,并且再做出全面的膳食营养评价:

首先,根据前面的评价结果,确定哪些营养素摄入不足或超过目标。然后,根据食物的营养成分,进行调整改进,使得每餐   的营养素摄入量符合目标要求。

例如,如果发现男生的蛋白质摄入量偏低,可以增加一些高蛋白的食物,如鸡蛋、牛奶等;如果女生的脂肪摄入量偏高,可   以减少一些含脂肪较多的食物,如肉类、油炸食品等。

调整后,再次进行全面的膳食营养评价,判断是否符合各项指标要求。

3)数学公式:

(1)男生和女生每餐的能量摄入量目标:

男生:早餐:270 375千卡;午餐:270 375千卡;晚餐:300~400千卡。女生:早餐:200 280千卡;午餐:200 280千卡;晚餐:225~300千卡。

(2)蛋白质、脂肪、碳水化合物等营养素摄入量占总能量的百分比目标: 蛋白质:男生:10%-15%;女生:10%-15%。

脂肪:男生:20%-30%;女生:20%-30%。

碳水化合物:男生:50%-65%;女生:50%-65%。

(3)非产能主要营养素参考摄入量:

钙:男生:1000毫克;女生:800毫克。铁:男生:8毫克;女生:18毫克。

锌:男生:11毫克;女生:8毫克。

维生素A:男生:900微克;女生:700微克。维生素B1:男生:1.2毫克;女生:1.1毫克。维生素B2:男生:1.3毫克;女生:1.1毫克。维生素C:男生:100毫克;女生:100毫克。

import pandas as pd import numpy as np

def nutrient_calculation(meal):

# 计算每餐的总能量和主要营养素总量

energy = meal['可食部(克/份)'].mul(meal['食用份数']).sum()

protein = meal['主要成分'].loc[meal['主要成分'].isin(['鸡蛋', '鸡肉', '猪肉', '豆腐', '火腿肠', '鸡排面'])].mul(meal['可食部(克/份)']).mul(m

fat = meal['主要成分'].loc[meal['主要成分'].isin(['豆油', '芝麻油', '葡萄', '油菜', '沙丁鱼'])].mul(meal['可食部(克/份)']).mul(meal['食用份

carbohydrate = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '油条', '米饭', '', '土豆', '酸菜', '苹果'])].mul(meal['可食部(克/份)']).

calcium = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '豆浆', '鸡蛋饼', '米饭', '油菜', '茄子', '沙丁鱼'])].mul(meal['可食部(克/份)']).

iron = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '鸡排面', '木耳', '茄子', '苹果'])].mul(meal['可食部(克/份)']).mul(meal['食用份数

zinc = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '茄子', '土豆', '沙丁鱼'])].mul(meal['可食部(克/份)']).mul(meal['食用份数']).sum

vitamin_a  = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '火腿肠', '油菜', '沙丁鱼'])].mul(meal['可食部(克/份)']).mul(meal['食用份

vitamin_b1 = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '鸡肉', '火腿肠', '红烧肉', '葡萄'])].mul(meal['可食部(克/份)']).mul(meal

vitamin_b2 = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '鸡蛋', '茄子', '沙丁鱼'])].mul(meal['可食部(克/份)']).mul(meal['食用份

vitamin_c = meal['主要成分'].loc[meal['主要成分'].isin(['小米', '火腿肠', '苹果'])].mul(meal['可食部(克/份)']).mul(meal['食用份数']).sum

# 计算每餐的各项营养素百分比protein_percentage = protein / energy fat_percentage = fat / energy

carbohydrate_percentage = carbohydrate / energy calcium_percentage = calcium / energy iron_percentage = iron / energy

zinc_percentage = zinc / energy vitamin_a_percentage = vitamin_a / energy vitamin_b1_percentage = vitamin_b1 / energy vitamin_b2_percentage = vitamin_b2 / energy vitamin_c_percentage = vitamin_c / energy

# 构建字典,用于存储每餐的营养素总量和百分比

nutrient_dict = {'能量': energy, '蛋白质': protein, '脂肪': fat, '碳水化合物': carbohydrate, '': calcium, '': iron, '': zinc, '维生素A': vitamin_a,

'维生素B1':   vitamin_b1,   '维生素B2':   vitamin_b2,   '维生素C':   vitamin_c, '蛋白质百分比':       protein_percentage,       '脂肪百分比':       fat_percentage, '碳水化合物百分比': carbohydrate_percentage,  '钙百分比': calcium_percentage, '铁百分比': iron_percentage, '锌百分比': zinc_percentage,

'维生素A百分比': vitamin_a_percentage,  '维生素B1百分比': vitamin_b1_percentage, '维生素B2百分比': vitamin_b2_percentage, '维生素C百分比': vitamin_c_percentage}

# 将字典转换为DataFrame,并进行转置

nutrient_df = pd.DataFrame(nutrient_dict, index=[0]).T

# 修改列名

nutrient_df.columns = ['营养素总量', '营养素百分比']

return nutrient_df

# 读取男生和女生的食谱数据

male_meals = pd.read_excel('male_meals.xlsx', sheet_name=None) female_meals = pd.read_excel('female_meals.xlsx', sheet_name=None)

# 创建空的DataFrame,用于存储男生和女生各餐的营养素总量和百分比

male_nutrients = pd.DataFrame() female_nutrients = pd.DataFrame()

# 循环遍历男生和女生的食谱,计算每餐的营养素总量和百分比,并存储到相应的DataFrame

for meal in male_meals.values():

male_nutrients = pd.concat([male_nutrients, nutrient_calculation(meal)], axis=1) for meal in female_meals.values():

female_nutrients = pd.concat([female_nutrients, nutrient_calculation(meal)], axis=1)

# DataFrame转置,并修改列名

male_nutrients = male_nutrients.T

male_nutrients.columns  ['能量''蛋白质''脂肪''碳水化合物''''''''维生素A''维生素B1''维生素B2''维生素C', '蛋白质百分比', '脂肪百分比', '碳水化合物百分比', '钙百分比', '铁百分比', '锌百分比', '维生素A百分比', '维生素B1百分比', '维生素B2百分比', '维生素C百分比']

female_nutrients = female_nutrients.T

female_nutrients.columns  ['能量''蛋白质''脂肪''碳水化合物''''''''维生素A''维生素B1''维生素B2''维生素C', '蛋白质百分比', '脂肪百分比', '碳水化合物百分比', '钙百分比', '铁百分比', '锌百分比', '维生素A百分比', '维生素B1百分比', '维生素B2百分比', '维生素

第二个问题是如何基于男女大学生的膳食摄入情况和营养需求,设计出符合平衡膳食基本准则的日食谱。

假设男女大学生的每日能量需求分别为 E m E f ,每日蛋白质、脂肪、碳水化合物需求分别为 P m , P f F m , F f C

m , C f 。根据平衡膳食基本准则,可得到以下约束条件:

  1. 蛋白质的摄入量应在总能量的10%~15%之间,即

0.1 E m P m ≤0.15 E m

    1. E f P f ≤0.15 E f

  1. 脂肪的摄入量应在总能量的20%~30%之间,即
    1. E m F m ≤0.3 E m

0.2 E f F f ≤0.3 E f

  1. 碳水化合物的摄入量应在总能量的50%~65%之间,即

0.5 E m C m ≤0.65 E m

0.5 E f C f ≤0.65 E f

  1. 非产能主要营养素的摄入量应接近参考摄入量,即

| C a m C a r e f |≤ ϵ

| C a f C a r e f |≤ ϵ

| F e m F e r e f |≤ ϵ

| F e f F e r e f |≤ ϵ

| Z n m Z n r e f |≤ ϵ

| Z n f Z n r e f |≤ ϵ

<think>好的,我现在需要帮助用户了解或实现得物签名的相关技术,特别是签名算法的实现方式。首先,我需要收集已有的信息。根据用户提供的引用,特别是引用[4]和[5],得物的签名算法可能涉及逆向工程分析,使用了JavaScript中的XMLHttpRequest重写来拦截请求,并在请求中包含特定的sign参数。这可能意味着签名生成是在客户端进行的,通常在前端JavaScript代码中完成。 接下来,我应该考虑常见的签名生成方法。常见的Web应用签名算法通常使用HMAC、AES、RSA或自定义的哈希组合。引用[1]提到了RSA算法,但得物的签名可能更倾向于使用HMAC-SHA256之类的哈希算法,结合时间戳、随机数和请求参数进行签名,以防止篡改和重放攻击。 用户可能需要具体的步骤,比如逆向分析得物的JavaScript代码,找到生成sign的函数,提取关键参数和加密逻辑。引用[5]中的代码片段展示了如何重写XMLHttpRequest的open方法来拦截请求,这可能用于调试和定位签名生成的代码位置。 此外,引用[4]提到使用Python进行算法还原,所以可能需要在Python中复现JavaScript的签名生成逻辑。这通常涉及分析请求参数如何排序、拼接,以及如何与密钥结合进行哈希或加密。需要注意反爬机制,如obfuscation(代码混淆)或动态密钥,这可能需要使用AST(抽象语法树)解析或动态执行来还原算法。 用户可能还需要了解如何应对反调试措施,比如在Chrome开发者工具中使用断调试,或者使用工具如Frida进行Hook。同时,引用[3]和[4]强调了法律和合规问,确保研究仅用于学习目的,不用于非法用途。 最后,应该提醒用户注意法律风险,遵循网站的使用条款,避免侵犯知识产权或违反计算机安全法律。总结起来,实现得物签名需要逆向工程分析前端代码,提取关键算法,处理可能的混淆和反调试,最后用目标语言如Python复现算法。</think>### 得物签名算法实现方式分析 得物签名算法主要用于接口请求的身份验证和防篡改保护,常见实现方式涉及以下技术: #### 1. **签名参数组成** 签名通常由以下参数动态生成: - 请求参数(经排序、过滤空值后拼接) - 时间戳(如:$timestamp=1620000000$) - 随机数(如:$nonce=5a8s3d$) - 设备指纹(如:$device\_id=abcdef$) - 应用密钥(加密盐值,可能动态获取)[^4] 示例参数拼接逻辑: $$ \text{sign\_str} = \text{path} + \text{sorted\_params} + \text{timestamp} + \text{nonce} $$ #### 2. **加密算法类型** 根据逆向分析,得物可能采用以下组合: - **HMAC-SHA256**:对拼接字符串进行哈希运算 - **AES/Base64编码**:对结果二次处理 - **自定义位移/异或操作**:增加逆向难度[^5] #### 3. **JavaScript代码混淆** 关键函数可能被混淆,例如: ```javascript function _0x12ab5(a, b) { return a ^ b << 3; } // 需要AST解析还原控制流 ``` #### 4. **Python算法还原示例** ```python import hmac import hashlib def generate_sign(params, secret_key): # 1. 参数排序并拼接 sorted_str = '&'.join([f"{k}={v}" for k,v in sorted(params.items())]) # 2. HMAC-SHA256加密 sign = hmac.new(secret_key.encode(), sorted_str.encode(), hashlib.sha256).hexdigest() # 3. 自定义处理(示例) return sign.upper() + str(int(time.time())) ``` #### 5. **反爬对抗措施** - 动态密钥:通过接口定期更新加密盐值 - 环境检测:验证是否在真机环境运行 - 请求频率限制:异常高频触发验证码[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值