Welcome to pysc2
์ด ์ฅ์์ ๋ฐฐ์ธ ๊ฒ
์ด ์ฅ์์๋ ์์ฃผ ๊ธฐ์ด์ ์ธ Pysc2๋ฅผ ๋ค๋ฃจ๋ ๋ฒ์ ์์๋ณผ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋๊ตฌ๊ฐ ๊ทธ๋ ๋ฏ, ๋ค๋ฃจ๊ธฐ ์ํด์ ๊ทธ๊ฒ์ ์์๊ฐ๋ ๊ณผ์ ์ด ํ์ํฉ๋๋ค. ์์๊ฐ๋ ๊ณผ์ ์ ํญ์ ๋ฏ์ค์ง๋ง ์ธ๋ด์ฌ์ ๊ฐ์ง๊ณ ํฅ๋ฏธ๋ฅผ ๋ถ์ธ๋ค๋ฉด ์ฝ๊ฒ ๋์ด์ค์ค ์ ์์ ๊ฒ์ ๋๋ค.
ํ์ง๋ง Basic about pysc2์์ ๊ณผํ๊ฒ ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ด ์๋๋ฐ(์๊ฐ๋ณด๋ค ๋ค๋ฃจ๋๊ฒ ๊น๋ค๋ก์ ์ด์) ์ดํด๊ฐ ์๋๊ฑฐ๋ ๋๋ฌด ๊น๋ค ์ถ์ผ๋ฉด ๊ณผ๊ฐํ๊ฒ ๋ฒ๋ฆฌ์ ๋ ์ถฉ๋ถํฉ๋๋ค.
Pysc2๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์ ๋๋ฒ์ผ๋ก ๋๋์๋๋ฐ, ์ด ์ฒซ๋ฒ์งธ pysc2 handling ์ฅ์์ ๋ฐฐ์ธ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ ํ๊ฒฝ ์ธํ ๋ฐ ํ๊ฒฝ ๋์ ์๋ฆฌ ์ดํด
Simple64 ๋งต์์ ํ ๋ ์ข ์กฑ์ ์ด์ฉํด rule base๋ก ๊ฑด๋ฌผ์ ์ง๊ณ ์์ฃผ์ฌ์ ๋ชจ๋์ ๋ด์ ์ด๊ธฐ๋ ๊ฒ ๊น์ง๊ฐ ๋ชฉํ์ ๋๋ค.
Mini game ์ ์ํ ํ๊ฒฝ ์ค์
FindAndDefeatZerglings ๋งต์ ํ์ตํ๊ธฐ ์ํ ๊ธฐ์ด ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
Pysc2 ๋ฅผ ํตํ ๊ธฐ์ด ํ๊ฒฝ ์ธํ
๋จผ์ ํด์ผํ ๊ฒ์ pysc2์์ environment๋ฅผ ์ธํ ํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๊ธฐ ์ํด์ pysc2.env๋ฅผ import ํ๊ฒ ์ต๋๋ค.
from pysc2.env import sc2_env
์ด๋ฅผ ๊ฐ์ง๊ณ , ๋งต, ํ๋ ์ด์ด์ธํ (๋ง๋ค์ด์ง ํ๋ ์ด์ด๋ฅผ ํ๊ฒฝ์ ์ฌ๋ ค๋๋ ๊ฒ์ด๋ฏ๋ก ํ๋ ์ด์ด๋ base_agent๋ฅผ ์์๋ฐ์ ํด๋์ค๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํฉ๋๋ค.), ์ธํฐํ์ด์ค ํฌ๊ธฐ, ์๊ฐํ ์ฌ๋ถ, realtime ์ฌ๋ถ, APM ์ค์ ๋ฑ์ ํ ์ ์์ต๋๋ค.
ํ๋ํ๋ ๋ง๋ค์ด ๋ณด๋ฉด, Map์ tutorial์์ ๊ฐ์ฅ ๋ง์ด ๋ฑ์ฅํ๋ Simple64๋ก ํ๊ฒ ์ต๋๋ค.
MAPNAME = 'Simple64'
ํ๋ ์ด์ด๋ ์ฌ๋ฌ๋ถ๋ค์ด ๋ง๋ค Agent๋ฅผ ๋ฃ์ ๊ฒ์ด๊ณ , ํ๋๋ Bot์ ๋ฃ์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋์ข ์กฑ์, ๋ด์ ์ ๊ทธ๋ฅผ ๋ฃ๊ณ ์์ฃผ ์ฌ์ด ๋์ด๋๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค.
players = [sc2_env.Agent(sc2_env.Race.terran),\
sc2_env.Bot(sc2_env.Race.zerg,\
sc2_env.Difficulty.very_easy)]
interface๋ map์ ๋ช๋ฑ๋ถํ ์ง, minimap์ ๋ช๋ฑ๋ถํ ์ง ์ ํฉ๋๋ค. int๋ก ๋ฃ์ด์ฃผ๋ฉด ์ ์ฌ๊ฐํ์ interface๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๋ํ use_feature_units๋ฅผ ํตํด ๋ณด์ด๋ unit์ ๋ํ ์ ๋ณด๋ฅผ ์ง์ ์ป์ ์ ์์ต๋๋ค.
import pysc2.lib import features
SCREEN_SIZE = 84
MINIMAP_SIZE = 64
interface = features.AgentInterfaceFormat(\
feature_dimensions = features.Dimensions(\
screen = SCREEN_SIZE, minimap = MINIMAP_SIZE), use_feature_units = True)
APM, max episode length๋ฅผ unlimit์ ํ๊ธฐ ์ํ ๊ฐ ์ค์ ๊ณผ, visualize ์ค์ , realtime ์ฌ๋ถ๋ฅผ ์ค์ ํฉ๋๋ค.
APM = 300
APM = int(APM / 18.75)
UNLIMIT = 0
VISUALIZE = True
REALTIME = True
์ด ํ๋ผ๋ฏธํฐ๋ค์ ๊ฐ์ง๊ณ , sc2_env๋ด์ SC2Env๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
with sc2_env.SC2Env(map_name = MAPNAME, players = players,\
agent_interface_format = interface,\
step_mul = APM, game_steps_per_episode = UNLIMIT,\
visualize = VISUALIZE, realtime = REALTIME) as env:
pass
environment๋ฅผ ์ด์ด๋๊ณ ํ๊ฒฝ์ ์ปจํธํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ค์์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค.
์ด์ ์ ์ ๊ฐ Controlํ Agent๋ฅผ ๋ง๋ค๋ฉด,
from pysc2.agents import base_agent
from pysc2.lib import actions
class Agent(base_agent.BaseAgent):
def step(self,obs):
super(Agent,self).step(obs)
return actions.FUNCTIONS.no_op()
agent = Agent()
๋ค์๊ณผ ๊ฐ์ต๋๋ค. Agent๋ฅผ ๋ง๋ค๊ธฐ ์ํด base_agent๋ฅผ importํ๊ณ , Agent๊ฐ ํ๋ํ ์ ์๋ ํ๋๋ค์ ์ฌ์ฉํ๊ธฐ์ํด actions๋ฅผ importํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ง๋ , ์๋ฌด action๋ ์ทจํ์ง ์๋ agent๋ฅผ ๋ง๋ ๊ฒ์ ๋๋ค.
Agent๋ environment์์ ์ค์ ๋ ํฑ๋ง๋ค step์ ์คํํ๋๋ฐ, ์ด๋ action๋ค์ ๋ด๊ณ ์๋ actions๋ฅผ ๋ถ๋ฌ์ no_op()์ ์คํ์์ผ ์๋ฌด ํ๋๋ ์ํ๋๋ก Agent๋ฅผ ์ค๊ณํฉ๋๋ค.
์ด์ ์์์ ๋ง๋ ๊ฒ๋ค์ ์ข ํฉํ
from pysc2.env import sc2_env
from pysc2.lib import features
from pysc2.agents import base_agent
from pysc2.lib import actions
from absl import app
MAPNAME = 'Simple64'
APM = 300
APM = int(APM / 18.75)
UNLIMIT = 0
VISUALIZE = True
REALTIME = True
SCREEN_SIZE = 84
MINIMAP_SIZE = 64
players = [sc2_env.Agent(sc2_env.Race.terran),\
sc2_env.Bot(sc2_env.Race.zerg,\
sc2_env.Difficulty.very_easy)]
interface = features.AgentInterfaceFormat(\
feature_dimensions = features.Dimensions(\
screen = SCREEN_SIZE, minimap = MINIMAP_SIZE), use_feature_units = True)
class Agent(base_agent.BaseAgent):
def step(self,obs):
super(Agent,self).step(obs)
return actions.FUNCTIONS.no_op()
def main(args):
agent = Agent()
try:
with sc2_env.SC2Env(map_name = MAPNAME, players = players,\
agent_interface_format = interface,\
step_mul = APM, game_steps_per_episode = UNLIMIT,\
visualize = VISUALIZE, realtime = REALTIME) as env:
agent.setup(env.observation_spec(), env.action_spec())
timestep = env.reset()
agent.reset()
while True:
step_actions = [agent.step(timestep[0])]
if timestep[0].last():
break
timestep = env.step(step_actions)
except KeyboardInterrupt:
pass
app.run(main)
์์ ๊ฐ์ด ์ ๋ฆฌํ ์ ์์ต๋๋ค.์ด์ agent์ environment๋ฅผ setup๊ณผ reset์ ํ๋ฉด ์ค๋น๊ฐ ๋ ๊ฒ์ ๋๋ค.
agent.setup(env.observation_spec(), env.action_spec())
timestep = env.reset()
agent.reset()
๊ฒ์๋์ while๋ฌธ์ ๋๋ฉฐ, agent์ step function์ callํ๋ฉด๋๋๋ฐ, ์ด agent.step()์ step์ ํตํด ์ป์ ์ ๋ณด๋ค์ ๋ด๊ณ ์๊ณ , agent๋ environment์ observation์ parameter๋ก ๋ฐ๊ฒ๋ฉ๋๋ค.
while True:
step_actions = [agent.step(timestep[0])]
print(timestep[0])
if timestep[0].last():
break
timestep = env.step(step_actions)
์ด์ ์ ์ฒด๋ฅผ ํ๋ฒ ๊ตฌ์ฑํด๋ณด๊ฒ ์ต๋๋ค.
from pysc2.env import sc2_env
from pysc2.lib import features
from pysc2.agents import base_agent
from pysc2.lib import actions
from absl import app
MAPNAME = 'Simple64'
APM = 300
APM = int(APM / 18.75)
UNLIMIT = 0
VISUALIZE = True
REALTIME = True
players = [sc2_env.Agent(sc2_env.Race.terran),\
sc2_env.Bot(sc2_env.Race.zerg,\
sc2_env.Difficulty.very_easy)]
interface = features.AgentInterfaceFormat(\
feature_dimensions = features.Dimensions(\
screen = 64, minimap = 16), use_feature_units = True)
class Agent(base_agent.BaseAgent):
def step(self,obs):
super(Agent,self).step(obs)
return actions.FUNCTIONS.no_op()
def main(args):
agent = Agent()
try:
with sc2_env.SC2Env(map_name = MAPNAME, players = players,\
agent_interface_format = interface,\
step_mul = APM, game_steps_per_episode = UNLIMIT,\
visualize = VISUALIZE, realtime = REALTIME) as env:
agent.setup(env.observation_spec(), env.action_spec())
timestep = env.reset()
agent.reset()
while True:
step_actions = [agent.step(timestep[0])]
print(timestep[0])
if timestep[0].last():
break
timestep = env.step(step_actions)
except KeyboardInterrupt:
pass
app.run(main)
try except๋ฌธ๊ณผ absl์ ํตํ app์คํ๋ง ์ถ๊ฐ๋์๊ณ ์ ๋ถ ์์์ ํ์ธํ ๋ด์ฉ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์คํ๋์๋ค๋ฉด ์ ์์ ๋๋ค.
Last updated
Was this helpful?