前言:(可以跳过)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()

 

Logo

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

更多推荐