Ejemplo n.º 1
0
        public void IterativelySwapEdgesToIncreaseAssortativity()
        {
            var edges = EdgesAsNodes.OrderBy(e => LocalAssort(e)).ToList();

            while (edges.Count > 1)
            {
                var e1 = edges[0];
                edges.Remove(e1);
                var otherEdges =
                    edges.Where(
                        e2 =>
                        e1.Item1 != e2.Item1 &&
                        e1.Item1 != e2.Item2 &&
                        e1.Item2 != e2.Item1 &&
                        e1.Item2 != e2.Item2).ToList();

                var currVal                     = LocalAssort(e1);
                var currMaxImprovement          = 0.0;
                Tuple <Node, Node> currMaxEdge  = null;
                EdgeSwap           bestEdgeSwap = EdgeSwap.e1Ae2A_e1Be2B; // just need to assign something..

                foreach (var e2 in otherEdges)
                {
                    double improvement;

                    if (!e1.Item1.Neighbors.Contains(e2.Item1) && !e1.Item2.Neighbors.Contains(e2.Item2))
                    {
                        improvement = (LocalAssort(new Tuple <Node, Node>(e1.Item1, e2.Item1)) +
                                       LocalAssort(new Tuple <Node, Node>(e1.Item2, e2.Item2))) /
                                      2.0 - currVal;
                        if (improvement > currMaxImprovement)
                        {
                            currMaxImprovement = improvement;
                            currMaxEdge        = e2;
                            bestEdgeSwap       = EdgeSwap.e1Ae2A_e1Be2B;
                        }
                    }
                    if (!e1.Item1.Neighbors.Contains(e2.Item2) && !e1.Item2.Neighbors.Contains(e2.Item1))
                    {
                        improvement = (LocalAssort(new Tuple <Node, Node>(e1.Item1, e2.Item2)) +
                                       LocalAssort(new Tuple <Node, Node>(e1.Item2, e2.Item1))) /
                                      2.0 - currVal;
                        if (improvement > currMaxImprovement)
                        {
                            currMaxImprovement = improvement;
                            currMaxEdge        = e2;
                            bestEdgeSwap       = EdgeSwap.e1Ae2B_e1Be2A;
                        }
                    }
                }

                if (currMaxEdge != null)
                {
                    if (bestEdgeSwap == EdgeSwap.e1Ae2A_e1Be2B)
                    {
                        AddEdge(e1.Item1, currMaxEdge.Item1);
                        AddEdge(e1.Item2, currMaxEdge.Item2);
                    }
                    else
                    {
                        AddEdge(e1.Item1, currMaxEdge.Item2);
                        AddEdge(e1.Item2, currMaxEdge.Item1);
                    }
                    RemoveEdge(e1.Item1, e1.Item2);
                    RemoveEdge(currMaxEdge.Item1, currMaxEdge.Item2);
                    edges.Remove(currMaxEdge);
                }
            }
        }