2016-03-02 48 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()'方法是否可以识别您所期望的所有节点?你使用哪种类型的网络 - 有线还是无线? –