public double Analyze(RandomNetwork pNetwork, bool pDirected)
        {
            double averageDegree = 0;

            double N = pNetwork.Nodes().Count;

            double E = pNetwork.Edges().Count;

            E *= 2.0d;

            averageDegree = E / N;

            return(averageDegree);
        }
Exemple #2
0
        public override RandomNetwork Generate()
        {
            RandomNetwork randomNetwork = new RandomNetwork(Directed);

            NumEdges = 0;

            int[] nodes = new int[NumNodes];

            for (int i = 0; i < NumNodes; i++)
            {
                nodes[i] = randomNetwork.NodeCreate();
            }

            if (Directed && AllowSelfEdge && (2 * _degree > NumNodes))
            {
                _degree = NumNodes / 2;
            }
            else if (Directed && (2 * _degree > (NumNodes - 1) / 2))
            {
                _degree = (NumNodes - 1) / 2;
            }

            if (!Directed && AllowSelfEdge && (2 * _degree > NumNodes))
            {
                _degree = NumNodes / 2;
            }
            else if (!Directed && (2 * _degree > (NumNodes - 1) / 2))
            {
                _degree = (NumNodes - 1) / 2;
            }

            for (int i = 0; i < NumNodes; i++)
            {
                int start = i - _degree;

                if (start < 0)
                {
                    start = NumNodes + start;
                }

                int count = 0;
                int stop  = 2 * _degree;



                while (count < stop)
                {
                    if ((i != start) || (AllowSelfEdge))
                    {
                        if (((!Directed) && (nodes[i] <= nodes[start])) || (Directed))
                        {
                            randomNetwork.EdgeCreate(nodes[i], nodes[start], Directed);
                            NumEdges++;
                        }
                        if (i != start)
                        {
                            count++;
                        }
                    }
                    start = (start + 1) % NumNodes;
                }
            }

            LinkedList <UndirectedEdge <int> > edgeList = new LinkedList <UndirectedEdge <int> >();
            var iter = randomNetwork.Edges();

            foreach (var edge in iter)
            {
                edgeList.AddLast(edge);
            }

            while (edgeList.Count > 0)
            {
                var nextEdge = edgeList.ElementAt(0);
                edgeList.RemoveFirst();
                int source = nextEdge.Source;
                int target = nextEdge.Target;


                double percent = Random.NextDouble();

                if (percent <= _beta)
                {
                    int  k         = 0;
                    bool candidate = false;

                    while (!candidate)
                    {
                        k         = Math.Abs(Random.Next() % NumNodes);
                        candidate = true;

                        candidate = candidate && (k != source) || (AllowSelfEdge);
                        candidate = candidate && (k != target);

                        int edgeCount = 0;
                        var edgeIter  = randomNetwork.EdgesAdjacent(source, Directed, false, !Directed);
                        foreach (var edge in edgeIter)
                        {
                            int neighbor = edge.Target;
                            if (neighbor == source)
                            {
                                neighbor = edge.Source;
                            }

                            candidate = candidate && (neighbor != k);
                            edgeCount++;
                        }


                        if ((edgeCount == NumNodes) && (AllowSelfEdge))
                        {
                            candidate = false;
                            break;
                        }
                        else if ((edgeCount == (NumNodes - 1)) && (!AllowSelfEdge))
                        {
                            candidate = false;
                            break;
                        }
                    }
                    if (candidate)
                    {
                        randomNetwork.EdgeRemove(nextEdge);
                        randomNetwork.EdgeCreate(source, k, Directed);
                    }
                }
            }

            return(randomNetwork);
        }