一种JSSP的DRL环境

问题:

  1. JSSP的输入和输出方式?

  2. JSSP的处理过程?

  3. 为什么makespan结果会比其他的论文好?

  4. 代码中有哪些细节值得借鉴?

  5. 论文中的其他困惑点?

相关论文:

作者使用单智能体和多智能体来划分目前DRL方法的两大类

  1. 多智能体:2018 DQN,2020 DDPG效果更好

  2. 单智能体:2020 GNN+MLP,2020 CNN(处理时间,时间表,机器利用率)+DRL,2019 DQN+Rule

IO过程(问题1回答):

  1. 一次只读入一个实例

  2. 使用标准的JSSP文件(txt)方式读写,样例可看困惑点2

  3. 一个二维数组solution,若是-1表示没排,否则为开始运行的时间步

处理过程(问题2回答):

  1. 离散集合={Job是否加工-J$_i$,空闲状态},机器选择行为,行为对应作业和空闲

    1. 因此,对于每个Job而言,需要完成|M|个行为(机器的数量)。每个行为表示Job在每台机器上的加工时间,如果不需要在该机器上执行,可以当作一个0?

    2. 对于每个机器而言,需要运行至少|J|个与job有关的行为,加上若干个no-op(空闲)操作。

  2. 每到一个时间步(可以定义为1秒或者1分),每台机器进行一个行为选择

  3. 最终优先级:如果该Job已分配的行为数量等于|M|-1,说明最后一个动作已经确定了要在哪里执行。

  4. 奖励函数:作者定义了一个schedule area,在这区间内计算reward,可以获得更多个奖励函数,从而为强化学习使用。

奖励函数细读(问题3回答):

R(s,a)=pajmMemptym(s,s)paj是作到某个时刻的已排程时间总和a表示当前行为,s表示当前状态,s表示下一个状态emtptym(s,s)是计算机器m在两个状态之间的idle时间在实现的代码中,作者将所有的R都除以一个最大的工序加工时间来达到缩放R(s, a)=p_{a j}-\sum_{m \in \mathcal{M}} \operatorname{empty}_{m}\left(s, s^{\prime}\right) \\ p_{aj}是作到某个时刻的已排程时间总和\\ a表示当前行为,s表示当前状态,s^{\prime}表示下一个状态 \\ emtpty_{m}(s, s^{\prime})是计算机器m在两个状态之间的idle时间\\ 在实现的代码中,作者将所有的R都除以一个最大的工序加工时间来达到缩放

该函数相对于makespan能得到更紧密的解。

  1. 不用执行到最后一步,就能获得一个局部reward。

  2. makespan可以看成是全局p+empty,而这里是局部的p-empty,那么改变之处在于系数-1和全局变为局部。

代码中的优点(问题4回答):

  1. 作者新建自己环境的代码十分受用,让我对新建gym的环境有了一个详细的了解

  2. wandb和ray两个库的使用具有一定的启发,但可能更适合较大的项目

    1. wandb能够使得训练日志自动上传网络并绘图

    2. ray能够快速使得模型快速落地,并变成分布式,相比较spark更简单,更便捷

  3. 之后打算:

    1. 进一步看懂代码,模型代码很少,基本已看完,但环境的代码很复杂,还没看完。

    2. 先使用pytorch替换掉里面的ray的ppo模型,然后逐步调试,理解环境部分的代码

困惑点(未解决,问题5):

  1. 第四页中的问题对称性,讲述了一些JSS问题的对称性,通过破坏对称性,而降低搜索解空间的大小

    1. 同一时间步长中,操作具有对称性,也就是操作的执行顺序待定。怎么解决?以及为什么说直接赋予机器从小到大的索引会导致失去全局视图。

    2. 同一机器中,"运行"操作和"无运行"操作具有对称性,也就是op和no-op两者的执行顺序待定。解决方案:当no-op时,其他的操作临时设未不可执行。以及通过非最终状态优先调度的规则。

  2. 似乎JSSP问题是每个Job在每台机器上都有执行一定时间,还是说我看到的刚好是特例?

复现代码时候遇到的问题(已解决,记录):

  1. 'env': 'JSSEnv:jss-v1',该环境已经创建好并上传gym库中,作者使用的ray库会自动生成一个包含该环境名字的本地日志。而windows文件不允许冒号,所以需要修改ray库的底层代码中的日志文件名字生成方式。

代码阅读:

大体分三块

  1. 强化学习环境:已经注册成gym库的环境,各种强化学习包都可以用。

  2. CP.py:是使用OR tools的求解器,进行求解的方法,能达到比较好的解。

  3. mian.py:使用ray中的PPO算法,只修改了一个全连接层,然后定义了一些参数,就可以使用作者的环境来训练。

其他读后感主要写在代码注释中,目前均已跑通。

image-20220103201512024

最后更新于

这有帮助吗?