2024全国大学生数学建模比赛C题参赛心得+备战比赛(2)
2024全国大学生数学建模比赛C题参赛心得+备战比赛(2)

前言:(可以跳过)2024年C题题目参考,参考代码,参考文献
题目:

我参考的代码是这个博主,如过觉得侵权,及时联系,立马删帖!!!

参考文献
[1] 张雅静, 李梦晨, 洪传春. 基于多目标线性规划的河北种植业结构调整研究[J]. 中国集体经济, 2022(09): 32-33.
[2] 张玲, 叶先宝, 陈圣群. 线性规则下应急资源配置的随机优化模型与算法研究[J]. 系统科学与数学, 2017, 37(05): 1221-1230.
[3] 张慧, 李文丽. 2020-2021年河南省农作物种子产供需形势分析[J]. 种业导刊, 2021(01): 16-18.
[4] 李彩花. 多期动态规划下的家庭资产组合决策优化研究[D]. 大连理工大学, 2016.
[5] 许文, 迟国泰, 杨万武. 考虑违约损失控制的商业银行多期资产组合动态优化模型[J]. 管理学报, 2010, 7(04): 585-594.
[6] 迟国泰, 余方平, 王玉刚. 基于动态规划的多期期货套期保值优化模型研究[J]. 中国管理科学, 2010, 18(03): 17-24. DOI: 10.16381/j.cnki.issn1003-207x.2010.03.018.
[7] Smith, J., & Jones, A. (2019). Optimizing Crop Yield under Variable Climate Conditions[J]. Journal of Agricultural Science, 112(3), 225-240.
[8] 刘亚琼, 李法虎, 杨玉林. 北京市农作物种植结构调整与节水节肥方案优化研究[J]. 中国农业大学学报, 2011, 16(05): 39-44.
[9] 吴殿廷, 王传周. 农作物布局优化模型的初步探讨[J]. 北京师范大学学报(自然科学版), 1998(04): 554-558.
[10] Johnson, D., & Lee, K. (2020). The Impact of Market Price Fluctuations on Crop Selection Strategies[J]. Agricultural Economics Review, 45(4), 345-360.
[11] 罗强, 周东. (2021). 作物选择的多准则决策支持系统研究[J]. 计算农业期刊, 15(4), 377-389.
[12] Patel, Kumar, N. (2019). Optimizing Crop Mixes for Smallholder Farmers: A Linear Programming Model Approach[J]. Sustainable Agriculture, 37(6), 512-525.
[13] Anderson, G., & Taylor, H. (2016). Uncertainty and Risk in Agricultural Decision-Making: A Stochastic Approach[J].
2024全国大学生数学建模比赛C题第一问代码参考

