前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2024年高教社杯全国大学生数学建模C题-农作物的种植策略详解+思路+Python源码(二)

2024年高教社杯全国大学生数学建模C题-农作物的种植策略详解+思路+Python源码(二)

原创
作者头像
fanstuck
发布2025-01-11 18:22:51
发布2025-01-11 18:22:51
39700
代码可运行
举报
运行总次数:0
代码可运行

前言

大家好,我是fanstuck。数学建模不仅是解决复杂现实问题的一种有效工具,也是许多学科和行业中的关键技能。从工程、经济到生物、环境等多个领域,数学建模为我们提供了将实际问题转化为数学形式,并利用数学理论和方法进行求解的强大能力。然而,对于许多初学者而言,如何快速准备数学建模,掌握并运用各种建模技巧,仍然是一个亟待解决的挑战。

作为一名从事数学建模多年的博主,专注数学建模已有五年时间,期间参与了数十场不同规模的建模比赛,积累了丰富的经验。无论是模型原理、建模流程,还是各类题目分析方法,我都有深入的理解。为了帮助更多的建模爱好者,我都会在这个专栏中免费分享我的建模思路、技巧以及部分源码。每一场数模比赛,只要我有时间,我都会第一时间提供免费的开源思路和详细解答,力求让每位小伙伴都能快速掌握并应用数学建模的方法。无论你是刚入门的新手,还是经验丰富的选手,相信这里的内容都能为你带来启发。在此专栏中,你将找到最新的比赛思路、详细的分析过程、完整的代码实现!希望大家能够持续关注,不错过任何一个精彩的建模干货。

赛题2

根据经验,小麦和玉米未来的预期销售量有增长的趋势,平均年增长率介于5%~10%之间,其他农作物未来每年的预期销售量相对于 2023 年大约有±5%的变化。农作物的亩产量往往会受气候等因素的影响,每年会有±10%的变化。因受市场条件影响,农作物的种植成本平均每年增长5%左右。粮食类作物的销售价格基本稳定;蔬菜类作物的销售价格有增长的趋势,平均每年增长5%左右。食用菌的销售价格稳中有降,大约每年可下降1%~5%,特别是羊肚菌的销售价格每年下降幅度为5%。 请综合考虑各种农作物的预期销售量、亩产量、种植成本和销售价格的不确定性以及潜在的种植风险,给出该乡村 2024~2030 年农作物的最优种植方案,将结果填入 result2.xlsx 中(模板文件见附件 3)

赛题解析

2024年高教社杯全国大学生数学建模C题-农作物的种植策略详解+思路+Python源码(一)

主要思路

1.针对不确定的参数(销售量、亩产量、种植成本、销售价格)设定合理的波动范围或增长率区间,构造多个情景 (Scenario)

2.在每个情景下,参数取不同的组合值,从而获得若干个可能的未来情形;

3.通过情景优化鲁棒优化方法,得到对所有情景都具有较好表现的种植方案,从而降低决策对单一预测的依赖,规避种植风险。

一、参数不确定性的处理

1.不确定参数及其波动规律

根据题意,未来 2024~2030 年各项参数大致有以下变化趋势(对比 2023 年或上一年):

1.预期销售量D_{j,s,t}

  • 小麦、玉米:年增长率 5% ~ 10%;
  • 其他农作物:±5% 以内波动。

2.亩产量Y_{j,i,s,t}

  • 受气候等因素影响,每年可能有 ±10% 的变化。

3.种植成本C_{j,i,s,t}

  • 每年平均增长 5% 左右(可能是个区间,如 3% ~ 7%)。

4.销售价格P_{j,t}

  • 粮食类:价格基本稳定(可视为 0% ~ 2% 小幅波动)。
  • 蔬菜类:平均每年增长 5% 左右(可设 3% ~ 7% 的区间)。
  • 食用菌:价格每年下降 1% ~ 5%,其中羊肚菌为 5% 稳定下降。

2.建立情景 (Scenario) 集合

要在一个模型中综合考虑不确定性,常用做法之一是“场景分析 (Scenario Analysis)”。可令:

表示一组可能的未来情景(ω∈Ω)。在每个情景下,对上面提到的参数做不同组合的增减或增速设置。例如:

  • 根据最乐观最悲观以及若干中间情况,构造 3~5 个或者更多情景。
  • 也可以按拉丁超立方采样 (Latin Hypercube) 或蒙特卡洛随机抽样方式从增幅区间中采样若干组数值,构造场景集合。

这样,就能在模型中对每个情景下的参数

