(最新更新!)2024全国大学生数学建模竞赛(国赛)C题 鲁棒优化+LP模型+蒙特卡洛 完整建模全解全析!_数学建模题目
24国赛全解全析:
(文中前面的几张图片是我往期作品中的部分内容和可视化图片哦,可视化内容非常精美!)
以下是更新后的正式内容:
C题 农作物的种植策略
问题重述
本题目要求我们为一个位于华北山区的乡村设计农作物种植策略。该乡村拥有不同类型的耕地和大棚,适合种植不同种类的农作物。题目需要考虑到各类农作物的生长规律、市场需求、成本收益,以及各种种植限制,最终制定一个在2024年至2030年间的最优种植方案。
重点分析
- 耕地与种植条件:
- 该乡村拥有1201亩的露天耕地,包括平旱地、梯田、山坡地和水浇地,每种耕地适合种植不同类型的作物。
- 另外还有16个普通大棚和4个智慧大棚,适合种植蔬菜和食用菌。
- 作物生长规律与种植限制:
- 每种作物在同一地块不能连续重茬种植。
- 土地三年内至少要种植一次豆类作物。
- 种植方案需要考虑便于田间管理,即每种作物的种植地块不能太分散,种植面积不能太小。
- 市场需求与经济效益:
- 题目要求分别考虑两种情况:(1)滞销造成浪费,(2)超量部分降价出售。
- 考虑到未来小麦和玉米的预期销售量会增长,而其他作物则有可能在销售量和价格上有波动,需要进行综合优化。
- 动态变化和不确定性:
- 农作物的销售量、种植成本、亩产量、销售价格等因素会随时间变化,且具有不确定性。
- 市场条件、气候变化等外部因素对种植决策影响重大,需通过模拟和预测模型来应对这些不确定性。
- 作物的替代性与互补性:
- 不同农作物之间可能存在一定的替代性或互补性,需要在优化模型中加以考虑。
思路建模方向
- 优化模型:
- 使用线性规划、动态规划或整数规划模型,来优化种植策略,最大化经济效益或最小化种植风险。
- 采用多目标规划方法,在不同目标之间找到最佳平衡点。
- 预测模型:
- 采用时间序列分析、马尔可夫模型或灰色预测模型,对未来的农作物销售量、成本、价格等进行预测。
- 不确定性处理:
- 使用蒙特卡罗模拟等方法处理各类不确定性,进行风险评估。
- 引入鲁棒优化或随机优化方法,确保模型对不确定因素的敏感性较低。
- 作物间的替代性与互补性:
- 建立作物相关性的统计模型或系统动力学模型,来模拟作物之间的互补性与替代性对种植策略的影响。
- 数据模拟与比较:
- 在模型基础上进行数据模拟,求解最优方案,并与基础情况进行对比分析,寻找更加稳健的种植策略。
进一步分析与思考
根据题目问题的要求,我们需要对不同年份和多种情景下的农作物种植策略进行优化分析。以下是针对每个问题的深入分析和思考:
问题 1 分析
背景:
- 各种农作物的未来预期销售量、种植成本、亩产量和销售价格保持与2023年一致。
- 每季种植的农作物在当季销售,多余产量要么滞销造成浪费,要么按50%降价出售。
关键点:
1. 产量与销售量的平衡:需要优化每种作物的种植面积,使得总产量不超过预期销售量,或者在考虑降价销售的情况下最大化收益。
- 成本与收益的优化:
- 对于(1)滞销情况,重点在于避免浪费,因此应严格控制种植面积,以防止超额生产。
- 对于(2)降价销售情况,需考虑种植超额部分作物的降价对整体收益的影响,找到总收益最大化的种植面积分配。
- 数学模型选择:
线性规划(Linear Programming, LP) 或 整数规划(Integer Programming, IP) 是首选模型。目标函数应设定为总收益的最大化,约束条件包括耕地面积、种植成本和市场销售量等。
问题 2 分析
背景:
- 农作物的销售量、亩产量、种植成本和销售价格等参数在未来几年内具有波动性。
- 小麦和玉米的销售量有稳定增长趋势,其他作物的销售量、价格和成本等参数有不确定性。
关键点: 1. 参数的不确定性处理:
- 销售量、亩产量、种植成本、销售价格的年度波动必须通过随机模拟或情景分析进行处理。
- 可用 蒙特卡罗模拟 来模拟这些参数的变化对总收益的影响,并优化种植策略。
风险管理:
需要考虑由于气候和市场变化带来的种植风险,并设计一个稳健的种植方案。可采用 鲁棒优化(Robust Optimization),以确保种植策略在各种不确定情况下依然能产生较好的效果。
优化模型选择: 情景规划(Scenario Planning):模拟多种可能的未来情景,优化各个情景下的种植策略。或动态规划(Dynamic Programming, DP):考虑不同年份的决策,逐步优化7年种植策略。
问题 3 分析
背景:
- 各种农作物之间存在可替代性和互补性。农作物的销售量、销售价格、种植成本等因素可能存在相关性。
关键点: 1. 作物间关系的建模:
- 构建作物之间的 替代性和互补性矩阵,以量化这种关系对种植策略的影响。
- 建立相关性模型,利用 多元回归分析 或 协方差分析,捕捉各因素间的相关性。
综合优化策略:
在问题2的基础上,加入作物间的相关性因素,构建更复杂的 非线性优化模型 或 多目标优化模型,以同时优化收益、成本和风险。使用 模拟数据,通过 机器学习算法(如随机森林、支持向量机)进行求解,识别出最优种植策略。 模型对比与分析:
比较问题2和问题3的优化结果,分析农作物替代性和互补性、以及相关性对种植策略的影响。
敏感性分析 可以帮助识别最影响结果的参数或因素,调整模型提高预测和优化的准确性。
总结
为了解决这些问题,建议采用分阶段建模和分析的方式。首先,对每个问题进行独立建模和优化,然后逐步增加复杂性,引入更多的相关因素。通过敏感性分析、情景分析和模拟方法,确保策略的稳健性和适应性。最终,选择合适的优化工具和算法实现最优种植策略。
整体数据可视化
附件数据分析
- 乡村的现有耕地 (land_data):
- 数据包含地块名称、地块类型(例如,平旱地)、地块面积(以亩为单位)以及相关说明。
- 示例数据中,地块A1到A5都是平旱地,面积分别为80亩、55亩、35亩、72亩和68亩。
- 乡村种植的农作物 (crop_data):
- 数据包含作物编号、作物名称、作物类型(如粮食豆类)、适合种植的耕地类型及说明。
- 例如,黄豆(粮食豆类)适合种植在平旱地、梯田、山坡地等。
- 2023年的农作物种植情况 (planting_data_2023):
- 数据展示了2023年在不同地块上种植的作物信息,包括种植地块、作物编号、作物名称、作物类型、种植面积和种植季次。
- 例如,在地块A1上种植了80亩的小麦,A2上种植了55亩的玉米。
- 2023年统计的相关数据 (stats_data_2023):
- 包含了2023年的农作物种植相关统计数据,如亩产量、种植成本、销售单价等。
- 例如,黄豆在平旱地单季种植的亩产量为400斤,种植成本为400元/亩,销售单价在2.50到4.00元之间。
初步分析
- 地块与作物匹配:从crop_data和land_data可以看出,不同类型的地块适合种植不同的作物,需根据地块类型和作物特性匹配种植方案。
- 作物类型与种植季次:planting_data_2023表明大多数作物是一季作物,需考虑地块的利用率。
- 经济效益分析:stats_data_2023提供了作物的亩产量、成本和价格信息,有助于计算不同种植策略的经济收益。
# Import necessary librariesimport pandas as pd# Load the provided Excel filesfile_path_1 = \'/mnt/data/附件1.xlsx\'file_path_2 = \'/mnt/data/附件2.xlsx\'# Read the sheets from both filesland_data = pd.read_excel(file_path_1, sheet_name=\'乡村的现有耕地\')crop_data = pd.read_excel(file_path_1, sheet_name=\'乡村种植的农作物\')planting_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年的农作物种植情况\')stats_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年统计的相关数据\')# 咕咕咕land_data_head, crop_data_head, planting_data_2023_head, stats_data_2023_head
代码解释
1. 数据加载和配置
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# Set matplotlib font to support Chinese charactersplt.rcParams[\'font.sans-serif\'] = [\'SimHei\']plt.rcParams[\'axes.unicode_minus\'] = False
- pandas 用于数据处理。
- matplotlib 和 seaborn 用于数据可视化。
- 设置字体以支持中文字符,确保图表显示正常。
2. 数据加载
# Load the provided Excel filesfile_path_1 = \'C题\\附件1.xlsx\'file_path_2 = \'C题\\附件2.xlsx\'# Read the sheets from both filesland_data = pd.read_excel(file_path_1, sheet_name=\'乡村的现有耕地\')crop_data = pd.read_excel(file_path_1, sheet_name=\'乡村种植的农作物\')planting_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年的农作物种植情况\')stats_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年统计的相关数据\')
- 从指定路径加载Excel文件,并读取所需的工作表。
3. 可视化作物类型分布
# Crop type distribution in 2023plt.figure(figsize=(12, 8))crop_distribution = planting_data_2023[\'作物类型\'].value_counts()colors = sns.color_palette(\'Set2\', len(crop_distribution))sns.barplot(x=crop_distribution.index, y=crop_distribution.values, palette=colors)plt.title(\'Distribution of Crop Types in 2023\', fontsize=16)plt.xlabel(\'Crop Type\', fontsize=14)plt.ylabel(\'Quantity\', fontsize=14)plt.xticks(rotation=45)plt.tight_layout()plt.show()
- 使用柱状图展示2023年不同作物类型的分布情况,X轴为作物类型,Y轴为数量。
4. 可视化土地类型和面积分布
# Land type and area distributionplt.figure(figsize=(12, 8))land_type_distribution = land_data.groupby(\'地块类型\')[\'地块面积/亩\'].sum()colors = sns.color_palette(\'Set3\', len(land_type_distribution))sns.barplot(x=land_type_distribution.index, y=land_type_distribution.values, palette=colors)plt.title(\'Distribution of Total Land Area by Type\', fontsize=16)plt.xlabel(\'Land Type\', fontsize=14)plt.ylabel(\'Total Area (Mu)\', fontsize=14)plt.xticks(rotation=45)plt.tight_layout()plt.show()
- 使用柱状图展示不同土地类型的总面积分布情况,X轴为土地类型,Y轴为总面积(亩)。
5. 经济效益分析
# Economic benefits analysis (yield, cost, and price)plt.figure(figsize=(16, 8))# Convert price range to average price for plottingstats_data_2023[\'平均销售单价/元\'] = stats_data_2023[\'销售单价/(元/斤)\'].apply( lambda x: (sum(map(float, x.split(\'-\'))) / 2) if \'-\' in str(x) else float(x))# Yield analysisplt.subplot(1, 3, 1)colors = sns.color_palette(\'coolwarm\', len(stats_data_2023))sns.barplot(data=stats_data_2023, x=\'作物名称\', y=\'种植成本/(元/亩)\', palette=colors)plt.title(\'Crop Yield per Mu\', fontsize=16)plt.xlabel(\'Crop Name\', fontsize=14)plt.ylabel(\'Yield (Jin/Mu)\', fontsize=14)plt.xticks(rotation=45)# Cost analysisplt.subplot(1, 3, 2)colors = sns.color_palette(\'viridis\', len(stats_data_2023))sns.barplot(data=stats_data_2023, x=\'作物名称\', y=\'平均销售单价/元\', palette=colors)plt.title(\'Planting Cost per Mu\', fontsize=16)plt.xlabel(\'Crop Name\', fontsize=14)plt.ylabel(\'Planting Cost (Yuan/Mu)\', fontsize=14)plt.xticks(rotation=45)# Price analysisplt.subplot(1, 3, 3)colors = sns.color_palette(\'magma\', len(stats_data_2023))# 咕咕咕plt.tight_layout()plt.show()
- 使用多个子图展示不同作物的经济效益,包括作物产量、种植成本和销售价格。
- 计算并展示平均销售价格,并将其与种植成本和产量进行比较。
完整代码如下
# -*- coding: utf-8 -*-import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# Set matplotlib font to support Chinese charactersplt.rcParams[\'font.sans-serif\'] = [\'SimHei\']plt.rcParams[\'axes.unicode_minus\'] = False# Load the provided Excel filesfile_path_1 = \'\\C题\\附件1.xlsx\'file_path_2 = \'\\C题\\附件2.xlsx\'# Read the sheets from both filesland_data = pd.read_excel(file_path_1, sheet_name=\'乡村的现有耕地\')# 咕咕咕# Set seaborn style for better aestheticssns.set(style=\"whitegrid\")# Crop type distribution in 2023plt.figure(figsize=(12, 8))crop_distribution = planting_data_2023[\'作物类型\'].value_counts()colors = sns.color_palette(\'Set2\', len(crop_distribution))sns.barplot(x=crop_distribution.index, y=crop_distribution.values, palette=colors)plt.title(\'Distribution of Crop Types in 2023\', fontsize=16)plt.xlabel(\'Crop Type\', fontsize=14)plt.ylabel(\'Quantity\', fontsize=14)plt.xticks(rotation=45)plt.tight_layout()plt.show()# Land type and area distributionplt.figure(figsize=(12, 8))land_type_distribution = land_data.groupby(\'地块类型\')[\'地块面积/亩\'].sum()colors = sns.color_palette(\'Set3\', len(land_type_distribution))sns.barplot(x=land_type_distribution.index, y=land_type_distribution.values, palette=colors)plt.title(\'Distribution of Total Land Area by Type\', fontsize=16)plt.xlabel(\'Land Type\', fontsize=14)plt.ylabel(\'Total Area (Mu)\', fontsize=14)plt.xticks(rotation=45)plt.tight_layout()plt.show()# Economic benefits analysis (yield, cost, and price)plt.figure(figsize=(16, 8))# Convert price range to average price for plottingstats_data_2023[\'平均销售单价/元\'] = stats_data_2023[\'销售单价/(元/斤)\'].apply( lambda x: (sum(map(float, x.split(\'-\'))) / 2) if \'-\' in str(x) else float(x))# Yield analysisplt.subplot(1, 3, 1)colors = sns.color_palette(\'coolwarm\', len(stats_data_2023))sns.barplot(data=stats_data_2023, x=\'作物名称\', y=\'种植成本/(元/亩)\', palette=colors)plt.title(\'Crop Yield per Mu\', fontsize=16)plt.xlabel(\'Crop Name\', fontsize=14)plt.ylabel(\'Yield (Jin/Mu)\', fontsize=14)plt.xticks(rotation=45)# Cost analysis# 咕咕咕# Price analysisplt.subplot(1, 3, 3)colors = sns.color_palette(\'magma\', len(stats_data_2023))sns.barplot(data=stats_data_2023, x=\'作物名称\', y=\'平均销售单价/元\', palette=colors)plt.title(\'Average Selling Price\', fontsize=16)plt.xlabel(\'Crop Name\', fontsize=14)plt.ylabel(\'Average Selling Price (Yuan)\', fontsize=14)plt.xticks(rotation=45)plt.tight_layout()plt.show()
问题 1 的求解
建模目标
我们需要为一个乡村制定2024年至2030年的农作物种植方案,假设农作物的预期销售量、种植成本、亩产量和销售价格相对于2023年保持稳定。每季种植的农作物在当季销售,如果某种作物的总产量超过相应的预期销售量,则根据以下两种情况处理: 1. 超过部分滞销,造成浪费。 2. 超过部分按2023年销售价格的50%降价出售。
我们的目标是最大化农作物种植的总收益。收益计算需要考虑农作物的销售价格、产量以及超出预期销售量部分的处理方式。
决策变量
令 xij 表示在年份 i (从2024年到2030年)种植作物 $j$ 的面积(单位:亩)。
参数定义
Pj :作物 j 的亩产量(单位:斤/亩)
Cj :作物 j 的种植成本(单位:元/亩)
Sj :作物 j 的销售单价(单位:元/斤)
Qj :作物 j 的预期销售量(单位:斤)
N :农作物的种类数
M :耕地总面积(单位:亩)
目标函数
- 情况 1:超过部分滞销 总收益 = 总收入 - 种植成本
Z1=∑j=1N(min(xij⋅Pj,Qj)⋅Sj−xij⋅Cj)
- 情况 2:超过部分按50%降价出售 总收益 = 正常销售部分收益 + 降价部分收益 - 种植成本
Z2=∑j=1N(min(xij⋅Pj,Qj)⋅Sj+max(xij⋅Pj−Qj,0)⋅0.5⋅Sj−xij⋅Cj)
约束条件
- 耕地面积限制:
∑j=1Nxij≤M,∀i
- 非负性约束:
xij≥0,∀i,j
建模与求解
我们可以采用线性规划(Linear Programming, LP)或整数规划(Integer Programming, IP)来求解这个问题。以下是如何使用Python进行建模和求解的代码示例。
Python 代码示例
import pandas as pdfrom scipy.optimize import linprog# 假设读取的文件已经加载到 pandas DataFrame 中# 需要的数据表 stats_data_2023# 提取参数P = stats_data_2023[\'亩产量/斤\'].valuesC = stats_data_2023[\'种植成本/(元/亩)\'].valuesS = stats_data_2023[\'销售单价/(元/斤)\'].str.split(\'-\', expand=True).astype(float).mean(axis=1).valuesQ = planting_data_2023.groupby(\'作物编号\')[\'种植面积/亩\'].sum().values * PN = len(P) # 作物种类数量M = land_data[\'地块面积/亩\'].sum() # 总耕地面积# 定义目标函数系数(以最大化收益为目标,需要转换为最小化损失问题)# 咕咕咕# 定义约束条件A = [P] # 耕地面积限制b = [M] # 最大耕地面积# 边界条件x_bounds = [(0, None)] * N# 求解情况1:滞销# 咕咕咕# 求解情况2:降价销售# 咕咕咕print(\'最优种植方案(情况1):\', result1.x)print(\'最优种植方案(情况2):\', result2.x)# 可视化代码import matplotlib.pyplot as plt# 情况1和情况2的最优种植方案比较plt.figure(figsize=(12, 6))plt.bar(range(N), result1.x, alpha=0.5, label=\'情况1:滞销\')plt.bar(range(N), result2.x, alpha=0.5, label=\'情况2:降价销售\', hatch=\'/\')plt.xlabel(\'作物编号\')plt.ylabel(\'种植面积 (亩)\')plt.title(\'不同情况的最优种植方案\')plt.legend()plt.show()
总结
以上是问题1的详细数学建模和Python代码实现。我们通过构建线性规划模型,求解了在两种情况下的最优种植方案。可以看到,问题的核心在于合理分配有限的耕地资源,使得总收益最大化。通过不同情况下的最优解比较,我们还可以进一步分析各类作物的种植策略如何调整,以适应市场需求变化和政策导向。
问题 2 的求解
问题描述
在问题2中,我们需要综合考虑各种农作物在未来几年(2024-2030年)的预期销售量、亩产量、种植成本和销售价格的不确定性,以及潜在的种植风险,制定最优种植方案。
关键变化与不确定性
- 预期销售量变化:
- 小麦和玉米的预期销售量每年增长5%到10%。
- 其他作物的预期销售量每年变化±5%。
- 亩产量变化:
- 所有作物的亩产量每年变化±10%。
- 种植成本变化:
- 所有作物的种植成本平均每年增长5%。
- 销售价格变化:
- 粮食类作物的价格基本稳定。
- 蔬菜类作物的价格每年增长5%左右。
- 食用菌价格每年下降1%到5%,特别是羊肚菌每年下降5%。
建模目标
最大化农作物种植的预期收益,同时考虑不确定性和风险。
决策变量
咕咕咕 ~
参数定义
Pj,t :第 t 年作物 j 的亩产量(单位:斤/亩)
Cj,t :第 t 年作物 j 的种植成本(单位:元/亩)
Sj,t :第 t 年作物 j 的销售单价(单位:元/斤)
Qj,t :第 t 年作物 j 的预期销售量(单位:斤)
N :农作物的种类数
M :耕地总面积(单位:亩)
目标函数
目标是最大化总收益(Total Revenue):
咕咕咕~
约束条件
- 耕地面积限制:
∑j=1Nxij≤M,∀i
- 非负性约束:
咕咕咕~
解决方案
考虑到参数的不确定性,我们可以使用 蒙特卡罗模拟(Monte Carlo Simulation) 或 鲁棒优化(Robust Optimization) 来处理这些变化。
建模与求解
以下是如何使用Python进行建模、模拟和求解的代码示例。
Python 代码示例
import pandas as pdimport numpy as npfrom scipy.optimize import linprogimport matplotlib.pyplot as plt# Set matplotlib font to support Chinese charactersplt.rcParams[\'font.sans-serif\'] = [\'SimHei\']plt.rcParams[\'axes.unicode_minus\'] = False# Load the provided Excel filesfile_path_1 = \'/mnt/data/附件1.xlsx\'file_path_2 = \'/mnt/data/附件2.xlsx\'# Read the sheets from both filesland_data = pd.read_excel(file_path_1, sheet_name=\'乡村的现有耕地\')crop_data = pd.read_excel(file_path_1, sheet_name=\'乡村种植的农作物\')planting_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年的农作物种植情况\')stats_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年统计的相关数据\')# 数据处理stats_data_2023[\'平均销售单价/元\'] = stats_data_2023[\'销售单价/(元/斤)\'].apply( lambda x: (sum(map(float, x.split(\'-\'))) / 2) if \'-\' in str(x) else float(x) if pd.notna(x) else np.nan)stats_data_2023.fillna(0, inplace=True)# 咕咕咕N = len(P_base)M = land_data[\'地块面积/亩\'].sum()# 模拟参数变化years = range(2024, 2031)growth_rates = { \'小麦\': (1.05, 1.1), # 年增长率5%-10% \'玉米\': (1.05, 1.1), \'其他\': (0.95, 1.05) # 其他作物销售量±5%}# 咕咕咕# 模拟销售量、产量、成本、价格变化P_sim = []C_sim = []S_sim = []Q_sim = []for year in years: P_year = P_base * (1 + np.random.uniform(-yield_variation, yield_variation, N)) C_year = C_base * ((1 + cost_growth) ** (year - 2023)) S_year = S_base.copy() for i, crop_name in enumerate(stats_data_2023[\'作物名称\']):# 咕咕咕 P_sim.append(P_year) C_sim.append(C_year) S_sim.append(S_year) Q_sim.append(Q_year)# 优化过程Z = []x_result = []for t, year in enumerate(years): c = -1 * (S_sim[t] * P_sim[t] - C_sim[t]) # 目标函数系数# 咕咕咕 if result.success: Z.append(-result.fun) # 收益为负,需取负 x_result.append(result.x) else: Z.append(0) x_result.append(np.zeros(N))# 结果分析与可视化for t, year in enumerate(years): print(f\"年份 {year} 的最优种植方案: {x_result[t]}\")plt.figure(figsize=(12, 6))for t, year in enumerate(years): plt.plot(stats_data_2023[\'作物名称\'], x_result[t], label=f\'{year}年\')plt.xlabel(\'作物名称\')plt.ylabel(\'种植面积 (亩)\')plt.title(\'2024-2030年不同年份的最优种植方案\')plt.legend()plt.xticks(rotation=45)plt.tight_layout()plt.show()
解释
- 参数初始化:根据2023年的数据设置初始参数,包括产量、成本、销售价格和预期销售量。
- 参数模拟:基于每年的增长率和波动范围,模拟未来每年的产量、成本、销售价格和预期销售量。
- 优化求解:使用线性规划模型在每年的参数下计算最优种植策略,最大化收益。
- 结果分析:将不同年份的最优种植方案进行比较和可视化,帮助理解不同参数变化对种植策略的影响。
该模型通过模拟不同参数的变化来应对不确定性,帮助制定在多种条件下稳健的种植策略。
问题 3 的求解
问题描述
在问题3中,除了考虑未来农作物的预期销售量、亩产量、种植成本和销售价格的变化外,我们还需要综合考虑农作物之间的替代性和互补性,以及预期销售量、销售价格、种植成本之间的相关性。这些因素增加了模型的复杂性,需要更为细致的建模和分析方法。
建模目标
在综合考虑各种因素的基础上,优化种植策略,使得总收益最大化。
主要考虑因素
- 替代性和互补性:
- 替代性:某些作物可以相互替代(如小麦和玉米),在种植决策中选择一种会减少另一种的需求。
- 咕咕咕......
决策变量
令 xij 表示在年份 i (从2024年到2030年)种植作物 j 的面积(单位:亩)。
参数定义与扩展
在问题2的基础上,增加以下参数:
ρjk :作物 j 和作物 k 之间的替代性或互补性系数。
如果 ρjk>0 ,表示作物 j 和作物 k 具有互补性;值越大,互补性越强。
如果 ρjk<0 ,表示作物 j 和作物 k 具有替代性;值越小,替代性越强。
- 相关性矩阵:用于表示各因素之间的相关性,如销售量与价格、价格与成本等。
目标函数与约束条件
- 目标函数:
咕咕咕~
- 非负性约束:
xij≥0,∀i,j
- 替代性与互补性约束:
根据实际情况,添加或修改替代性与互补性约束,以反映农作物的种植组合关系。
解决方案
我们可以使用 多目标优化 和 蒙特卡罗模拟 来解决这个问题。蒙特卡罗模拟可以帮助模拟不同的相关性场景,而多目标优化可以用于最大化收益的同时考虑其他目标。
Python 代码实现
以下是Python代码的示例,用于模拟替代性和互补性影响下的最优种植策略。
import pandas as pdimport numpy as npfrom scipy.optimize import linprogimport matplotlib.pyplot as plt# Set matplotlib font to support Chinese charactersplt.rcParams[\'font.sans-serif\'] = [\'SimHei\']plt.rcParams[\'axes.unicode_minus\'] = False# Load the provided Excel filesfile_path_1 = \'/mnt/data/附件1.xlsx\'file_path_2 = \'/mnt/data/附件2.xlsx\'# Read the sheets from both filesland_data = pd.read_excel(file_path_1, sheet_name=\'乡村的现有耕地\')crop_data = pd.read_excel(file_path_1, sheet_name=\'乡村种植的农作物\')planting_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年的农作物种植情况\')stats_data_2023 = pd.read_excel(file_path_2, sheet_name=\'2023年统计的相关数据\')# 数据处理stats_data_2023[\'平均销售单价/元\'] = stats_data_2023[\'销售单价/(元/斤)\'].apply( lambda x: (sum(map(float, x.split(\'-\'))) / 2) if \'-\' in str(x) else float(x) if pd.notna(x) else np.nan)stats_data_2023.fillna(0, inplace=True)# 初始参数设置# 咕咕咕N = len(P_base)M = land_data[\'地块面积/亩\'].sum()# 模拟参数变化years = range(2024, 2031)growth_rates = { \'小麦\': (1.05, 1.1), \'玉米\': (1.05, 1.1), \'其他\': (0.95, 1.05)}yield_variation = 0.1cost_growth = 0.05price_growth = {\'蔬菜\': 0.05, \'食用菌\': (-0.05, -0.01)}# 作物之间的替代性和互补性系数矩阵(假设)substitution_complementarity_matrix = np.random.uniform(-0.5, 0.5, (N, N))# 模拟销售量、产量、成本、价格变化P_sim = []C_sim = []S_sim = []Q_sim = []for year in years:# 咕咕咕 for i, crop_name in enumerate(stats_data_2023[\'作物名称\']): if \'蔬菜\' in crop_name: S_year[i] *= (1 + price_growth[\'蔬菜\']) ** (year - 2023) elif \'食用菌\' in crop_name:# 咕咕咕 P_sim.append(P_year) C_sim.append(C_year) S_sim.append(S_year) Q_sim.append(Q_year)# 优化过程Z = []x_result = []for t, year in enumerate(years): # 构造目标函数,考虑互补性和替代性 c = -1 * (S_sim[t] * P_sim[t] - C_sim[t] + np.sum(substitution_complementarity_matrix, axis=1)) A = [P_sim[t]] b = [M] x_bounds = [(0, None)] * N result = linprog(c, A_ub=A, b_ub=b, bounds=x_bounds, method=\'highs\') if result.success: Z.append(-result.fun) x_result.append(result.x) else: Z.append(0) x_result.append(np.zeros(N))# 结果分析与可视化for t, year in enumerate(years): print(f\"年份 {year} 的最优种植方案: {x_result[t]}\")plt.figure(figsize=(12, 6))for t, year in enumerate(years): plt.plot(stats_data_2023[\'作物名称\'], x_result[t], label=f\'{year}年\')plt.xlabel(\'作物名称\')plt.ylabel(\'种植面积 (亩)\')plt.title(\'2024-2030年不同年份的最优种植方案(考虑替代性和互补性)\')plt.legend()plt.xticks(rotation=45)plt.tight_layout()plt.show()
解释
- 参数初始化:和问题2相似,基于2023年数据设置初始参数。
- 添加替代性与互补性系数:假设一个随机的替代性和互补性系数矩阵,用于模拟不同作物间的关系。
- 模拟过程:模拟未来每年的产量、成本等信息。
24国赛赛前准备:
论文中好的可视化内容至关重要 这里先分享一些国赛数学建模中的常用的可视化内容
数学建模中的可视化分析是一个重要的环节,它帮助研究者和观众更好地理解数据和模型的结果。以下是一些进阶的可视化分析方法和算法,以及相应的Python代码示例:
蒙特卡罗算法
算法介绍:蒙特卡罗算法是一种基于概率和随机性的方法,通过生成大量随机样本来模拟复杂系统的行为或计算数值解。它不依赖于严格的解析解,而是通过随机采样来估计问题的结果。例如,在估计圆周率π的值时,可以在一个正方形内随机生成点,然后计算落在内切圆内的点的比例,利用这个比例估计π的值。蒙特卡罗算法广泛应用于金融风险分析、物理学中的粒子行为模拟、复杂系统的概率分析等地方.
算法示例:
我们可以使用蒙特卡罗算法来估计三维图形的体积。下面是一个简单的Python程序,它使用蒙特卡罗算法来估计一个球体的体积,并使用Matplotlib库进行三维可视化。
import randomimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport numpy as npdef monte_carlo_volume(n): count = 0 for i in range(n): x = random.uniform(-1, 1) y = random.uniform(-1, 1) z = random.uniform(-1, 1) if x**2 + y**2 + z**2 <= 1: count += 1 return (count / n) * 8fig = plt.figure()ax = fig.add_subplot(111, projection=\'3d\')n = 10000volume = monte_carlo_volume(n)print(f\"Estimated volume of the sphere: {volume:.4f}\")xs = []ys = []zs = []colors = []for i in range(n): x = random.uniform(-1, 1) y = random.uniform(-1, 1) z = random.uniform(-1, 1) if x**2 + y**2 + z**2 <= 1: xs.append(x) ys.append(y) zs.append(z) colors.append(z)ax.scatter(xs, ys, zs, c=colors, cmap=\'coolwarm\', marker=\'o\')ax.set_xlabel(\'X Label\')ax.set_ylabel(\'Y Label\')ax.set_zlabel(\'Z Label\')plt.show()
- 程序首先定义了一个名为monte_carlo_volume的函数,该函数使用蒙特卡罗算法来估计球体的体积。
- 然后,程序使用monte_carlo_volume函数来估计球体的体积,并将结果打印到控制台上。
- 接下来,程序使用Matplotlib库创建一个3D散点图,该图显示了球体的随机采样点,并根据每个点的z坐标值进行颜色渐变。
可视化效果如下:
部分依赖分析图(Partial Dependence Plot)
部分依赖分析图(Partial Dependence Plot,简称PDP)是一种用于解释复杂机器学习模型的可视化工具。PDP可以帮助我们理解一个或两个特征对模型预测结果的影响,而忽略掉其他特征的影响。这种分析对于提高模型的透明度和可解释性非常有价值。
主要特点和用途
1. 展示特征影响:PDP显示了在保持模型中所有其他特征固定的情况下,一个特征(或两个特征的交互)对预测结果的平均影响。
2. 可解释性:对于复杂的模型(如随机森林、梯度提升机等),PDP帮助解释单个特征如何影响模型的预测,提高了模型的可解释性。
3. 非线性关系和交互效应:PDP特别适合揭示特征与预测目标之间的非线性关系,以及不同特征之间的交互效应。
工作原理
PDP通过对数据集中的特定特征进行多次采样,并保持其他特征不变,然后计算模型对这些样本的预测平均值来生成。
PDP是机器学习领域中一个非常有用的工具,尤其是在需要解释复杂模型的决策过程时。通过使用PDP,数据科学家和分析师可以更好地理解和信任他们的模型预测。图像: 部分依赖分析图的生成需要一个训练好的模型和特定的数据集,这里使用一个简单的合成数据集和一个基本的分类模型来演示。
这是一个部分依赖分析图的示例,它展示了在一个简单的合成数据集上训练的梯度提升分类器中,特征0、特征1以及它们的组合(特征0和1)对模型预测的影响。这种类型的图表非常有用于解释机器学习模型的行为,特别是在识别哪些特征对模型预测最有影响时。
生成这个图表的Python代码如下:
from sklearn.ensemble import GradientBoostingClassifierfrom sklearn.inspection import plot_partial_dependencefrom sklearn.datasets import make_classification# 创建合成数据集X, y = make_classification(n_samples=100, n_features=5, random_state=42)# 训练梯度提升分类器clf = GradientBoostingClassifier(n_estimators=50, random_state=42).fit(X, y)# 绘制部分依赖图features = [0, 1, (0, 1)]plot_partial_dependence(clf, X, features, grid_resolution=20)# 显示图形plt.suptitle(\'Partial Dependence Plots\')plt.show()
国赛的进阶可视化图表:成对关系图
成对关系图是一种可视化技术,用于显示数据集中每个变量之间的关系。它通常用于探索数据集中的相关性和分布情况。成对关系图可以用于许多不同的应用程序,例如数据分析、生物学、金融等地方。
下面是一个简单的Python程序,它使用Seaborn库创建一个成对关系图,该图显示了Iris数据集中每个变量之间的关系: iris数据集是一个经典的机器学习数据集,用于分类和聚类等任务。它包含了150个样本,每个样本有四个特征和一个标签。特征是鸢尾花的萼片和花瓣的长度和宽度,单位是厘米。标签是鸢尾花的三个品种之一:山鸢尾、变色鸢尾和维吉尼亚鸢尾。这个数据集是由英国统计学家和生物学家Fisher在1936年发表的论文中提出的,是最早用于评估分类方法的数据集之一。iris数据集在统计学和机器学习领域都有广泛的应用和影响,被认为是一个简单而优美的数据集。
这个程序使用Seaborn库创建一个成对关系图,该图显示了Iris数据集中每个变量之间的关系。程序使用sns.load_dataset函数加载Iris数据集,并使用sns.pairplot函数创建一个成对关系图。
import seaborn as snsimport matplotlib.pyplot as pltiris = sns.load_dataset(\"iris\")sns.pairplot(iris, hue=\"species\", markers=[\"o\", \"s\", \"D\"])plt.show()
成对关系图的应用场景包括但不限于以下几个方面:
- 数据分析:成对关系图可以用于显示数据集中每个变量之间的关系,帮助数据分析人员更好地理解数据。
- 生物学:成对关系图可以用于显示基因表达数据的密度和分布情况,帮助生物学家更好地理解基因表达数据。
- 金融:成对关系图可以用于显示股票价格的密度和分布情况,帮助投资者更好地理解股票市场