(最新更新!)2024全国大学生数学建模竞赛(国赛)C题 鲁棒优化+LP模型+蒙特卡洛 完整建模全解全析!

24国赛全解全析:

(文中前面的几张图片是我往期作品中的部分内容和可视化图片哦,可视化内容非常精美!)

以下是更新后的正式内容:

C题 农作物的种植策略

问题重述

本题目要求我们为一个位于华北山区的乡村设计农作物种植策略。该乡村拥有不同类型的耕地和大棚,适合种植不同种类的农作物。题目需要考虑到各类农作物的生长规律、市场需求、成本收益,以及各种种植限制,最终制定一个在2024年至2030年间的最优种植方案。

重点分析

  • 耕地与种植条件
  • 该乡村拥有1201亩的露天耕地,包括平旱地、梯田、山坡地和水浇地,每种耕地适合种植不同类型的作物。
  • 另外还有16个普通大棚和4个智慧大棚,适合种植蔬菜和食用菌。
  • 作物生长规律与种植限制
  • 每种作物在同一地块不能连续重茬种植。
  • 土地三年内至少要种植一次豆类作物。
  • 种植方案需要考虑便于田间管理,即每种作物的种植地块不能太分散,种植面积不能太小。
  • 市场需求与经济效益
  • 题目要求分别考虑两种情况:(1)滞销造成浪费,(2)超量部分降价出售。
  • 考虑到未来小麦和玉米的预期销售量会增长,而其他作物则有可能在销售量和价格上有波动,需要进行综合优化。
  • 动态变化和不确定性
  • 农作物的销售量、种植成本、亩产量、销售价格等因素会随时间变化,且具有不确定性。
  • 市场条件、气候变化等外部因素对种植决策影响重大,需通过模拟和预测模型来应对这些不确定性。
  • 作物的替代性与互补性
  • 不同农作物之间可能存在一定的替代性或互补性,需要在优化模型中加以考虑。

思路建模方向

  • 优化模型
  • 使用线性规划、动态规划或整数规划模型,来优化种植策略,最大化经济效益或最小化种植风险。
  • 采用多目标规划方法,在不同目标之间找到最佳平衡点。
  • 预测模型
  • 采用时间序列分析、马尔可夫模型或灰色预测模型,对未来的农作物销售量、成本、价格等进行预测。
  • 不确定性处理
  • 使用蒙特卡罗模拟等方法处理各类不确定性,进行风险评估。
  • 引入鲁棒优化或随机优化方法,确保模型对不确定因素的敏感性较低。
  • 作物间的替代性与互补性
  • 建立作物相关性的统计模型或系统动力学模型,来模拟作物之间的互补性与替代性对种植策略的影响。
  • 数据模拟与比较
  • 在模型基础上进行数据模拟,求解最优方案,并与基础情况进行对比分析,寻找更加稳健的种植策略。

进一步分析与思考

根据题目问题的要求,我们需要对不同年份和多种情景下的农作物种植策略进行优化分析。以下是针对每个问题的深入分析和思考:

问题 1 分析

背景

  • 各种农作物的未来预期销售量、种植成本、亩产量和销售价格保持与2023年一致。
  • 每季种植的农作物在当季销售,多余产量要么滞销造成浪费,要么按50%降价出售。

关键点

1. 产量与销售量的平衡:需要优化每种作物的种植面积,使得总产量不超过预期销售量,或者在考虑降价销售的情况下最大化收益。

  1. 成本与收益的优化
  • 对于(1)滞销情况,重点在于避免浪费,因此应严格控制种植面积,以防止超额生产。
  • 对于(2)降价销售情况,需考虑种植超额部分作物的降价对整体收益的影响,找到总收益最大化的种植面积分配。
  1. 数学模型选择

线性规划(Linear Programming, LP) 或 整数规划(Integer Programming, IP) 是首选模型。目标函数应设定为总收益的最大化,约束条件包括耕地面积、种植成本和市场销售量等。

问题 2 分析

背景

  • 农作物的销售量、亩产量、种植成本和销售价格等参数在未来几年内具有波动性。
  • 小麦和玉米的销售量有稳定增长趋势,其他作物的销售量、价格和成本等参数有不确定性。

