微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过多处理管道时,OpenAI Gym的突破会重置

如何解决通过多处理管道时,OpenAI Gym的突破会重置

当通过多处理管道传递OpenAI体育馆突破环境的进行中实例时,体育馆环境将被重置而不会被调用。当通过CartPole-v0环境时不会发生这种情况,该环境在通过管道传输时会保留其进度。我希望能够在转会之间保留突破游戏的状态。

任何建议将不胜感激。

这是我的代码演示的问题。通过env.render()可以轻松观察游戏状态,并显示在管道传输之前和之后会发生变化:

    <form id="myfrm" autocomplete="off" style="margin-left:20px" method="POST" action="" enctype="multipart/form-data">
              <div class="row">
                <div class="col-lg-12">
                  <div class="form-group">
                    <textarea class="form-control required" name="personal-msg" type="text" placeholder="Your Personal Message"></textarea>
                  </div>
                </div>
                <div class="col-lg-6">
                  <div class="form-group">
                    <input class="form-control required" type="text" name="name" placeholder="Full Name">
                  </div>
                </div>
        <button type="submit" name="submit" class="btn btn-md btn-block btn-danger-gradiant text-white border-0"><span> Create Account</span></button>
    
    
    </form>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.bundle.min.js"></script>
  <script src="assets/js/script.min.js"></script>
  <script src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.10.0/jquery.validate.js" type="text/javascript"></script>

更新:使用$(document).on('submit','#myfrm',function(e) { $("html,body").animate({ scrollTop: 0 },200); $("#wait").css("display","block"); $.ajax({ type: $(this).attr('method'),data: $(this).serialize(),success: function(html) { $('#test').html(data); setTimeout(function() { $("#wait").css("display","none"); $(".main").remove(); $(".right-image").remove(); $(".reg-success").show(); },2000); },error: function(xhr,status,error) { var err = JSON.parse("(" + xhr.responseText + ")"); alert(err.Message); } }); e.preventDefault(); }); 创建包含环境的Value代理对象无济于事。大概是由于SyncManager使用管道进行通信。

更新:看来使用 <?PHP if (isset($_POST["submit"])) { $name = $_POST['name']; $email = $_POST['email']; //database stuff } ?> 模块转储并加载环境会导致其重置。我相信多处理中的Pipes使用pickle序列化要传输的对象。仍然没有解决方法

更新:将import gym import time from multiprocessing import Process,Pipe def new_process(steps,pipe): if pipe.poll(None): env = pipe.recv() env.render() print('Second') time.sleep(2) env.close() for _ in range(steps): env.step(env.action_space.sample()) env.render() print('Third') time.sleep(2) env.close() pipe.send(env) if __name__ == "__main__": env = gym.make('Breakout-v0') env.reset() steps = 10 for _ in range(steps): env.step(env.action_space.sample()) env.render() print('First') time.sleep(2) env.close() parent,child = Pipe() p = Process(target=new_process,args=[steps,child]) p.start() parent.send(env) if parent.poll(None): env = parent.recv() env.render() print('Fourth') time.sleep(2) env.close() 的结果通过管道传递并重新加载multiprocessing.Manager会导致访问冲突。

pickle

这很可能是由于子进程试图访问属于父进程的内存地址,而这本不应该这样做的。

更新:将环境封装在env_state = env.ale.clonestate()包装器中,因此强制使用cloudpickle而不是pickle序列化多处理。

看上去还是

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。