分别赋值。

示例

  • ω=1:“乐观”场景,小麦玉米销售量增速取 10%,亩产量正向波动 +10%,蔬菜价格增长 +7%,食用菌价格仅 -1% 等。
  • ω=2:“悲观”场景,小麦玉米销售量增速取 5%,亩产量 -10%,蔬菜价格仅 +3%,食用菌价格 -5% 等。
  • ω=3,4...:更多中间场景。

在每个场景下,时间序列 (2024~2030) 的逐年累积变化率也可按照各自假设进行编排。

二、模型扩展:情景/鲁棒优化

1. 决策变量

如同问题 1 中的决策变量x_{i,j,s,t}(第 t 年第 s 季地块 i 种作物 j 的面积)仍保持不变。区别在于,若要在所有情景中使用同一套种植方案,可称之为先验型 (Here-and-Now) 决策;如果允许每个情景下种植决策随之调整,则是事后型 (Wait-and-See) 决策。农业中通常要先选好种植方案再面对不确定的市场与气候,因此更多情况下我们考虑“同一套方案”在不同情景下的表现。

2. 情景目标的常见处理方式

期望收益最大化 (Stochastic Optimization)

其中 Z^{ω}为在情景 ω 下的收益。这种做法力图让平均收益最高,但可能在某些悲观情景下收益很差。

最小后悔值 (Minimax Regret)极小化最差收益 (Maximin)

  • Maximin:maxmin_{ω∈Ω}Z^ω,即让最差情景下的收益最高,注重稳健性。
  • Minimax Regret:需定义“后悔值 (Regret)”为“对该情景最优解与本解在该情景下收益的差”。然后最小化最大后悔值。

加权综合 (混合方法)

  • 设置一个风险系数 λ,在最大期望收益与最大化最差收益之间做加权或分层多目标。

在实践中,期望收益风险稳健性往往都需要考量,可使用多目标或在目标函数中增加惩罚项。

其中 α∈[0,1] 控制对“平均收益”和“最差收益”的重视程度。

3. 整合到数学模型

若采用单一解对所有情景生效,即对x_{i,j,s,t}不增加场景索引,而参数随情景变化,则模型主体可写为:

集合增加:ω∈Ω

产量:

超产/不足定义(参考问题 1),但要在情景 ω下分别定义U_{j,s,t}^{ω},W_{j,s,t}^{ω}

情景收益

或 maximin、minimax regret 等不同形式。

  • 其余约束(例如豆类轮作、不连续重茬等)在所有情景下均相同,无需增加情景下标,因为轮作与重茬是对种植方案本身的要求,独立于外部市场波动。

三、风险度量与种植风险约束

题中还提到“潜在的种植风险”,通常可在模型中引入风险度量

  • 若产量或市场价格低时,收益会受损;
  • 或者因为投入成本逐年攀升导致利润下降等。

常见做法是在模型中加入VaR(价值-at-风险)、CVaR(条件价值-at-风险)等风险约束,也需要场景分析来估计在高损失场景下的概率与期望损失。

其中 α 是置信水平,η 是可接受的损失阈值。也可以在目标函数中加入惩罚项。这些方法实现起来较复杂,需要在每个情景下计算收益或损失,然后通过额外的变量与约束来表达 VaR / CVaR。对于简单的竞赛建模,也可通过控制“最差收益”*或*多目标权衡平均收益与最差收益的方式来替代。

四、求解与结果输出

1.数据准备

对每个t∈{2024,…,2030} 和每个情景 ω,生成不确定参数:

可以将这些数据存于表格或字典结构中(如 Python 里 dict[(j,s,t,omega)] 形式)。

2.模型构建

  • 引入场景索引 ω,并根据选定的鲁棒优化目标(最大期望收益,或 maximin,或带风险惩罚) 构建对应的目标函数。
  • 其他约束(土地、轮作、不连续重茬等)同问题1,保持对所有情景通用。

3.求解与输出

  • 求得的最优解

不带情景下标,表示对所有情景都使用相同种植方案。

  • 将结果输出到 result2.xlsx。在报告中可附上各情景下的收益风险指标对比,展示该方案的稳健性。

Python + Pyomo 情景建模思路

代码语言:javascript
代码运行次数:0
运行
复制
import pyomo.environ as pyo

# ---- 1. 定义基本集合 ----
T = [2024, 2025, 2026, 2027, 2028, 2029, 2030]
S = [1, 2]
I = [...]  # 地块
J = [...]  # 作物
Omega = [...]  # 情景集合, e.g. [1,2,3,4,5]

