public override RandomNetwork Generate()
        {
            RandomNetwork randomNetwork = new RandomNetwork(Directed);


            long time = DateTime.UtcNow.Millisecond;

            int[] nodes = new int[NumNodes];

            int [] degrees = new int[NumNodes];

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

            NumEdges = 0;

            for (int i = 0; i < _initNumNodes; i++)
            {
                for (int j = (i + 1); j < _initNumNodes; j++)
                {
                    randomNetwork.EdgeCreate(nodes[i], nodes[j], Directed);


                    degrees[i]++;
                    degrees[j]++;

                    NumEdges++;
                }
            }

            for (int i = _initNumNodes; i < NumNodes; i++)
            {
                int    added        = 0;
                double degreeIgnore = 0;
                for (int m = 0; m < _edgesToAdd; m++)
                {
                    double prob    = 0;
                    double randNum = Random.NextDouble();

                    for (int j = 0; j < i; j++)
                    {
                        List <UndirectedEdge <int> > edges = randomNetwork.EdgesConnecting(nodes[i], nodes[j], Directed, false, !Directed);

                        if (edges.Count == 0)
                        {
                            prob += (double)((double)degrees[j])
                                    / ((double)(2.0d * NumEdges) - degreeIgnore);
                        }


                        if (randNum <= prob)
                        {
                            randomNetwork.EdgeCreate(nodes[i], nodes[j], Directed);

                            degreeIgnore += degrees[j];


                            added++;
                            degrees[i]++;
                            degrees[j]++;

                            break;
                        }
                    }
                }
                NumEdges += added;
            }
            return(randomNetwork);
        }
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);
        }