2024国赛C题:基于强化学习和启发式算法的种植策略搜索方法

2024国赛C题:基于强化学习和启发式算法的种植策略搜索方法

具体介绍和代码请移步github!(求star求求了,给点鼓励)

建议直接看github(https://github.com/ArrebolBlack/CUMCM2024_C)

https://github.com/ArrebolBlack/CUMCM2024_C
如果有更深的思路、代码讲解需求,请star后留言,根据反馈会出后续

正文


大家好,我是参加2024年全国大学生数学建模竞赛 (CUMCM) C题的一位选手,在这篇博客中,我将分享我对于C题的解答思路、代码结构以及所用算法。希望能为同样对这个题目感兴趣的朋友提供一些思路和帮助。

C题大多数做法可能是当优化问题去做了,搞一些传统的优化模型什么的,我觉得这种方法没什么新意和挑战性,还是得来点不一样的

问题背景与核心思路

2024年的C题可以看作是在所有种植策略的空间中进行搜索的问题,或者是一个典型的序列生成问题。我的解法主要分为两个步骤:

  1. 构建评估函数:首先构造一个充分的评估函数,计算不同种植策略的总利润,即目标得分。
  2. 强化学习环境:基于评估函数定义一个强化学习环境,并在动作空间中进行搜索,逐步优化种植策略。

核心代码结构

我将项目中的主要功能模块化,核心代码分为以下几部分:

  • data_structure.py:负责处理数据,定义通用数据结构,提供接口。所有信息将转化为 result 格式,包括种植地块 (plots)、农作物 (crops)、年份 (years) 等,保证后续计算以张量形式进行,从而提高计算效率。

  • Object_function.py:定义目标函数和约束条件,构建评估函数,也就是整个项目中的 loss function

  • env.py:强化学习环境的定义,实现单步决策。

  • algo 目录:包含各种算法在强化学习环境中的具体实现,后面会详细介绍这些算法。

项目工具

在项目中,我还设计了一些辅助工具,帮助对目标函数进行采样统计和归一化处理。这些工具主要用于检查目标函数及其约束条件的分布情况。例如,eval_obj_no_parallel.py 系列就是用于多次采样统计一个函数的分布的工具,它帮助我更好地理解目标函数的表现。

此外,我也为一些算法和工具函数实现了并行和多线程的功能,以加快计算速度。如果你在项目中遇到效率问题,记得区分这些并行版本的工具。

搜索空间优化

初始的搜索空间定义为 (82, 41, 7),其中 82 代表地块数,41 代表农作物种类,7 代表年份。这是一个较大的空间,直接在这个空间中进行搜索会非常低效。

为了提高效率,我对搜索空间进行了优化,删除了无意义或不可能出现的点,将其压缩为 (1082, 7),极大地减少了计算复杂度。优化后的环境文件存储在 env_new.py 中,在 data_structure.py 中还实现了来回转换的函数。

解题思路

针对 C 题的解答,我将项目分为了两部分:

第一题

  1. 对于第一问,我直接使用了 data_structure.pyObject_function.pyenv_new.py
  2. 对于第二问,在上述代码的基础上稍作修改,改变目标函数的计算方式,使用了 Object_function_1.2.py

第二题

为了应对第二题的变化,我更换了未来七年种植数据的模拟方式。之前的解法是将2023年的情况复制,现在我根据题目要求进行了随机模拟。具体代码实现为 data_structure_2.py + Object_function.py + env_new.py

简化步骤

在简化的条件下,解题步骤如下:

  1. 第一题第一问data_structure.py + Object_function.py + env_new.py
  2. 第一题第二问data_structure.py + Object_function_1.2.py + env_new.py
  3. 第二题data_structure_2.py + Object_function.py + env_new.py

简单想法

我的基本思路是,先将环境模拟得足够真实,然后交给算法慢慢去优化。通过不断地在搜索空间中寻找最优解,可以实现种植策略的最优化。

算法介绍

在本项目中,我使用了多种算法来进行种植策略的搜索和优化,涵盖了简单搜索、深度强化学习和启发式算法。

简单搜索算法

  • Random_Agent:随机探索,模拟猴子乱猜的方式,进行随机策略选择。
  • epsilon-greedy 策略:在一定概率下随机选择动作,以平衡探索与开发。
  • UCB (上限置信界):由于是单步决策问题,可以看作多臂老虎机问题,UCB 算法帮助我在有限的动作空间中进行探索。

深度强化学习算法

  • DQN:经典的深度 Q 网络算法,用于解决强化学习中的离散动作选择问题。
  • DuelingDQN:对 DQN 的改进,分离了状态价值和动作优势函数,提升了算法的效果。
  • DuelingDQN + Attention:使用 Transformer 的嵌入层,捕捉输入输出之间的复杂关系,从而提升对 Q 值的预测准确性。
  • PPO + Transformer:这个算法的设计是将问题看作序列生成问题。输入 2023-2030 年的数据(如价格、成本、销售量、产量等),输出 2024-2030 年的种植策略。通过 PPO 框架结合 Transformer 来捕捉输入与输出之间的关联性。

启发式算法

  • GA (遗传算法):通过模拟自然选择、交叉、变异等过程寻找最优种植策略。
  • PSO (粒子群算法):粒子群算法通过模拟粒子群的协作,逐步靠近最优解。

项目结构

├── algo                        # 算法实现目录
│   ├── DQN                     # DQN 算法
│   ├── PPO+Transformer          # PPO + Transformer 实现
│   ├── ...                      # 其他算法
├── data_structure.py            # 数据处理及通用接口定义
├── Object_function.py           # 目标函数和约束条件
├── env.py                       # 强化学习环境定义
├── eval_obj_no_parallel.py       # 目标函数的多次采样统计
├── README.md                    # 项目说明文档
└── ...

结语

如果你对这篇博客或代码有任何疑问,欢迎与我交流!同时,也欢迎大家为项目 star,一起探讨种植策略优化问题。

联系方式
有问题或者想交朋友的同学可以通过我的邮箱联系我:207804110@qq.com


希望这篇博客对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值