问题1:假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于 2023 年保持稳定,每季种植的农作物在当季销售。如果某种作物每季的总产量超过相应的预期销售量,超过部分不能正常销售。请针对以下两种情况,分别给出该乡村 2024~2030 年农作物的最优种植方案,将结果分别填入 result1_1.xlsx 和 result1_2.xlsx 中(模板文件见附件 3)。
- (1) 超过部分滞销,造成浪费;
- (2) 超过部分按 2023 年销售价格的 50%降价出售。
注:
- (1) 水浇地的第一季通常是在每年的3月至6月前后,第二季是在7月至10月前后。
- (2) 普通大棚的第一季通常是在每年的5月至9月前后,第二季是在9月至下一年4月前后。
- (3) 智慧大棚的第一季通常是在每年的3月至7月前后,第二季是在8月至下一年的2月前后。 注:
- (1) 该数据是2023年根据近几年的相应数据统计所得。
- (2) 智慧大棚第一季可种植的蔬菜作物及其亩产量、种植成本和销售价格均与普通大棚相同,表中省略。
假设农民是理性的有预期的种植,产出的产量总是和市场需求大致相同。¶
思路:一共六种地块类型,34个地块,平旱地、梯田和山坡种粮食(一季),水浇地种水稻(一季)或蔬菜(两季),普通大棚种蔬菜和食用菌(各一季),智慧大棚种蔬菜(两季)。
- 不能连续种植,也就是说除了水浇地种蔬菜、普通大棚和智慧大棚外,其他的地块都不能在来年种同样类型的植物。
- 如果水浇地种植蔬菜,第一季只能种大白菜、白萝卜和红萝卜除外的蔬菜(可以合种),第二季只能种大白菜、白萝卜和红萝卜(不可合种)。
- 智慧大棚不能种大白菜、白萝卜和红萝卜。
- 每三年所有土壤都必须种一次豆类,如果2023年的数据该地块每种,则接下来的两年就必须种,如果种植,那么这个时间需要重新计算。
- 作物种植不能太分散
- 每个作物在单个地块种植面积不能太小。
- 需要考虑下滞销问题(但这个属于附加项,直观一点来说,我们简单的将2023年的数据作为未来的销量,然后直接就将这个附加项给处理掉。但另外的,也可以考虑更加复杂的情况,将可能滞销的销量作为一个优化问题的随机扰动项)
现在的问题是:给定销量、成本、产量和销售价格,给出最优种植方案。本质上这是一个优化模型,需要考虑的是,何为最优种植方案。一般来说,这种优化模型就是利润最大化模型,但基于利润最大化优化模型,还可以提出改进模型,比如基于效率的利润最大化优化模型。将效率考虑到优化模型中。
数据处理,把附件1、2的不同sheet里的内容融合到一起
需要注意的是,我们只融合那些2023年存在记录(销量)的数据
## 导入会使用到的库
%config InlineBackend.figure_format = 'retina'
%matplotlib inline
import seaborn as sns
sns.set(font= "simhei",style="whitegrid",font_scale=1.6)
import matplotlib
matplotlib.rcParams['axes.unicode_minus']=False # 解决坐标轴的负号显示问题
## 导入需要的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
## 忽略提醒
import warnings
warnings.filterwarnings("ignore")
df1 = pd.read_excel('附件1.xlsx',sheet_name=0)
df2 = pd.read_excel('附件1.xlsx',sheet_name=1)
df3 = pd.read_excel('附件2.xlsx',sheet_name=0)
df4 = pd.read_excel('附件2.xlsx',sheet_name=1)
#对附件1的sheet2做处理
ls = []
for name,typ,soils in zip(df2.作物名称,df2.作物类型,df2.种植耕地):
for soil in soils.split('\n\n'):
ls.append([name,typ,soil])
d = pd.DataFrame(ls,columns=['作物名称','作物类型','种植耕地'])
ls1 = []
ls2 = []
for i in d.种植耕地:
if '季' in i:
ls1.append(i.split(' ')[0])
ls2.append(i.split(' ')[-1].replace('\n',''))
else:
ls1.append(i.replace('\n',''))
ls2.append('单季')
d['种植耕地'] = ls1
#将字段进行差分
ls1 = []
ls2 = []
for i in d.作物类型:
if '豆类' in i:
ls1.append(i.split('(')[0])
ls2.append('是')
else:
ls1.append(i)
ls2.append('不是')
d['作物类型'] = ls1
d['是否豆类'] = ls2
df2 = d
#同样的逻辑,将附件2的sheet1处理
df3.columns = ['地块名称', '作物编号', '作物名称', '作物类型', '种植面积/亩', '种植季次']
df3 = pd.merge(df1,df3,how='right',on='地块名称')
df3 = pd.DataFrame(df3.groupby(['地块类型','作物编号']).sum()[['种植面积/亩']])
ls1 = []
ls2 = []
for i,o in df3.index:
ls1.append(i)
ls2.append(o)
df3['地块类型'] = ls1
df3['作物编号'] = ls2
df3.reset_index(drop=True,inplace=True)
#数据合并
df4 = pd.merge(df4,df3,how='left',on=['地块类型','作物编号']).fillna(0)
df4['地块类型'] = [i.replace(' ','') for i in df4.地块类型]
df2.columns = ['作物名称', '作物类型', '地块类型', '是否豆类']
result = pd.merge(df4,df2,how='left',on=['作物名称', '地块类型'])
result.to_excel('处理后数据.xlsx',index=False)
对于销售单价,我们取平均销售单价作为作物的销售单价
假设农民是理性的有预期的种植,产出的产量总是和市场需求大致相同。
ls = []
for i in result['销售单价/(元/斤)']:
n = float(i.split('-')[0])
m = float(i.split('-')[1])
ls.append((n+m)/2)
result['平均销售单价'] = ls
result['总销量'] = result['亩产量/斤']*result['种植面积/亩']
result['总成本'] = result['平均销售单价']*result['种植面积/亩']
result['总盈利'] = result['总销量']*result['平均销售单价']-result['总成本']
df = result.copy()
不同作物的产量情况,根据假设,销量就等于产量¶
df.groupby('作物名称').sum()['总销量'].plot(kind = "barh",figsize = (8,10), color='#1E90FF') #颜色,matplotlib
plt.xticks(rotation=0)
plt.xlabel("总销量")
plt.ylabel("作物名称")
plt.yticks(fontsize = 12)
plt.show()

