上传文件至 include/dispatch/rl
This commit is contained in:
150
include/dispatch/rl/rl_enhanced_agv_manager.h
Normal file
150
include/dispatch/rl/rl_enhanced_agv_manager.h
Normal file
@@ -0,0 +1,150 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user