繁体   English   中英

来自Omnet ++网络的柠檬图

[英]Lemon graph from Omnet++ network

我正在尝试从omnet ++中提取网络图,并提供节点信息和链接到Lemon图。 问题的一部分很容易解决。 使用代码:

    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++;

不知何故,我正在获取节点列表,现在我也在尝试获取链接信息。 也就是说,节点及其之间的链接也是如此。 如何获取链接信息并将其提供给Lemon图,我在代码中使用的方法有什么问题?

方法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++)

编辑2
由于缺少对NodeMapfindNodeMap必须编写自己的函数,例如:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM