【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提

2024-09-06 02:28

本文主要是介绍【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2024年国赛C题解题思路

C   农作物的种植策略

根据乡村的实际情况,充分利用有限的耕地资源,因地制宜,发展有机种植产业,对乡村经济的可持续发展具有重要的现实意义。选择适宜的农作物,优化种植策略,有利于方便田间管理,提高生产效益,减少各种不确定因素可能造成的种植风险。

某乡村地处华北山区,常年温度偏低,大多数耕地每年只能种植一季农作物。该乡村现有露天耕地 1201 亩,分散为 34 个大小不同的地块,包括平旱地、梯田、山坡地和水浇地 4 种类型。平旱地、梯田和山坡地适宜每年种植一季粮食类作物;水浇地适宜每年种植一季水稻或两季蔬菜。该乡村另有16 个普通大棚和4 个智慧大棚,每个大棚耕地面积为0.6 亩。普通大棚适宜每年种植一季蔬菜和一季食用菌,智慧大棚适宜每年种植两季蔬菜。同一地块(含大棚)每季可以合种不同的作物。详见附件1。

根据农作物的生长规律,每种作物在同一地块(含大棚)都不能连续重茬种植,否则会减产;因含有豆类作物根菌的土壤有利于其他作物生长,从 2023 年开始要求每个地块(含大棚)的所有土地三年内至少种植一次豆类作物。同时,种植方案应考虑到方便耕种作业和田间管理,譬如:每种作物每季的种植地不能太分散,每种作物在单个地块(含大棚)种植的面积不宜太小,等等。2023年的农作物种植和相关统计数据见附件 2。

请建立数学模型,研究下列问题:

问题1 假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于 2023 年保持稳定,每季种植的农作物在当季销售。如果某种作物每季的总产量超过相应的预期销售量,超过部分不能正常销售。请针对以下两种情况,分别给出该乡村 2024~2030 年农作物的最优种植方案,将结果分别填入result1_1.xlsx 和result1_2.xlsx 中(模板文件见附件3)。

(1)  超过部分滞销,造成浪费;

(2)  超过部分按2023 年销售价格的50%降价出售。

【题目分析】

任务:在假定农作物的销售量、种植成本、亩产量和销售价格稳定的情况下,为乡村2024-2030年制定最优的种植方案。需要考虑两种情况:

  1. 滞销浪费:超出部分无法销售,需合理分配种植面积,避免浪费。
  2. 降价出售:超出部分按50%的价格出售,这可能影响种植策略,需要平衡不同农作物的收益和种植面积。

【初步思路】

第一问的详细思路与建模过程

问题背景:

我们需要在假定农作物的销售量、种植成本、亩产量和销售价格稳定的情况下,为乡村2024-2030年制定最优种植方案。目标是最大化利润,并要考虑两种情况:

  1. 滞销浪费:超过部分无法销售,造成浪费。
  2. 降价出售:超过部分按原售价的50%处理。

【解题思路】

一、问题转化为数学模型

1. 变量定义

  • 地块变量
    • 记Ai 表示第 i 个地块的面积(亩),i=1,2,...,n,其中n=34 。
    • 每个地块可以种植不同的作物,记 Xu 为第i个地块种植第j种作物的面积(亩),j=1,2,...,m,其中 m 是作物种类。
  • 作物产量和价格
    • 记 Yj为第j种作物的单位面积产量(吨/亩),Pj 为该作物的单位售价(元/吨)。
  • 成本和收益
    • 记 Cj 为种植第j种作物的单位面积成本(元/亩)。
    • 收益为作物销售量与售价的乘积,超出销售量部分按不同情况处理。
  • 作物销售量约束
    • 设第j种作物的预期销售量为 Sj(吨),当种植量超过此值,需根据不同情况处理。

2. 目标函数

目标是最大化2024-2030年种植方案的总利润。首先,作物的总产量为:

基于此,作物的利润分为两种情况:

  1. 滞销浪费: 当 QU≤SJ 时,所有产量均以正常价格出售;当 QU>SJ 时,超过部分无法出售。总利润为:

      2. 降价出售: 当 QU>SJ 时,超过部分以50%的价格出售,收益为:

整个种植方案的总利润为所有地块和作物的利润之和:

      3. 约束条件

  • 面积约束:每个地块的作物种植面积不能超过总面积:

  • 作物适应性约束:不同地块只能种适宜的作物。例如,梯田和山坡地只能种粮食类作物,水浇地可以种水稻或蔬菜。
  • 轮作约束:每块地在三年内至少种一次豆类作物。用二进制变量 Bij 表示某季是否种植豆类作物:

二、引入智能优化算法

