ns3gym rltcp代碼梳理(二) tcp-rl-env

tcp-rl-env

  • 實際上它就是RL中的環境的定義,只不過ns3-gym中的環境還包括拓撲的搭建(sim.cc
  • 他這個類的作用就輔助python中的代碼可以像調用gym環境一樣去調用環境的接口(get_action、step之類的)

OpenGymEnv

  • tcp-rl-env裏面所有類的基類,抽象類,主要是定義了官方要的七個接口,都是純虛函數,畢竟opengym_interface也等着調用呢!
    OpenGymEnv
  • 還有一些別的函數和屬性
* SetOpenGymInterface( )
* Notify ( )
* NotifySimulationEnd( )
* Ptr<OpenGymInterface> m_openGymInterface;
  • 接口接口,那麼都接去哪兒了呢?從哪兒接啊——OpenGymInterface

NotifySimulationEnd()和Notify()

  • 調用的OpenGymInterface的裏面對應的函數
SetOpenGymInterface
  • 調用的OpenGymInterface裏面的函數,把OpenGymInterface的回調函數設置成自己類裏面的一系列
void
OpenGymEnv::SetOpenGymInterface(Ptr<OpenGymInterface> openGymInterface)
{
  NS_LOG_FUNCTION (this);
  m_openGymInterface = openGymInterface;
  openGymInterface->SetGetActionSpaceCb( MakeCallback (&OpenGymEnv::GetActionSpace, this) );
  openGymInterface->SetGetObservationSpaceCb( MakeCallback (&OpenGymEnv::GetObservationSpace, this) );
  openGymInterface->SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, this) );
  openGymInterface->SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, this) );
  openGymInterface->SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, this) );
  openGymInterface->SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, this) );
  openGymInterface->SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, this) );
}

opengym_interface

class OpenGymSpace;		//Space類
class OpenGymDataContainer;	//數據存儲(比如說Observation的值得存儲)
class OpenGymEnv;

init()
  • 創建一個ns3opengym(which使用了zmq等通信框架),把信息(obsSpace和actionSpace的初始化信息)通過ns3opengym傳遞給python並設置m_initSimMsgSent爲真
  • 然後收python那邊傳來的ACK

NotifyCurrentState()
  • 把ns3這邊的數據收集起來( Obersavation、reward、Done(IsGameOver)、ExtraInfo )傳遞給python

IsGameOver
  • 返回gameOver或者m_simEnd

NotifySimulationEnd
  • 應該是再模擬結束的時候調用?
  • 設置m_simEnd爲真
    • 結束有兩種方式,一種就是仿真時間到了,一種就是IsGameOver返回True
  • 如果m_initSimMsgSent爲真

OpenGymInterface(uint32_t port)
  • 初始化一些屬性
m_port(port), m_zmq_context(1), m_zmq_socket(m_zmq_context, ZMQ_REQ),
  m_simEnd(false), m_stopEnvRequested(false), m_initSimMsgSent(false)

DoGet(uint32_t port)和 Get( uint32_t port )
  • 使用單例模式返回一個interface的ptr

WaitForStop()
  • 調用NotifyCurrentState()

NotifySimulationEnd()
  • 設置m_simEnd爲真
  • 如果已經初始化發過信息(m_simEnd爲真),調用m_simEnd

Notify()
  • 設置回調函數(設置成OpenGymEnv 的一系列動作)
  SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, entity) );
  SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, entity) );
  SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, entity) );
  SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, entity) );
  SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, entity) );



TcpGymEnv [ 還是個抽象類 ]

  • 繼承OpenGymEnv ,所以一定要實現那OpenGymInterface對應的七個接口

  • 還要求了另一些多的接口

    • track packet
    * TxPktTrace()
    * RxPktTrace
    
    • TCP擁塞控制算法
    GetSsThresh()
    IncreaseWindow()
    PktsAcked()
    CongestionStateSet()
    CwndEvent()
    
  • 還有一些屬性用於記錄AGENT

m_nodeId  哪個節點是AGENT 
m_socketUuid 這個節點上的哪個socket

TcpEventGymEnv

  • 繼承TcpGymEnv

TcpTimeStepGymEnv

  • 繼承TcpGymEnv

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章