如何解决通过多处理管道时,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 举报,一经查实,本站将立刻删除。