9import multiprocessing
10import multiprocessing.connection
11
12import cv2
13import gym
14import numpy as np
මෙයOpenAI ජිම් ක්රීඩා පරිසරය සඳහා ඔතා. අපි මෙහි කරුණු කිහිපයක් කරන්නෙමු:
1. රාමු හතරක් මත එකම ක්රියාව යොදන්න සහ අවසාන රාමුව 2 ලබා ගන්න. නිරීක්ෂණ රාමු අළු පැහැයට පරිවර්තනය කර පරිමාණය කරන්න (84, 84) 3. අවසාන ක්රියා හතරේ රාමු හතරක් ගොඩගසන්න 4. 5 අධීක්ෂණය සඳහා කථාංග තොරතුරු එක් කරන්න (සමස්ත කථාංගය සඳහා සම්පූර්ණ විපාකය). කථාංගයක් තනි ජීවිතයකට සීමා කරන්න (ක්රීඩාවට ජීවිත 5 ක් ඇත, සෑම ජීවිතයකටම පසු අපි නැවත සකස් කරමු)
නිරීක්ෂණයයනු ප්රමාණයේ ආතන්ය (4, 84, 84). එය රාමු හතරක් (ක්රීඩා තිරයේ රූප) පළමු අක්ෂය මත එකමත. එනම්, එක් එක් නාලිකාව රාමුවක් වේ.
17class Game:
38 def __init__(self, seed: int):
පරිසරයනිර්මාණය කරන්න
40 self.env = gym.make('BreakoutNoFrameskip-v4')
41 self.env.seed(seed)
රාමු4 ක් සඳහා ටෙන්සර්
44 self.obs_4 = np.zeros((4, 84, 84))
අවසානරාමු 2 හි උපරිමය තබා ගැනීමට බෆරය
47 self.obs_2_max = np.zeros((2, 84, 84))
කථාංගවිපාක පිළිබඳ වාර්තාවක් තබා ගන්න
50 self.rewards = []
සහජීවිත ගණන
52 self.lives = 0
action
සඳහා ක්රියාත්මක 4 කාලය පියවර සහ ක tuple ආපසු (නිරීක්ෂණ, විපාකය, සිදු, episode_info).
observation
: රාමු 4 ක් (අවසාන ක්රියා 3 සඳහා මෙම රාමුව සහ රාමු) reward
: ක්රියාව ක්රියාත්මක කරන ලද අතර සම්පූර්ණ විපාකය done
: කථාංගය අවසන් වේවා (ජීවිතයක් අහිමි විය) episode_info
: සම්පූර්ණ නම් කථාංග තොරතුරු54 def step(self, action):
66 reward = 0.
67 done = None
පියවර4 ක් සඳහා ධාවනය කරන්න
70 for i in range(4):
OpenAIජිම්නේසියම පරිසරය තුළ ක්රියාව ක්රියාත්මක
72 obs, r, done, info = self.env.step(action)
73
74 if i >= 2:
75 self.obs_2_max[i % 2] = self._process_obs(obs)
76
77 reward += r
ජීවිතගණන ඉතිරි කර ගන්න
80 lives = self.env.unwrapped.ale.lives()
ජීවිතයක්නැති වුවහොත් නැවත සකසන්න
82 if lives < self.lives:
83 done = True
84 break
එක්එක් පියවර සඳහා ත්යාග පවත්වා ගන්න
87 self.rewards.append(reward)
88
89 if done:
අවසන්නම්, කථාංගය අවසන් නම් කථාංග තොරතුරු සකසන්න, සහ නැවත සකසන්න
91 episode_info = {"reward": sum(self.rewards), "length": len(self.rewards)}
92 self.reset()
93 else:
94 episode_info = None
අවසානරාමු දෙකේ උපරිම ලබා ගන්න
97 obs = self.obs_2_max.max(axis=0)
රාමු4 ක තොගයට එය තල්ලු කරන්න
100 self.obs_4 = np.roll(self.obs_4, shift=-1, axis=0)
101 self.obs_4[-1] = obs
102
103 return self.obs_4, reward, done, episode_info
105 def reset(self):
OpenAIGym පරිසරය
112 obs = self.env.reset()
හැඹිලිනැවත සකසන්න
115 obs = self._process_obs(obs)
116 for i in range(4):
117 self.obs_4[i] = obs
118 self.rewards = []
119
120 self.lives = self.env.unwrapped.ale.lives()
121
122 return self.obs_4
124 @staticmethod
125 def _process_obs(obs):
130 obs = cv2.cvtColor(obs, cv2.COLOR_RGB2GRAY)
131 obs = cv2.resize(obs, (84, 84), interpolation=cv2.INTER_AREA)
132 return obs
135def worker_process(remote: multiprocessing.connection.Connection, seed: int):
ක්රීඩාවසාදන්න
143 game = Game(seed)
සම්බන්ධතාවයෙන්උපදෙස් බලා ඒවා ක්රියාත්මක කරන්න
146 while True:
147 cmd, data = remote.recv()
148 if cmd == "step":
149 remote.send(game.step(data))
150 elif cmd == "reset":
151 remote.send(game.reset())
152 elif cmd == "close":
153 remote.close()
154 break
155 else:
156 raise NotImplementedError
නවසේවකයෙකු නිර්මාණය කර එය වෙනම ක්රියාවලියක් තුළ ක්රියාත්මක කරයි.
159class Worker:
164 def __init__(self, seed):
165 self.child, parent = multiprocessing.Pipe()
166 self.process = multiprocessing.Process(target=worker_process, args=(parent, seed))
167 self.process.start()