多动作多环境设置

之前策略

  1. 之前只有一个动作和一个环境,所以动作发完之后再传递环境值,一个step完成
  2. 多环境多动作由于目前DSSim不能并行,所以不能做到动作先发完,再法环境。

解决策略

  1. 接收时不再对action\env分别接收,使用RLMessageHandler.communicate()统一接收,因为DSSim中的逻辑保证了环境的接收会在收动作之前,所以只需要对action\env的总数进行统计,信号接收数量够之后就说明收够了。
  2. 现在用户需要自己设置action和env的名字,并要保证不同,来进行区别。之前说过使用id来通信,但是对用户来说用户看不到id,还是使用自己定义的名字更清楚一些。
  3. 目前的RL线程的使用方法如下:
     def rl_run(early_stop_event, episodes):
         rl_message_handler = RLMessageHandler(early_stop_event)
         rl_message_handler.set_action_names(['action_a', 'action_b'])
         rl_message_handler.set_environment_names(['environment_a', 'environment_b'])
     
         for episode in range(episodes):
             print("\nRL开始episode ", episode)
             action_a = 1
             action_b = 1
             while True:
                 rl_message_handler.set_action('action_a', action_a)
                 rl_message_handler.set_action('action_b', action_b)
                 dssim_terminate, environment = rl_message_handler.communicate()
                 if dssim_terminate:
                     break
                 action_a = environment['environment_a']
                 action_b = environment['environment_b']
                 if environment['environment_a'] == [[5]] and episode == 1:
                     print("\nstop!!!!!\n")
                     rl_message_handler.stop()
             rl_message_handler.reset()
             print("RL结束episode ", episode, "\n")
         print("rl_run全部结束了")   
    

本文章使用limfx的vscode插件快速发布