文件位置

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 ();