由于问题涉及多个地块、多种作物,并且有复杂的约束条件和非线性目标函数,使用智能优化算法(如遗传算法)更为适合。

1. 遗传算法(GA)概述

  • 编码:每个地块的种植方案表示为一个基因,整个种植方案为一个个体。
  • 适应度函数:适应度函数为目标函数,即总利润,目标是通过选择、交叉、变异操作逐步优化种植方案。
  • 操作步骤
    1. 初始种群生成:随机生成一批种植方案。
    2. 适应度评估:计算每个方案的总利润。
    3. 选择:根据适应度高低选择个体。
    4. 交叉与变异:生成新个体并确保种群多样性。
    5. 终止条件:达到设定迭代次数或适应度不再显著提高。

2. 遗传算法的公式表示

  • 选择操作:轮盘赌选择法,个体被选中的概率为:

其中 fi为第 i 个个体的适应度,N 为种群大小。

  • 交叉操作:两个种植方案交叉生成新的方案,交叉概率为Pc,生成新个体的公式为:

变异操作:随机调整种植面积,变异概率为Pm。

Python参考代码】

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import linprog
import random
import seaborn as sns# 读取农作物信息(面积、作物类型、单价、产量等)
land_data = pd.read_excel('/path/to/附件1.xlsx')
production_data = pd.read_excel('/path/to/附件2.xlsx')# 地块面积信息
area = land_data['地块面积'].values# 2023年农作物信息,包括单价、种植成本、产量等
crop_data = production_data[['作物类型', '产量', '单价', '种植成本', '预期销售量']].set_index('作物类型')# 从crop_data提取变量
yield_per_acre = crop_data['产量'].values
price_per_ton = crop_data['单价'].values
cost_per_acre = crop_data['种植成本'].valuessales_expectation = crop_data['预期销售量'].values# 变量数量
num_land_blocks = len(area)  # 地块数量
num_crops = len(crop_data)   # 作物种类数量# 遗传算法相关参数
population_size = 50
generations = 100
mutation_rate = 0.01# 初始化种群
def init_population(size):return np.random.rand(size, num_land_blocks, num_crops)# 适应度函数,计算总利润
def fitness(individual):profit = 0for i in range(num_land_blocks):for j in range(num_crops):planted_area = individual[i, j] * area[i]production = planted_area * yield_per_acre[j]if production <= sales_expectation[j]:profit += production * price_per_ton[j] - planted_area * cost_per_acre[j]else:surplus = production - sales_expectation[j]profit += sales_expectation[j] * price_per_ton[j] + surplus * (price_per_ton[j] / 2) - planted_area * cost_per_acre[j]return profitchild1.flat[point:], child2.flat[point:] = parent2.flat[point:], parent1.flat[point:]return child1, child2# 变异操作
def mutate(individual):if np.random.rand() < mutation_rate:i = np.random.randint(num_land_blocks)j = np.random.randint(num_crops)individual[i, j] = np.random.rand()return individual# 主遗传算法过程
def genetic_algorithm():population = init_population(population_size)best_solution = Nonebest_fitness = float('-inf')fitness_history = []for generation in range(generations):population = selection(population)new_population = []# 交叉产生新个体for i in range(0, len(population), 2):parent1 = population[i]parent2 = population[min(i+1, len(population)-1)]child1, child2 = crossover(parent1, parent2)new_population.append(mutate(child1))new_population.append(mutate(child2))population = np.array(new_population)# 记录最佳个体gen_best = max(population, key=fitness)gen_best_fitness = fitness(gen_best)fitness_history.append(gen_best_fitness)if gen_best_fitness > best_fitness:best_solution = gen_bestbest_fitness = gen_best_fitnessprint(f"Generation {generation + 1}: Best Fitness = {best_fitness}")return best_solution, fitness_history# 运行遗传算法
best_solution, fitness_history = genetic_algorithm()# 总利润随代数变化趋势
plt.figure(figsize=(10, 6))
plt.plot(fitness_history, label='Total Profit')
plt.xlabel('Generations')
plt.ylabel('Profit')
plt.title('Total Profit Over Generations')
plt.legend()
plt.grid(True)
plt.show()# 各地块的最佳作物种植方案
def plot_solution(solution):plt.figure(figsize=(12, 8))sns.heatmap(solution, annot=True, fmt=".2f", cmap='Blues', xticklabels=crop_data.index, yticklabels=land_data['地块名称'])plt.title("Optimal Crop Distribution Across Lands")plt.xlabel("Crops")plt.ylabel("Land Blocks")plt.show()# 可视化最佳种植方案
plot_solution(best_solution)

这篇关于【2024数模国赛赛题思路公开】国赛C题思路丨附可运行代码丨无偿自提的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140742

相关文章

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实