关键点: 1. 参数的不确定性处理

  • 销售量、亩产量、种植成本、销售价格的年度波动必须通过随机模拟或情景分析进行处理。
  • 可用 蒙特卡罗模拟 来模拟这些参数的变化对总收益的影响,并优化种植策略。

风险管理

需要考虑由于气候和市场变化带来的种植风险,并设计一个稳健的种植方案。可采用 鲁棒优化(Robust Optimization),以确保种植策略在各种不确定情况下依然能产生较好的效果。

优化模型选择: 情景规划(Scenario Planning):模拟多种可能的未来情景,优化各个情景下的种植策略。或动态规划(Dynamic Programming, DP):考虑不同年份的决策,逐步优化7年种植策略。

问题 3 分析

背景

  • 各种农作物之间存在可替代性和互补性。农作物的销售量、销售价格、种植成本等因素可能存在相关性。

关键点: 1. 作物间关系的建模

  • 构建作物之间的 替代性和互补性矩阵,以量化这种关系对种植策略的影响。
  • 建立相关性模型,利用 多元回归分析 或 协方差分析,捕捉各因素间的相关性。

综合优化策略

在问题2的基础上,加入作物间的相关性因素,构建更复杂的 非线性优化模型 或 多目标优化模型,以同时优化收益、成本和风险。使用 模拟数据,通过 机器学习算法(如随机森林、支持向量机)进行求解,识别出最优种植策略。 模型对比与分析

比较问题2和问题3的优化结果,分析农作物替代性和互补性、以及相关性对种植策略的影响。

敏感性分析 可以帮助识别最影响结果的参数或因素,调整模型提高预测和优化的准确性。

总结

为了解决这些问题,建议采用分阶段建模和分析的方式。首先,对每个问题进行独立建模和优化,然后逐步增加复杂性,引入更多的相关因素。通过敏感性分析、情景分析和模拟方法,确保策略的稳健性和适应性。最终,选择合适的优化工具和算法实现最优种植策略。

整体数据可视化

附件数据分析

  1. 乡村的现有耕地 (land_data):
  2. 数据包含地块名称、地块类型(例如,平旱地)、地块面积(以亩为单位)以及相关说明。
  3. 示例数据中,地块A1到A5都是平旱地,面积分别为80亩、55亩、35亩、72亩和68亩。
  4. 乡村种植的农作物 (crop_data):
  5. 数据包含作物编号、作物名称、作物类型(如粮食豆类)、适合种植的耕地类型及说明。
  6. 例如,黄豆(粮食豆类)适合种植在平旱地、梯田、山坡地等。
  7. 2023年的农作物种植情况 (planting_data_2023):
  8. 数据展示了2023年在不同地块上种植的作物信息,包括种植地块、作物编号、作物名称、作物类型、种植面积和种植季次。
  9. 例如,在地块A1上种植了80亩的小麦,A2上种植了55亩的玉米。
  10. 2023年统计的相关数据 (stats_data_2023):
  11. 包含了2023年的农作物种植相关统计数据,如亩产量、种植成本、销售单价等。
  12. 例如,黄豆在平旱地单季种植的亩产量为400斤,种植成本为400元/亩,销售单价在2.50到4.00元之间。

初步分析

  • 地块与作物匹配:从crop_data和land_data可以看出,不同类型的地块适合种植不同的作物,需根据地块类型和作物特性匹配种植方案。
  • 作物类型与种植季次:planting_data_2023表明大多数作物是一季作物,需考虑地块的利用率。
  • 经济效益分析:stats_data_2023提供了作物的亩产量、成本和价格信息,有助于计算不同种植策略的经济收益。
# Import necessary libraries
import pandas as pd

# Load the provided Excel files
file_path_1 = '/mnt/data/附件1.xlsx'
file_path_2 = '/mnt/data/附件2.xlsx'

# Read the sheets from both files
land_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 pd
import matplotlib.pyplot as plt
import seaborn as sns

# Set matplotlib font to support Chinese characters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
  • pandas 用于数据处理。
  • matplotlib 和 seaborn 用于数据可视化。
  • 设置字体以支持中文字符,确保图表显示正常。

2. 数据加载

# Load the provided Excel files
file_path_1 = 'C题\附件1.xlsx'
file_path_2 = 'C题\附件2.xlsx'