不同作物的盈利情况
#不同蔬菜品类的数量分布
df.groupby('作物名称').sum()['总盈利'].plot(kind = "barh",figsize = (8,10),color='#FA8072') #颜色,matplotlib
plt.xticks(rotation=0)
plt.xlabel("总盈利")
plt.ylabel("作物名称")
plt.yticks(fontsize = 12)
plt.show()

种植面积和亩产量之间的关系,可以看到,大部分的作物不存在这种关系,而非豆类的数据,存在一部分是正向关系,这可能和规模化有关
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='种植面积/亩', y='亩产量/斤', hue='是否豆类', palette='coolwarm', s=100)
plt.title('种植面积与亩产量的关系')
plt.xlabel('种植面积(亩)')
plt.ylabel('亩产量(斤)')
plt.legend(title='是否豆类')
plt.show()

不同作物类型的单价分布,可以看到,食用菌的销售价格是最高的,然后粮食的价格也会高于蔬菜
plt.figure(figsize=(10, 6))
sns.boxplot(data=df, x='作物类型', y='平均销售单价', palette='Set3')
plt.title('不同作物类型的销售单价分布')
plt.xlabel('作物类型')
plt.ylabel('销售单价(元/斤)')
plt.ylim(0,80)
plt.show()

grouped_data = df.groupby(['种植季次', '作物类型'])['种植面积/亩'].sum().unstack()
grouped_data.plot(kind='bar', stacked=True, figsize=(10, 6), colormap='Set2')
plt.title('不同季次作物的种植面积')
plt.xlabel('种植季次')
plt.ylabel('种植面积(亩)')
plt.legend(title='作物类型', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.xticks(rotation=0)
plt.show()

为了更清晰的看到种植成本和利润的对比,我们将两个图画在了一起,可以看到只有高盈利的作物,农民才会对其进行加量生成,符合标准的市场规律。
plt.figure(figsize=(10, 6))
ax = df.plot(kind='bar', x='作物名称', y='总成本', figsize=(12, 8), color='skyblue', legend=False)
ax.set_ylabel('种植成本(元/亩)', color='skyblue')
ax.tick_params(axis='x', labelsize=5) # 调整 x 轴标签字体大小
ax2 = ax.twinx()
df.plot(kind='line', x='作物名称', y='总盈利', ax=ax2, color='red', marker='o', legend=False)
ax2.set_ylabel('利润(元)', color='red')
ax2.tick_params(axis='x', labelsize=0) # 调整 x 轴标签字体大小
plt.title('种植成本与利润对比')
plt.xlabel('作物名称')
plt.show()

不同作物类型的总利润与平均利润¶
# 计算每种作物类型的总利润(利润合计)和平均利润
profit_by_crop_type = df.groupby('作物类型').agg(
总盈利=('总盈利', 'sum'),
平均利润=('总盈利', 'mean')
).reset_index()
# 创建双轴图,展示总利润和平均利润
fig, ax1 = plt.subplots(figsize=(10, 6))
# 总利润柱状图
sns.barplot(data=profit_by_crop_type, x='作物类型', y='总盈利', ax=ax1, color='skyblue')
ax1.set_ylabel('总利润(元)', color='skyblue')
ax1.tick_params(axis='y', labelcolor='skyblue')
ax1.set_xlabel('作物类型')
ax1.set_ylim(0, profit_by_crop_type['总盈利'].max() * 1.2)
# 平均利润折线图
ax2 = ax1.twinx()
sns.lineplot(data=profit_by_crop_type, x='作物类型', y='平均利润', ax=ax2, color='red', marker='o')
ax2.set_ylabel('平均利润(元)', color='red')
ax2.tick_params(axis='y', labelcolor='red')
ax2.set_ylim(0, profit_by_crop_type['平均利润'].max() * 1.2)
plt.title('不同作物类型的总利润与平均利润')
plt.xticks(rotation=45)
plt.show()

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)