151 lines
4.0 KiB
C++
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
|