Files
RCS-3000/include/dispatch/rl/rl_enhanced_agv_manager.h

151 lines
4.0 KiB
C++

#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 <memory>
#include <string>
/**
* @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<Path*> findPathForTask(AGV* agv, Task* task);
// ========== RL特定的方法 ==========
/**
* @brief 使用RL选择最优路径
* @param agv 执行任务的AGV
* @param task 任务
* @return 最优路径
*/
std::vector<Path*> selectOptimalPathWithRL(AGV* agv, Task* task);
/**
* @brief 使用RL选择AGV分配
* @param task 待分配任务
* @param available_agvs 可用AGV列表
* @return 选中的AGV索引
*/
int selectAGVWithRL(Task* task, const std::vector<AGV*>& 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<PathPlanningDQNAgent> path_dqn_;
std::unique_ptr<TaskAssignmentDQNAgent> assignment_dqn_;
std::unique_ptr<StateEncoder> 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<AGV*> getAvailableAGVs();
/**
* @brief 获取待处理任务列表
*/
std::vector<Task*> getPendingTasks();
};
#endif // RL_ENHANCED_AGV_MANAGER_H