【问题标题】:Lemon graph from Omnet++ network来自 Omnet++ 网络的柠檬图
【发布时间】:2016-03-02 14:01:01
【问题描述】:

我正在尝试从 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++;

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

【问题讨论】:

  • 这里有什么问题?
  • 如何提取链接信息并将其提供给空图“ListGraph g;”与相应的节点?基本上我正在尝试提取给定网络的拓扑,然后将此信息提供给 Lemon Library Graph。

标签: c++ omnet++ lemon-graph-library


【解决方案1】:

extractByNedTypeName() 方法需要完全限定的 NED 类型名称,即包括包。在INET 中,StandardHost 通常在包inet.node.inet 中,因此您应该写:

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

编辑
循环 for (ListDigraph::NodeIt n(g); n != INVALID; ++n) 永远不会执行,因为图 g 刚刚创建并且它是空的。外部循环应该类似于:
for(int j = 0; j&lt;numOutLinks; j++).

EDIT2
由于NodeMap 缺少find,因此必须编写自己的函数,例如:

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
}

【讨论】:

  • 但同时我也希望提取链接。我通过解析节点列表并检查其远程节点(如果有)并将其添加到柠檬图(使用 g.addarc(u,v))来尝试代码,但仍然无效。一些提示会很好。
  • 你能解释一下你写的“无效”是什么意思吗?是否存在编译时或运行时错误? extractByNedTypeName() 方法是否可以识别您期望的所有节点?您使用哪种类型的网络 - 有线还是无线?
  • 我的意思是在我试图提取的边缘(链接)的情况下无效。我有节点。对于每个节点,我正在检查 linkOuts 和相应的远程节点,然后在图中添加边。结果图没有应有的所有链接。
  • 是的,我认为这是最好的方法。
  • 除了在NodeMap 中添加自己的搜索方法外,我没有看到其他可能性。我用这个函数的一个例子扩展了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多