大家好,我是fanstuck。数学建模不仅是解决复杂现实问题的一种有效工具,也是许多学科和行业中的关键技能。从工程、经济到生物、环境等多个领域,数学建模为我们提供了将实际问题转化为数学形式,并利用数学理论和方法进行求解的强大能力。然而,对于许多初学者而言,如何快速准备数学建模,掌握并运用各种建模技巧,仍然是一个亟待解决的挑战。
作为一名从事数学建模多年的博主,专注数学建模已有五年时间,期间参与了数十场不同规模的建模比赛,积累了丰富的经验。无论是模型原理、建模流程,还是各类题目分析方法,我都有深入的理解。为了帮助更多的建模爱好者,我都会在这个专栏中免费分享我的建模思路、技巧以及部分源码。每一场数模比赛,只要我有时间,我都会第一时间提供免费的开源思路和详细解答,力求让每位小伙伴都能快速掌握并应用数学建模的方法。无论你是刚入门的新手,还是经验丰富的选手,相信这里的内容都能为你带来启发。在此专栏中,你将找到最新的比赛思路、详细的分析过程、完整的代码实现!希望大家能够持续关注,不错过任何一个精彩的建模干货。
根据经验,小麦和玉米未来的预期销售量有增长的趋势,平均年增长率介于5%~10%之间,其他农作物未来每年的预期销售量相对于 2023 年大约有±5%的变化。农作物的亩产量往往会受气候等因素的影响,每年会有±10%的变化。因受市场条件影响,农作物的种植成本平均每年增长5%左右。粮食类作物的销售价格基本稳定;蔬菜类作物的销售价格有增长的趋势,平均每年增长5%左右。食用菌的销售价格稳中有降,大约每年可下降1%~5%,特别是羊肚菌的销售价格每年下降幅度为5%。 请综合考虑各种农作物的预期销售量、亩产量、种植成本和销售价格的不确定性以及潜在的种植风险,给出该乡村 2024~2030 年农作物的最优种植方案,将结果填入 result2.xlsx 中(模板文件见附件 3)
2024年高教社杯全国大学生数学建模C题-农作物的种植策略详解+思路+Python源码(一)。
主要思路
1.针对不确定的参数(销售量、亩产量、种植成本、销售价格)设定合理的波动范围或增长率区间,构造多个情景 (Scenario);
2.在每个情景下,参数取不同的组合值,从而获得若干个可能的未来情形;
3.通过情景优化或鲁棒优化方法,得到对所有情景都具有较好表现的种植方案,从而降低决策对单一预测的依赖,规避种植风险。
根据题意,未来 2024~2030 年各项参数大致有以下变化趋势(对比 2023 年或上一年):
1.预期销售量D_{j,s,t}
2.亩产量Y_{j,i,s,t}
3.种植成本C_{j,i,s,t}
4.销售价格P_{j,t}
要在一个模型中综合考虑不确定性,常用做法之一是“场景分析 (Scenario Analysis)”。可令:
表示一组可能的未来情景(ω∈Ω)。在每个情景下,对上面提到的参数做不同组合的增减或增速设置。例如:
这样,就能在模型中对每个情景下的参数
分别赋值。
示例:
在每个场景下,时间序列 (2024~2030) 的逐年累积变化率也可按照各自假设进行编排。
如同问题 1 中的决策变量x_{i,j,s,t}(第 t 年第 s 季地块 i 种作物 j 的面积)仍保持不变。区别在于,若要在所有情景中使用同一套种植方案,可称之为先验型 (Here-and-Now) 决策;如果允许每个情景下种植决策随之调整,则是事后型 (Wait-and-See) 决策。农业中通常要先选好种植方案再面对不确定的市场与气候,因此更多情况下我们考虑“同一套方案”在不同情景下的表现。
期望收益最大化 (Stochastic Optimization)
其中 Z^{ω}为在情景 ω 下的收益。这种做法力图让平均收益最高,但可能在某些悲观情景下收益很差。
最小后悔值 (Minimax Regret) 或 极小化最差收益 (Maximin)
加权综合 (混合方法)
在实践中,期望收益和风险稳健性往往都需要考量,可使用多目标或在目标函数中增加惩罚项。
其中 α∈[0,1] 控制对“平均收益”和“最差收益”的重视程度。
若采用单一解对所有情景生效,即对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.模型构建
3.求解与输出
不带情景下标,表示对所有情景都使用相同种植方案。
result2.xlsx
。在报告中可附上各情景下的收益或风险指标对比,展示该方案的稳健性。
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 删除。