# Read the sheets from both files
land_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 2023
plt.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 distribution
plt.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 plotting
stats_data_2023['平均销售单价/元'] = stats_data_2023['销售单价/(元/斤)'].apply(
    lambda x: (sum(map(float, x.split('-'))) / 2) if '-' in str(x) else float(x))

# Yield analysis
plt.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
plt.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 analysis
plt.subplot(1, 3, 3)
colors = sns.color_palette('magma', len(stats_data_2023))

# 咕咕咕


plt.tight_layout()
plt.show()
  • 使用多个子图展示不同作物的经济效益,包括作物产量、种植成本和销售价格。
  • 计算并展示平均销售价格,并将其与种植成本和产量进行比较。

完整代码如下

# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Set matplotlib font to support Chinese characters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# Load the provided Excel files
file_path_1 = '\C题\附件1.xlsx'
file_path_2 = '\C题\附件2.xlsx'

# Read the sheets from both files
land_data = pd.read_excel(file_path_1, sheet_name='乡村的现有耕地')


# 咕咕咕


# Set seaborn style for better aesthetics
sns.set(style="whitegrid")

# Crop type distribution in 2023
plt.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 distribution
plt.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 plotting
stats_data_2023['平均销售单价/元'] = stats_data_2023['销售单价/(元/斤)'].apply(
    lambda x: (sum(map(float, x.split('-'))) / 2) if '-' in str(x) else float(x))

# Yield analysis
plt.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 analysis
plt.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. 情况 1:超过部分滞销 总收益 = 总收入 - 种植成本

Z1=∑j=1N(min(xij⋅Pj,Qj)⋅Sj−xij⋅Cj)

  1. 情况 2:超过部分按50%降价出售 总收益 = 正常销售部分收益 + 降价部分收益 - 种植成本

Z2=∑j=1N(min(xij⋅Pj,Qj)⋅Sj+max(xij⋅Pj−Qj,0)⋅0.5⋅Sj−xij⋅Cj)

约束条件

  1. 耕地面积限制

∑j=1Nxij≤M,∀i

  1. 非负性约束

xij≥0,∀i,j

建模与求解

我们可以采用线性规划(Linear Programming, LP)或整数规划(Integer Programming, IP)来求解这个问题。以下是如何使用Python进行建模和求解的代码示例。

Python 代码示例

import pandas as pd
from scipy.optimize import linprog

# 假设读取的文件已经加载到 pandas DataFrame 中
# 需要的数据表 stats_data_2023

# 提取参数
P = stats_data_2023['亩产量/斤'].values
C = stats_data_2023['种植成本/(元/亩)'].values
S = stats_data_2023['销售单价/(元/斤)'].str.split('-', expand=True).astype(float).mean(axis=1).values
Q = planting_data_2023.groupby('作物编号')['种植面积/亩'].sum().values * P

N = 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):

咕咕咕~

约束条件

  1. 耕地面积限制

∑j=1Nxij≤M,∀i

  1. 非负性约束

咕咕咕~

解决方案

考虑到参数的不确定性,我们可以使用 蒙特卡罗模拟(Monte Carlo Simulation) 或 鲁棒优化(Robust Optimization) 来处理这些变化。

建模与求解

以下是如何使用Python进行建模、模拟和求解的代码示例。

Python 代码示例

import pandas as pd
import numpy as np
from scipy.optimize import linprog
import matplotlib.pyplot as plt

# Set matplotlib font to support Chinese characters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# Load the provided Excel files
file_path_1 = '/mnt/data/附件1.xlsx'
file_path_2 = '/mnt/data/附件2.xlsx'

# Read the sheets from both files
land_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()

解释

  1. 参数初始化:根据2023年的数据设置初始参数,包括产量、成本、销售价格和预期销售量。
  2. 参数模拟:基于每年的增长率和波动范围,模拟未来每年的产量、成本、销售价格和预期销售量。
  3. 优化求解:使用线性规划模型在每年的参数下计算最优种植策略,最大化收益。
  4. 结果分析:将不同年份的最优种植方案进行比较和可视化,帮助理解不同参数变化对种植策略的影响。

该模型通过模拟不同参数的变化来应对不确定性,帮助制定在多种条件下稳健的种植策略。

问题 3 的求解

问题描述

