NS3Gym接口使用

一种为NS3网络模拟器提供便捷的强化学习模块的框架

概况

为了更加有效的对网络通信即各种网络协议进行模拟,人们已经开发出了许多有用的网络模拟器,如NS3、OMNET ++、SWAN和OPNET等。而NS3凭借其可扩展性以及强大的接口,在许多领域被广泛使用。

尽管NS3同时提供了C++和Python两种环境,但是对于科研人员,依旧没有很难在NS3中实现强化学习,因此便诞生了OpenAI-Gym作为强化学习算法研究的工具包。它可以实现与NS3接口的无缝连接,从而便于从事网络仿真的科研人员应用现有的强化学习框架。

安装

首先,你可以直接从Github中pull最新的OpenAI-Gym代码,链接为https://github.com/tkn-tub/ns3-gym。正常情况下,根据README中的Installation,基本可以完成NS3Gym的安装和编译。

然而,在本地安装时有可能会出现protobuf的版本问题,导致编译错误,如下图所示。

遇到这种情况,需要到官网https://developers.google.com/protocol-buffers/docs/downloads重新下载兼容protobuf,之后编译并配置protobuf环境,如下所示。

1
2
3
4
5
6
tar -xvf protobuf
cd protobuf
./configure --prefix=/usr/local/protobuf
make
make check
make install

编译成功后,执行vim /etc/profile,在其中添加如下命令即可。

1
2
export PATH=$PATH:/usr/local/protobuf/bin/
export PKG_CONFIG_PATH=/usr/local/protobuf/lib/pkgconfig/

最终,./waf configure成功后,我们便可以成功使用NS3Gym接口。

接口使用概述

根据NS3Gym的使用接口,作为使用者,我们需要根据项目需求实现如下接口——

1
2
3
4
5
6
7
Ptr<OpenGymSpace> GetObservationSpace();
Ptr<OpenGymSpace> GetActionSpace();
Ptr<OpenGymDataContainer> GetObservation();
float GetReward();
bool GetGameOver();
std::string GetExtraInfo();
bool ExecuteActions(Ptr<OpenGymDataContainer> action);

每次执行迭代的过程中,框架可以通过这些接口收集环境的相关信息:

 ⚫ GetObservation()——获取网络结点上收集到的变量信息。

 ⚫ GetReward()——计算上一步中强化学习的Reward。

 ⚫ GetGameOver()——检查是否满足程序结束的条件。

 ⚫ GetExtraInfo()——收集与当前环境状态关联的额外信息。

只要根据设计接口实现,任何一个NS3脚本都可以使用OpenAI-Gym的环境。开启后,NS3脚本可以作为Server监听端口的调用请求,我们可以利用Python额外编写强化学习的核心内容,并与NS3的仿真环境相交互。一个简单的OpenAI Gym 智能体的代码样例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
import gym
import PyOpenGymNs3
import MyAgent

env = gym.make(’ns3-v0’)
obs = env.reset()
agent = MyAgent.Agent()
while True:
action = agent.get_action(obs)
obs, reward, done, info = env.step(action)
if done:
break
env.close()

总结

关于OpenAI-Gym,仍然有很多深入的内容,包括NS-3仿真代码以及PyTorch下的强化学习实现,本文只简单介绍了OpenAI-Gym这样一个将网络仿真和强化学习相结合的优秀框架,该框架为从事网络科研的相关人员提供了极大的便利,其官方论文开源代码值得进一步去学习和研读。

文章目录
  1. 1. 概况
  2. 2. 安装
  3. 3. 接口使用概述
  4. 4. 总结