如何使用omnet ++从两个节点之间的`Link`读取值

时间:2015-05-31 18:37:13

标签: c++ algorithm omnet++

我正在尝试使用c ++在omnet ++中实现Ford Fulkerson算法。我从这个article获取了c ++类,但我无法从网络中读取应该来自Link

的值

我的班级算法:

// C++ program for implementation of Ford Fulkerson algorithm
#include <iostream>
#include <limits.h>
#include <string.h>
#include <queue>
using namespace std;

// Number of vertices in given graph
#define V 6

class Node : public cSimpleModule
{
  protected:
    // The following redefined virtual function holds the algorithm.
    virtual void initialize();
    virtual void handleMessage(cMessage *msg);
};

Define_Module(Node);

void Node::initialize()
{
    // These values should come from Links
    int graph[V][V] = { {0, 16, 13, 0, 0, 0},
                            {0, 0, 10, 12, 0, 0},
                            {0, 4, 0, 0, 14, 0},
                            {0, 0, 9, 0, 0, 20},
                            {0, 0, 0, 7, 0, 4},
                            {0, 0, 0, 0, 0, 0}
                          };
    fordFulkerson(graph, 0, 5);
}

void Node::handleMessage(cMessage *msg)
{
    send(msg, "out");
}

/* Returns true if there is a path from source 's' to sink 't' in
  residual graph. Also fills parent[] to store the path */
bool bfs(int rGraph[V][V], int s, int t, int parent[])
{
    // Create a visited array and mark all vertices as not visited
    bool visited[V];
    memset(visited, 0, sizeof(visited));

    // Create a queue, enqueue source vertex and mark source vertex
    // as visited
    queue <int> q;
    q.push(s);
    visited[s] = true;
    parent[s] = -1;

    // Standard BFS Loop
    while (!q.empty())
    {
        int u = q.front();
        q.pop();

        for (int v=0; v<V; v++)
        {
            if (visited[v]==false && rGraph[u][v] > 0)
            {
                q.push(v);
                parent[v] = u;
                visited[v] = true;
            }
        }
    }

    // If we reached sink in BFS starting from source, then return
    // true, else false
    return (visited[t] == true);
}

// Returns tne maximum flow from s to t in the given graph
int fordFulkerson(int graph[V][V], int s, int t)
{
    int u, v;

    // Create a residual graph and fill the residual graph with
    // given capacities in the original graph as residual capacities
    // in residual graph
    int rGraph[V][V]; // Residual graph where rGraph[i][j] indicates
                     // residual capacity of edge from i to j (if there
                     // is an edge. If rGraph[i][j] is 0, then there is not)
    for (u = 0; u < V; u++)
        for (v = 0; v < V; v++)
             rGraph[u][v] = graph[u][v];

    int parent[V];  // This array is filled by BFS and to store path

    int max_flow = 0;  // There is no flow initially

    // Augment the flow while tere is path from source to sink
    while (bfs(rGraph, s, t, parent))
    {
        // Find minimum residual capacity of the edhes along the
        // path filled by BFS. Or we can say find the maximum flow
        // through the path found.
        int path_flow = INT_MAX;
        for (v=t; v!=s; v=parent[v])
        {
            u = parent[v];
            path_flow = min(path_flow, rGraph[u][v]);
        }

        // update residual capacities of the edges and reverse edges
        // along the path
        for (v=t; v != s; v=parent[v])
        {
            u = parent[v];
            rGraph[u][v] -= path_flow;
            rGraph[v][u] += path_flow;
        }

        // Add path flow to overall flow
        max_flow += path_flow;
    }

    // Return the overall flow
    return max_flow;
}

网络:

/
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Lesser General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this program.  If not, see http://www.gnu.org/licenses/.
// 

import Node;

import Link;

//
// Generated network with random topology (6 nodes, 8 edges, seed=100).
//
network Network
{
    @display("bgb=478,329");
    submodules:
        S: Node {
            @display("p=19,87;is=s");
        }
        n1: Node {
            @display("p=130,142;is=s");
        }
        n2: Node {
            @display("p=130,36;is=s");
        }
        n3: Node {
            @display("p=262,142;is=s");
        }
        n4: Node {
            @display("p=262,36;is=s");
        }
        T: Node {
            @display("p=364,87;is=s");
        }
    connections:
        S.g++ <--> Link { @display("t=13"); cost = 13; } <--> n1.g++;
        S.g++ <--> Link {  cost = 16;@display("t=16"); } <--> n2.g++;
        n1.g++ <--> Link {  cost = 1;@display("t=1"); } <--> n2.g++;
        n1.g++ <--> Link {  cost = 14;@display("t=14"); } <--> n3.g++;
        n1.g++ <--> Link {  cost = 9;@display("t=9"); } <--> n4.g++;
        n2.g++ <--> Link {  cost = 12;@display("t=12"); } <--> n4.g++;
        n4.g++ <--> Link {  cost = 20;@display("t=20"); } <--> T.g++;
        n3.g++ <--> Link {  cost = 4;@display("t=4"); } <--> T.g++;
        n3.g++ <--> Link {  cost = 7;@display("t=7"); } <--> n4.g++;
}

enter image description here

1 个答案:

答案 0 :(得分:1)

您似乎使用名为Link的自定义模块作为频道,您似乎已经提供了cost参数。从cost获取此Node参数需要三个步骤:

要获取Link个频道将Node连接到其邻居,您需要先使用OMNeT ++ API查询节点Connections。有关详细信息,请参阅用户手册中的访问门和连接部分。对于每个连接,您可以使用Link方法获取指向相关频道(您的getChannel模块)的指针。

使用指向Link模块的指针,您可以使用OMNet ++的par()方法查询其参数的值。

我发现您还在设置Link模块&#39; 显示字符串(特别是t标记,用于注释某些文本)。有关如何读取(或写入)此标记的信息,请参阅用户手册的Display Strings章节。