#ifndef RL_ENHANCED_AGV_MANAGER_H #define RL_ENHANCED_AGV_MANAGER_H #include "dispatch/enhanced_agv_manager.h" #include "dispatch/rl/dqn_agent.h" #include "dispatch/rl/state_encoder.h" #include #include /** * @brief RL增强的AGV管理器 * * 集成DQN强化学习智能体的增强AGV管理器 * 在原有EnhancedAGVManager基础上添加: * 1. 路径规划DQN优化 * 2. 任务分配DQN优化 * 3. 自动降级到传统算法 */ class RLEnhancedAGVManager : public EnhancedAGVManager { public: RLEnhancedAGVManager(GraphMap* map, ResourceManager* rm = nullptr); // ========== RL功能开关 ========== /** * @brief 启用路径规划DQN * @param model_path TorchScript模型文件路径 * @param num_candidates 候选路径数量 * @return 是否成功启用 */ bool enableRLForPath(const std::string& model_path, int num_candidates = 5); /** * @brief 启用任务分配DQN * @param model_path TorchScript模型文件路径 * @param num_agvs 最大AGV数量 * @return 是否成功启用 */ bool enableRLForAssignment(const std::string& model_path, int num_agvs = 10); /** * @brief 禁用RL功能 */ void disableRL(); // ========== 重写的方法 ========== /** * @brief 智能任务分配 (重写) * 如果启用了任务分配DQN, 使用RL选择; 否则使用父类方法 */ int assignTasksSmart() override; /** * @brief 查找路径 (重写) * 如果启用了路径规划DQN, 使用RL选择路径; 否则使用传统A* */ std::vector findPathForTask(AGV* agv, Task* task); // ========== RL特定的方法 ========== /** * @brief 使用RL选择最优路径 * @param agv 执行任务的AGV * @param task 任务 * @return 最优路径 */ std::vector selectOptimalPathWithRL(AGV* agv, Task* task); /** * @brief 使用RL选择AGV分配 * @param task 待分配任务 * @param available_agvs 可用AGV列表 * @return 选中的AGV索引 */ int selectAGVWithRL(Task* task, const std::vector& available_agvs); // ========== 配置和统计 ========== /** * @brief 设置候选路径数量 */ void setNumCandidates(int num) { num_candidates_ = num; } /** * @brief 路径规划RL是否可用 */ bool isRLPathAvailable() const { return use_rl_for_path_ && path_dqn_ && path_dqn_->isAvailable(); } /** * @brief 任务分配RL是否可用 */ bool isRLAssignmentAvailable() const { return use_rl_for_assignment_ && assignment_dqn_ && assignment_dqn_->isAvailable(); } /** * @brief 打印RL统计信息 */ void printRLStatistics(); private: // RL智能体 std::unique_ptr path_dqn_; std::unique_ptr assignment_dqn_; std::unique_ptr state_encoder_; // 配置 bool use_rl_for_path_; bool use_rl_for_assignment_; int num_candidates_; int num_agvs_; // 统计 struct RLStatistics { int path_decisions = 0; int path_fallbacks = 0; int assignment_decisions = 0; int assignment_fallbacks = 0; void reset() { path_decisions = 0; path_fallbacks = 0; assignment_decisions = 0; assignment_fallbacks = 0; } } rl_stats_; // ========== 内部辅助方法 ========== /** * @brief 执行RL任务分配 */ int assignTasksWithRL(); /** * @brief 分配单个任务 */ bool assignSingleTask(AGV* agv, Task* task); /** * @brief 获取可用AGV列表 */ std::vector getAvailableAGVs(); /** * @brief 获取待处理任务列表 */ std::vector getPendingTasks(); }; #endif // RL_ENHANCED_AGV_MANAGER_H