2016-03-02 47 views
0

我想從omnet ++中提取網絡圖並將節點和鏈接的信息提供給檸檬圖。問題的一部分很容易處理。使用代碼:來自Omnet ++網絡的檸檬圖

cTopology *topo = new cTopology("topo"); 
    std::vector<std::string> nedTypes; 
    nedTypes.push_back("inet.node.inet.StandardHost"); 
    topo->extractByNedTypeName(nedTypes); 
    int numNodes = topo->getNumNodes(); 
    EV << "cTopology found " << topo->getNumNodes() << " nodes\n"; 

    ListDigraph g; 
    ListDigraph::NodeMap<std::string> nodeName(g); 

    for (ListDigraph::NodeIt n(g); n != INVALID; ++n) 
    { 
     int i = 0;//counter 
     int numOutLinks = topo->getNode(i)->getNumOutLinks(); 
     g.addNode(); 
     std::vector<std::string> nodeList; 

     nodeName[n] = topo->getNode(i)->getModule()->getName(); 
     nodeList.push_back(nodeName[n]); 

     for(int j = 0; j<numOutLinks; j++) 
     { 
      cTopology::LinkOut* lOut = topo->getNode(i)->getLinkOut(j); 
      cTopology::Node *rNode = lOut->getRemoteNode(); 
      for (auto& nlist : nodeList) 
       { 
        auto nodeFound = std::find(std::begin(nlist), std::end(nlist), rNode); 
       if(nodeFound != std::end(nlist)){ 
        g.addNode(); 
        g.addArc(g.nodeFromId(i), g.nodeFromId(i+1)); 
       } 
      } 
     } i++; 

不知怎的,我得到的節點列表,現在我想獲得的鏈接信息,以及。也就是說,節點以及它們之間的鏈接也是如此。我如何獲取鏈接信息並將其提供給檸檬圖,以及我在代碼中使用的方法有哪些錯誤?

+1

什麼是這裏的問題? – user4786271

+0

如何提取鏈接信息並將其提供給空圖「ListGraph g;」與相應的節點?基本上我試圖提取給定網絡的拓撲結構,然後將這些信息提供給檸檬庫圖。 –

回答

1

方法extractByNedTypeName()需要完全合格的NED類型名稱,即包括該包。在INETStandardHost通常在包裝inet.node.inet,因此,你應該寫:

nedTypes.push_back("inet.node.inet.StandardHost"); 

編輯
循環for (ListDigraph::NodeIt n(g); n != INVALID; ++n),因爲圖g已經剛剛創建永遠不會執行,它是空的。外環應該是這樣的:
for(int j = 0; j<numOutLinks; j++)

EDIT2
由於缺乏findNodeMap一個有寫自己的功能,例如:

ListDigraph::NodeIt::Node findNodeMap(const ListDigraph::NodeMap<std::string> & map, const ListDigraph & g, 
    std::string txt) { 
    ListDigraph::NodeIt it(g); 
    for (; it != INVALID; ++it) { 
     if (map[it] == txt) 
      break; 
    } 
    return it; 
} 

使用它的一個例子:

ListDigraph::NodeMap<std::string> nodeName(g); 
// ... filling nodeName 
std::string str = "node1"; 
ListDigraph::NodeIt::Node node = findNodeMap(nodeName, g, str); 
if (node != INVALID) { 
    // node with name from str was found 
} 
+0

哦,你是對的! –

+0

但同時我也希望提取鏈接。我通過解析節點列表並檢查其遠程節點(如果有)並將其添加到Lemon Graph(使用g.addarc(u,v))來試用代碼,但仍然無效。一些提示會很好。 –

+0

你能解釋一下你寫的「無效」是什麼意思?是否有編譯時或運行時錯誤? 'extractByNedTypeName()'方法是否可以識別您所期望的所有節點?你使用哪種類型的網絡 - 有線還是無線? –