2024国赛C题:基于强化学习和启发式算法的种植策略搜索方法
这篇博客分享了2024年全国大学生数学建模竞赛 (CUMCM) 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题可以看作是在所有种植策略的空间中进行搜索的问题,或者是一个典型的序列生成问题。我的解法主要分为两个步骤:
- 构建评估函数:首先构造一个充分的评估函数,计算不同种植策略的总利润,即目标得分。
- 强化学习环境:基于评估函数定义一个强化学习环境,并在动作空间中进行搜索,逐步优化种植策略。
核心代码结构
我将项目中的主要功能模块化,核心代码分为以下几部分:
-
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 题的解答,我将项目分为了两部分:
第一题
- 对于第一问,我直接使用了
data_structure.py
、Object_function.py
和env_new.py
。 - 对于第二问,在上述代码的基础上稍作修改,改变目标函数的计算方式,使用了
Object_function_1.2.py
。
第二题
为了应对第二题的变化,我更换了未来七年种植数据的模拟方式。之前的解法是将2023年的情况复制,现在我根据题目要求进行了随机模拟。具体代码实现为 data_structure_2.py
+ Object_function.py
+ env_new.py
。
简化步骤
在简化的条件下,解题步骤如下:
- 第一题第一问:
data_structure.py
+Object_function.py
+env_new.py
- 第一题第二问:
data_structure.py
+Object_function_1.2.py
+env_new.py
- 第二题:
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
希望这篇博客对你有所帮助!
更多推荐
所有评论(0)