论文复现:Event-Triggered Deep Reinforcement Learning for Dynamic Task Scheduling in Multisatellite Resource Allocation
原论文:https://ieeexplore.ieee.org/document/9998480
Multisatellite_Task_Scheduling/
│
├── README.md # 项目说明文件
│
├── requirements.txt # 项目依赖文件
│
├── config.py # 配置文件,包含超参数
│
├── utils.py #
│
├── models/
│ ├── __init__.py
│ ├── resfcn.py # ResFCN
│ └── ddqn_agent.py # ddqn智能体定义
│
├── trainers/
│ ├── __init__.py
│ └── ddqn_trainer.py # 训练器
│
├── simulators/
│ ├── __init__.py
│ ├── Env.py # 卫星调度环境模拟
│ └── satellite_simulator.py # 卫星任务调度模拟器
│
├── evaluator.py # 评估
├── main.py # 训练
│
└── ...
需要维护以下:
- 状态空间(State Space):最大资源卫星数 x 最大beam数 x schedule_horizon中的grid数量。其中,1表示被占用,0表示空闲。
- 动作空间(Action Space):输出[0,资源卫星数], 表示对当前任务分配的卫星编号,0表示不分配。所以具体调度到哪个 beam 需要根据 limitation 轮询。
- 奖励函数(Reward Function):根据原文中的 reward = 成功调度数 + 优先级 - 切换次数
- 观察(Observation):提供当前状态,以及当前状态下 next task 可调度的部分。
- 模拟(Simulation):卫星的剩余能量、卫星是否处于region中,触发事件。
使用stable-baseline3 DQN
- 任务生成:
task属性:所属task satellite的id;优先级;可执行的时间窗口;执行时间;能耗。
task预先生成,局部贪心:按照开始时间排序,同时开始的按照priority排序。
- 资源卫星状态:
维护能量信息,剩余能量和最小能量。
- 任务卫星状态:
记录上一次task的调度对象,用于计算switch次数
- 资源卫星进入进出region的事件触发机制
将进入进出包装为一个task,效果是资源卫星离开后,其所有grid被处理为占用状态。
- 卫星充电问题:
也可以作为一个task放入队列,修改剩余能量。
- task执行时长 < schedule_horizon
- 同一个task satellite生成的task可执行窗口不重叠
- 不可预定义task数量,但可以通过调整task satellite的数量来增加task数量
实验参数:
- 总时长 5000
- 任务卫星数量 30
- 资源卫星数量 6*4(beams)
- 调度窗口 100
- 滑动步长 40
- 充电时长 30
实验结果: Total step: 4838 Average reward: 5.691194708557255 Success rate: 0.9243489045059942 Success priority: 24810 / 26742 Total switch: 2764