NS3Gym如何使用
文件位置
Agent运行脚本
理论上,关于Agent的运行脚本比如simple_test.py
一般放于ns3gym/scratch
目录下,因为该目录一般用来放置用户定义的脚本。
在强化学习中,该脚本扮演一个Agent的角色,其与使用Python编写的环境脚本进行交互,大多数情况下,ns3
模拟脚本与其放在同一个位置下,当该脚本运行时,模拟脚本被使用./waf --run "<args>"
自动调用编译执行。
该脚本内容大致如下:
env = gym.make('ns3-v0')
env.reset()
ob_space = env.observation_space
ac_space = env.action_space
print("Observation space: ", ob_space, ob_space.dtype)
print("Action space: ", ac_space, ac_space.dtype)
stepIdx = 0
try:
obs = env.reset()
print("Step: ", stepIdx)
print("---obs: ", obs)
while True:
stepIdx += 1
action = env.action_space.sample()
print("---action: ", action)
obs, reward, done, info = env.step(action)
print("Step: ", stepIdx)
print("---obs, reward, done, info: ", obs, reward, done, info)
if done:
break
环境脚本(Gym端)
Gym端的环境脚本使用Python进行编写,以脚本ns3env.py
为例,该脚本位于/usr/local/lib/python3.6/dist-packages/ns3gym
目录下,通常在该脚本中定义Gym环境类,当然与ns3端交互的类代码往往也定义于这个文件中。
编写好这个文件后,最好在同目录下的__init__.py
文件中注册环境。
该脚本内容大致如下:
# 与ns3通过zmq进行通信
class Ns3ZmqBridge(object):
"""docstring for Ns3ZmqBridge"""
def __init__(self, port=0, startSim=True, simSeed=0, simArgs={}, debug=False):
# 环境类
class Ns3Env(gym.Env):
def __init__(self, stepTime=0, port=0, startSim=True, simSeed=0, simArgs={}, debug=False):
模拟脚本
该脚本与Agent运行脚本通常位于同一个目录下,方便编译。
需要实例化OpenGymInterface
,即
Ptr<OpenGymInterface> openGymInterface = CreateObject<OpenGymInterface> (openGymPort);
Ptr<MyGymEnv> myGymEnv = CreateObject<MyGymEnv> ();
myGymEnv->SetOpenGymInterface(openGymInterface);
该脚本使用C++
语言进行编写,在该脚本中,实现了必须给出的七个接口:
-
Ptr<OpenGymSpace> GetObservationSpace()
:从此脚本中得到状态空间。 -
Ptr<OpenGymSpace> GetActionSpace()
:从此脚本中得到动作空间。 -
bool GetGameOver()
:游戏结束的条件。 -
Ptr<OpenGymDataContainer> GetObservation()
:从此脚本中得到状态。 -
float GetReward()
:从此脚本中得到回报。 -
std::string GetExtraInfo()
:从此脚本中得到其余信息。 -
bool ExecuteActions(Ptr<OpenGymDataContainer> action)
:执行动作。
当然,根据官方技术报告给出的提示:
Note, that the functions can be defined separately or grouped together inside object inheriting from the GymEnv base class.
这七个函数可以分别或者一起实现在那些继承了GymEnv
的类中。
该脚本包含了官方实现的库ns3/opengym-module.h
,其位置在/media/tristone/ubuntu/ns3-gym/build/ns3
。在该头文件中包含了接口opengym_interface.h
,用以执行一些与Gym的通信工作。
该脚本内容大致如下:
RngSeedManager::SetSeed (1);
RngSeedManager::SetRun (simSeed);
// OpenGym Env
Ptr<OpenGymInterface> openGym = CreateObject<OpenGymInterface> (openGymPort);
openGym->SetGetActionSpaceCb( MakeCallback (&MyGetActionSpace) );
openGym->SetGetObservationSpaceCb( MakeCallback (&MyGetObservationSpace) );
openGym->SetGetGameOverCb( MakeCallback (&MyGetGameOver) );
openGym->SetGetObservationCb( MakeCallback (&MyGetObservation) );
openGym->SetGetRewardCb( MakeCallback (&MyGetReward) );
openGym->SetGetExtraInfoCb( MakeCallback (&MyGetExtraInfo) );
openGym->SetExecuteActionsCb( MakeCallback (&MyExecuteActions) );
Simulator::Schedule (Seconds(0.0), &ScheduleNextStateRead, envStepTime, openGym);
NS_LOG_UNCOND ("Simulation start");
Simulator::Stop (Seconds (simulationTime));
Simulator::Run ();
NS_LOG_UNCOND ("Simulation stop");
openGym->NotifySimulationEnd();
Simulator::Destroy ();