# ---- 2. 数据读入或预先生成 ----
# 例如 D[(j,s,t,omega)], Y[(j,i,s,t,omega)], etc.
# 需要将每个omega下的参数都准备好
D = {}
Y = {}
C = {}
P = {}
# ...

# ---- 3. 建立模型 ----
model = pyo.ConcreteModel("Scenario_Model")

# 决策变量 x_{i,j,s,t} 不含omega下标 (先验决策)
model.x = pyo.Var(I, J, S, T, domain=pyo.NonNegativeReals)

# 对于超产/不足, 在每个场景下都要定义 U_{j,s,t,omega}, W_{j,s,t,omega}
model.U = pyo.Var(J, S, T, Omega, domain=pyo.NonNegativeReals)
model.W = pyo.Var(J, S, T, Omega, domain=pyo.NonNegativeReals)

# y_{i,j,s,t} 同理, 不含omega索引, 因为轮作/重茬对所有情景同一要求
model.y = pyo.Var(I, J, S, T, domain=pyo.Binary)

# ---- 4. 约束 ----
# 与问题1类似, 这里省略重复, 只展示其中的情景相关部分.

# (a) 产量 = sum_i (Y_{j,i,s,t,omega} * x_{i,j,s,t})
def Q_expr(model, j, s, t, omega):
    return sum(Y[(j,i,s,t,omega)] * model.x[i,j,s,t] for i in I)
model.Q = pyo.Expression(J, S, T, Omega, rule=Q_expr)

# (b) U, W 定义
def U_rule(model, j, s, t, omega):
    return model.U[j,s,t,omega] >= model.Q[j,s,t,omega] - D[(j,s,t,omega)]
model.UConstraint = pyo.Constraint(J, S, T, Omega, rule=U_rule)

def W_rule(model, j, s, t, omega):
    return model.W[j,s,t,omega] >= D[(j,s,t,omega)] - model.Q[j,s,t,omega]
model.WConstraint = pyo.Constraint(J, S, T, Omega, rule=W_rule)

# 其余: 土地约束, y与x关联, 不连续重茬, 豆类轮作等, 与问题1一致(不含omega索引)。

# ---- 5. 目标函数: 以期望收益为例 ----
def obj_rule(model):
    # 先计算每个omega下的收益
    # 示例使用"情形(1) 超产无收益"写法, 也可改成情形(2)
    revenue_omega = []
    for omega in Omega:
        # Revenue in scenario omega
        rev_omega = 0
        cost_omega = 0
        for t in T:
            for s in S:
                for j in J:
                    rev_omega += P[(j,t,omega)] * (D[(j,s,t,omega)] - model.U[j,s,t,omega])
                for i in I:
                    for j in J:
                        cost_omega += C[(j,i,s,t,omega)] * model.x[i,j,s,t]
        revenue_omega.append(rev_omega - cost_omega)
    # 期望收益(简单平均)
    return sum(revenue_omega)/len(Omega)

model.OBJ = pyo.Objective(rule=obj_rule, sense=pyo.maximize)

# ---- 6. 求解 ----
solver = pyo.SolverFactory('gurobi')
results = solver.solve(model, tee=True)

# ---- 7. 输出结果到 result2.xlsx ----
# 同前类似, 将 x_{i,j,s,t} 写入Excel

数据层面:根据题意,需要对 2023 年基准值进行逐年“增减”或“增速”设定,构造多情景(omega),并在 (j,s,t,omega) 维度下记录 {D,Y,C,P} 的具体数值。

模型层面:在问题 1 的基础上,添加情景索引,对产量、销售量、价格、成本等做情景化表达;在目标函数中使用期望型、极小最大损失型或其他鲁棒型目标。

求解输出:将得到一个在未来 7 年 (2024~2030) 针对不同不确定情景都比较稳健的种植方案;在 result2.xlsx 中记录最终的 x_{i,j,s,t} 分配即可。

风险控制:如需更深入的风险约束,可考虑 CVaR 等模型;竞赛中常用多场景平均 + 最差情景加权的方式即可基本满足需求。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 赛题2
  • 赛题解析
    • 一、参数不确定性的处理
      • 1.不确定参数及其波动规律
      • 2.建立情景 (Scenario) 集合
    • 二、模型扩展:情景/鲁棒优化
      • 1. 决策变量
      • 2. 情景目标的常见处理方式
      • 3. 整合到数学模型
    • 三、风险度量与种植风险约束
    • 四、求解与结果输出
  • Python + Pyomo 情景建模思路
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档