一种JSSP的DRL环境
问题:
JSSP的输入和输出方式?
JSSP的处理过程?
为什么makespan结果会比其他的论文好?
代码中有哪些细节值得借鉴?
论文中的其他困惑点?
相关论文:
作者使用单智能体和多智能体来划分目前DRL方法的两大类
多智能体:2018 DQN,2020 DDPG效果更好
单智能体:2020 GNN+MLP,2020 CNN(处理时间,时间表,机器利用率)+DRL,2019 DQN+Rule
IO过程(问题1回答):
一次只读入一个实例
使用标准的JSSP文件(txt)方式读写,样例可看困惑点2
一个二维数组solution,若是-1表示没排,否则为开始运行的时间步
处理过程(问题2回答):
离散集合={Job是否加工-J$_i$,空闲状态},机器选择行为,行为对应作业和空闲
因此,对于每个Job而言,需要完成|M|个行为(机器的数量)。每个行为表示Job在每台机器上的加工时间,如果不需要在该机器上执行,可以当作一个0?
对于每个机器而言,需要运行至少|J|个与job有关的行为,加上若干个no-op(空闲)操作。
每到一个时间步(可以定义为1秒或者1分),每台机器进行一个行为选择
最终优先级:如果该Job已分配的行为数量等于|M|-1,说明最后一个动作已经确定了要在哪里执行。
奖励函数:作者定义了一个schedule area,在这区间内计算reward,可以获得更多个奖励函数,从而为强化学习使用。
奖励函数细读(问题3回答):
该函数相对于makespan能得到更紧密的解。
不用执行到最后一步,就能获得一个局部reward。
makespan可以看成是全局p+empty,而这里是局部的p-empty,那么改变之处在于系数-1和全局变为局部。
代码中的优点(问题4回答):
作者新建自己环境的代码十分受用,让我对新建gym的环境有了一个详细的了解
wandb和ray两个库的使用具有一定的启发,但可能更适合较大的项目
wandb能够使得训练日志自动上传网络并绘图
ray能够快速使得模型快速落地,并变成分布式,相比较spark更简单,更便捷
之后打算:
进一步看懂代码,模型代码很少,基本已看完,但环境的代码很复杂,还没看完。
先使用pytorch替换掉里面的ray的ppo模型,然后逐步调试,理解环境部分的代码
困惑点(未解决,问题5):
第四页中的问题对称性,讲述了一些JSS问题的对称性,通过破坏对称性,而降低搜索解空间的大小
同一时间步长中,操作具有对称性,也就是操作的执行顺序待定。怎么解决?以及为什么说直接赋予机器从小到大的索引会导致失去全局视图。
同一机器中,"运行"操作和"无运行"操作具有对称性,也就是op和no-op两者的执行顺序待定。解决方案:当no-op时,其他的操作临时设未不可执行。以及通过非最终状态优先调度的规则。
似乎JSSP问题是每个Job在每台机器上都有执行一定时间,还是说我看到的刚好是特例?
复现代码时候遇到的问题(已解决,记录):
'env': 'JSSEnv:jss-v1',该环境已经创建好并上传gym库中,作者使用的ray库会自动生成一个包含该环境名字的本地日志。而windows文件不允许冒号,所以需要修改ray库的底层代码中的日志文件名字生成方式。
代码阅读:
大体分三块
强化学习环境:已经注册成gym库的环境,各种强化学习包都可以用。
CP.py:是使用OR tools的求解器,进行求解的方法,能达到比较好的解。
mian.py:使用ray中的PPO算法,只修改了一个全连接层,然后定义了一些参数,就可以使用作者的环境来训练。
其他读后感主要写在代码注释中,目前均已跑通。
最后更新于
这有帮助吗?