public void IterativelySwapEdgesToDecreaseAssortativity() { var edges = EdgesAsNodes.OrderByDescending(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 = currVal - (LocalAssort(new Tuple <Node, Node>(e1.Item1, e2.Item1)) + LocalAssort(new Tuple <Node, Node>(e1.Item2, e2.Item2))) / 2.0; 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 = currVal - (LocalAssort(new Tuple <Node, Node>(e1.Item1, e2.Item2)) + LocalAssort(new Tuple <Node, Node>(e1.Item2, e2.Item1))) / 2.0; 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); } } }