上传文件至 include/dispatch/rl

This commit is contained in:
TY
2026-01-12 10:01:34 +08:00
parent ccf5cba672
commit 84bf85fa25
3 changed files with 425 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
#ifndef STATE_ENCODER_H
#define STATE_ENCODER_H
#include "dispatch/graph_map.h"
#include <vector>
#include <memory>
// 前向声明
class ResourceManager;
class AGV;
/**
* @brief 任务结构体 (简化版)
*/
struct Task {
int id;
int start_point_id;
int end_point_id;
int priority;
double deadline;
double time_remaining;
};
/**
* @brief 状态编码器
*
* 将C++对象编码为DQN可用的状态向量
*/
class StateEncoder {
public:
StateEncoder(GraphMap* map, ResourceManager* rm);
// ========== 路径规划状态编码 (35维) ==========
/**
* @brief 编码路径规划状态
*
* 状态组成 (35维):
* - 任务信息 (3维): 起点(x,y)、终点(x)
* - AGV状态 (4维): 位置(x,y)、速度、电量
* - 候选路径特征 (20维): 5条路径 × 4特征
* - 全局拥堵 (4维): 各区域占用AGV数
* - 时间信息 (2维): 当前时段、历史拥堵预测
* - 紧急度 (2维): 任务优先级、剩余时间
*/
std::vector<float> encodePathPlanningState(
AGV* agv,
Task* task,
const std::vector<std::vector<Path*>>& candidates
);
/**
* @brief 编码单条路径特征
*/
std::vector<float> encodeSinglePathFeatures(
const std::vector<Path*>& path
);
// ========== 任务分配状态编码 (~85维) ==========
/**
* @brief 编码任务分配状态
*
* 状态组成 (~85维):
* - 任务特征 (8维): 起终点坐标、距离、优先级、截止时间、类型
* - 可用AGV池 (50维): 10辆AGV × 5特征
* - 全局状态 (7维): 等待任务数、执行中任务数等
* - 资源状态 (20维): 关键路径占用情况
* - 时间特征 (2维): 时段、历史成功率
*/
std::vector<float> encodeDispatchState(
Task* task,
const std::vector<AGV*>& available_agvs
);
/**
* @brief 编码单个AGV特征
*/
std::vector<float> encodeSingleAGVFeatures(
AGV* agv,
Point* task_start
);
// ========== 工具函数 ==========
/**
* @brief 归一化到[0, 1]
*/
static float normalize(float value, float min, float max) {
if (max - min < 1e-6f) return 0.5f;
return (value - min) / (max - min);
}
/**
* @brief 裁剪到[0, 1]
*/
static float clip(float value) {
return std::max(0.0f, std::min(1.0f, value));
}
private:
GraphMap* map_;
ResourceManager* resource_manager_;
// 地图边界
float map_min_x_, map_max_x_;
float map_min_y_, map_max_y_;
float max_path_length_;
/**
* @brief 初始化地图边界
*/
void initializeMapBounds();
/**
* @brief 计算区域拥堵情况
*/
std::vector<int> calculateZoneOccupancy(int num_zones = 4);
/**
* @brief 计算路径平滑度
*/
float calculatePathSmoothness(const std::vector<Path*>& path);
};
#endif // STATE_ENCODER_H