在问题3中,除了考虑未来农作物的预期销售量、亩产量、种植成本和销售价格的变化外,我们还需要综合考虑农作物之间的替代性和互补性,以及预期销售量、销售价格、种植成本之间的相关性。这些因素增加了模型的复杂性,需要更为细致的建模和分析方法。

建模目标

在综合考虑各种因素的基础上,优化种植策略,使得总收益最大化。

主要考虑因素

  1. 替代性和互补性
  2. 替代性:某些作物可以相互替代(如小麦和玉米),在种植决策中选择一种会减少另一种的需求。
  3. 咕咕咕......

决策变量

令 xij 表示在年份 i (从2024年到2030年)种植作物 j 的面积(单位:亩)。

参数定义与扩展

在问题2的基础上,增加以下参数:

ρjk :作物 j 和作物 k 之间的替代性或互补性系数。

如果 ρjk>0 ,表示作物 j 和作物 k 具有互补性;值越大,互补性越强。

如果 ρjk<0 ,表示作物 j 和作物 k 具有替代性;值越小,替代性越强。

  • 相关性矩阵:用于表示各因素之间的相关性,如销售量与价格、价格与成本等。

目标函数与约束条件

  1. 目标函数

咕咕咕~

  • 非负性约束

xij≥0,∀i,j

  • 替代性与互补性约束

根据实际情况,添加或修改替代性与互补性约束,以反映农作物的种植组合关系。

解决方案

我们可以使用 多目标优化 和 蒙特卡罗模拟 来解决这个问题。蒙特卡罗模拟可以帮助模拟不同的相关性场景,而多目标优化可以用于最大化收益的同时考虑其他目标。

Python 代码实现

以下是Python代码的示例,用于模拟替代性和互补性影响下的最优种植策略。

import pandas as pd
import numpy as np
from scipy.optimize import linprog
import matplotlib.pyplot as plt

# Set matplotlib font to support Chinese characters
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# Load the provided Excel files
file_path_1 = '/mnt/data/附件1.xlsx'
file_path_2 = '/mnt/data/附件2.xlsx'

# Read the sheets from both files
land_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.1
cost_growth = 0.05
price_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()

解释

  1. 参数初始化:和问题2相似,基于2023年数据设置初始参数。
  2. 添加替代性与互补性系数:假设一个随机的替代性和互补性系数矩阵,用于模拟不同作物间的关系。
  3. 模拟过程:模拟未来每年的产量、成本等信息。

24国赛赛前准备:

论文中好的可视化内容至关重要 这里先分享一些国赛数学建模中的常用的可视化内容

数学建模中的可视化分析是一个重要的环节,它帮助研究者和观众更好地理解数据和模型的结果。以下是一些进阶的可视化分析方法和算法,以及相应的Python代码示例:

蒙特卡罗算法

算法介绍:蒙特卡罗算法是一种基于概率和随机性的方法,通过生成大量随机样本来模拟复杂系统的行为或计算数值解。它不依赖于严格的解析解,而是通过随机采样来估计问题的结果。例如,在估计圆周率π的值时,可以在一个正方形内随机生成点,然后计算落在内切圆内的点的比例,利用这个比例估计π的值。蒙特卡罗算法广泛应用于金融风险分析、物理学中的粒子行为模拟、复杂系统的概率分析等领域.

算法示例:

我们可以使用蒙特卡罗算法来估计三维图形的体积。下面是一个简单的Python程序,它使用蒙特卡罗算法来估计一个球体的体积,并使用Matplotlib库进行三维可视化。

import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

def 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) * 8

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

n = 10000
volume = 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 GradientBoostingClassifier
from sklearn.inspection import plot_partial_dependence
from 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 sns
import matplotlib.pyplot as plt

iris = sns.load_dataset("iris")

sns.pairplot(iris, hue="species", markers=["o", "s", "D"])

plt.show()

成对关系图的应用场景包括但不限于以下几个方面:

  1. 数据分析:成对关系图可以用于显示数据集中每个变量之间的关系,帮助数据分析人员更好地理解数据。
  2. 生物学:成对关系图可以用于显示基因表达数据的密度和分布情况,帮助生物学家更好地理解基因表达数据。
  3. 金融:成对关系图可以用于显示股票价格的密度和分布情况,帮助投资者更好地理解股票市场
  • 21
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值