/// <summary> /// Color a graph with an algorithm /// </summary> /// <param name="algorithm">algorithm</param> /// <param name="probability">probability algorithm?</param> /// <returns>(minColors, maxColors), for non-probability algorithm minColors = maxColors</returns> public Tuple <int, int> ColorGraph(GraphColoring.GraphColoringAlgorithm.IGraphColoringAlgorithmInterface algorithm, bool probability = false) { GraphColoring.Graph.IGraphInterface graph = algorithm.GetGraph(); if (graph.GetColoredGraph().GetIsInitializedColoredGraph()) { graph.GetColoredGraph().DeinitializationColoredGraph(); } // Variable int countIterations = 1; int colors, minColors = int.MaxValue, maxColors = int.MinValue; if (probability) { countIterations = COUNTITERATIONSPROBABILITY; } for (int i = 0; i < countIterations; i++) { algorithm.Color(); colors = graph.GetColoredGraph().GetCountUsedColors(); if (colors < minColors) { minColors = colors; } if (colors > maxColors) { maxColors = colors; } graph.GetColoredGraph().DeinitializationColoredGraph(); } return(new Tuple <int, int>(minColors, maxColors)); }
public void Generate(int countOfVertices, int countOfGraphs) { if (countOfVertices <= 0) { throw new MyException.GenerateGraphsException.GenerateGraphsInvalidCountOfVerticesException(countOfVertices.ToString()); } this.countOfVertices = countOfVertices; // Create folder if does not exist if (!Directory.Exists(pathFolder)) { Directory.CreateDirectory(pathFolder); } // Clear, create file if (clearFile && File.Exists(pathFile)) { File.Delete(pathFile); } if (!File.Exists(pathFile)) { File.WriteAllText(pathFile, string.Empty); } // Create time dictionary Dictionary <GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum, Pair <long, long> > timeDictionary = new Dictionary <GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum, Pair <long, long> >(); Dictionary <GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum, Pair <long, long> > countInterchangeCallsDictionary = new Dictionary <GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum, Pair <long, long> >(); for (int c = 0; c < countOfGraphs; c++) { if (writer) { Console.WriteLine("------------------------"); Console.WriteLine("------------------------"); Console.WriteLine("Count of graphs: {0} / {1}", (c + 1), countOfGraphs); Console.WriteLine("------------------------"); Console.WriteLine("------------------------"); } GenerateGraphs(); if (writer) { Console.WriteLine("Graph (1): countVertices {0}, countEdges {1}", minGraph.GetGraphProperty().GetCountVertices(), minGraph.GetGraphProperty().GetCountEdges()); Console.WriteLine("Graph (2): countVertices {0}, countEdges {1}", maxGraph.GetGraphProperty().GetCountVertices(), maxGraph.GetGraphProperty().GetCountEdges()); } using (StreamWriter file = File.AppendText(pathFile)) { file.WriteLine("Graph {0} / {1} - (1): countVertices {2}, countEdges {3}", (c + 1), countOfGraphs, minGraph.GetGraphProperty().GetCountVertices(), minGraph.GetGraphProperty().GetCountEdges()); file.WriteLine("Graph {0} / {1} - (2): countVertices {2}, countEdges {3}", (c + 1), countOfGraphs, maxGraph.GetGraphProperty().GetCountVertices(), maxGraph.GetGraphProperty().GetCountEdges()); } // Generate time complexity foreach (GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum algorithmEnum in (GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum[])Enum.GetValues(typeof(GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum))) { if (algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.optimal || algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.AI) { continue; } if (!useGeneticAlgorithm2 && (algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.geneticAlgorithm2 || algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.geneticAlgorithm)) { continue; } if (!useInterchangeExtendedK3 && (algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedLargestFirstInterchangeExtendedK3 || algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.largestFirstSequenceInterchangeExtendedK3 || algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.randomSequenceInterchangeExtendedK3 || algorithmEnum == GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.smallestLastSequenceInterchangeExtendedK3)) { continue; } // Variable GraphColoring.GraphColoringAlgorithm.IGraphColoringAlgorithmInterface algroithm = null; if (writer) { Console.WriteLine("----------"); Console.WriteLine("Algorithm: " + algorithmEnum.ToString()); Console.WriteLine("----------"); } for (int i = 0; i < 2; i++) { // Variable GraphColoring.Graph.IGraphInterface graph; List <GraphColoring.Graph.IGraphInterface> graphList = new List <GraphColoring.Graph.IGraphInterface>(COUNTITERATIONSTIMECOMPLEXITY); if (i == 0) { graph = minGraph; } else { graph = maxGraph; } // Create duplicates graphs for (int j = 0; j < COUNTITERATIONSTIMECOMPLEXITY; j++) { graphList.Add(GraphColoring.Graph.GraphOperation.GraphOperation.CopyGraph(graph)); } myStopwatch.Reset(); myStopwatch.Start(); for (int j = 0; j < COUNTITERATIONSTIMECOMPLEXITY; j++) { // Choose algorithm switch (algorithmEnum) { case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.randomSequence: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.RandomSequence.RandomSequence(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.largestFirstSequence: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.LargestFirstSequence.LargestFirstSequence(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.smallestLastSequence: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.SmallestLastSequence.SmallestLastSequence(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.randomSequenceInterchange: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.RandomSequence.RandomSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchange); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.largestFirstSequenceInterchange: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.LargestFirstSequence.LargestFirstSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchange); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.smallestLastSequenceInterchange: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.SmallestLastSequence.SmallestLastSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchange); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.randomSequenceInterchangeExtended: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.RandomSequence.RandomSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtended); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.largestFirstSequenceInterchangeExtended: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.LargestFirstSequence.LargestFirstSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtended); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.smallestLastSequenceInterchangeExtended: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.SmallestLastSequence.SmallestLastSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtended); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.randomSequenceInterchangeExtendedK3: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.RandomSequence.RandomSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtendedK3); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.largestFirstSequenceInterchangeExtendedK3: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.LargestFirstSequence.LargestFirstSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtendedK3); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.smallestLastSequenceInterchangeExtendedK3: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.SmallestLastSequence.SmallestLastSequence(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtendedK3); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedSequential: algroithm = new GraphColoring.GraphColoringAlgorithm.SequenceAlgorithm.ConnectedSequential.ConnectedSequential(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.saturationLargestFirstSequence: algroithm = new GraphColoring.GraphColoringAlgorithm.SaturationLargestFirstSequence.SaturationLargestFirstSequence(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.greedyIndependentSet: algroithm = new GraphColoring.GraphColoringAlgorithm.GreedyIndependentSet.GreedyIndependentSet(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.combinationAlgorithm: algroithm = new GraphColoring.GraphColoringAlgorithm.CombinationAlgorithm.CombinationAlgorithm(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedLargestFirst: algroithm = new GraphColoring.GraphColoringAlgorithm.ConnectedLargestFirst.ConnectedLargestFirst(graphList[j]); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedLargestFirstInterchange: algroithm = new GraphColoring.GraphColoringAlgorithm.ConnectedLargestFirst.ConnectedLargestFirst(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchange); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedLargestFirstInterchangeExtended: algroithm = new GraphColoring.GraphColoringAlgorithm.ConnectedLargestFirst.ConnectedLargestFirst(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtended); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.connectedLargestFirstInterchangeExtendedK3: algroithm = new GraphColoring.GraphColoringAlgorithm.ConnectedLargestFirst.ConnectedLargestFirst(graphList[j], GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithInterchangeEnum.interchangeExtendedK3); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.geneticAlgorithm: algroithm = new GraphColoring.GraphColoringAlgorithm.GeneticAlgorithm.GeneticAlgorithm(graphList[j], 1); break; case GraphColoring.GraphColoringAlgorithm.GraphColoringAlgorithm.GraphColoringAlgorithmEnum.geneticAlgorithm2: algroithm = new GraphColoring.GraphColoringAlgorithm.GeneticAlgorithm.GeneticAlgorithm(graphList[j], 2); break; default: throw new MyException.GenerateGraphsException.GenerateGraphsAlgorithmDoesNotExistException(algorithmEnum.ToString()); } algroithm.Color(); } myStopwatch.Stop(); if (writer) { Console.WriteLine("Time: " + myStopwatch.ElapsedMilliseconds / COUNTITERATIONSTIMECOMPLEXITY + " ms"); Console.WriteLine("Count of interchange calls: " + algroithm.GetCountInterchangeCalls()); Console.WriteLine(); } Pair <long, long> time; Pair <long, long> countOfInterchangeCalls; if (timeDictionary.TryGetValue(algorithmEnum, out time)) { if (i == 0) { time.First += myStopwatch.ElapsedMilliseconds; countOfInterchangeCalls = countInterchangeCallsDictionary[algorithmEnum]; countOfInterchangeCalls.First += algroithm.GetCountInterchangeCalls(); } else { time.Second += myStopwatch.ElapsedMilliseconds; countOfInterchangeCalls = countInterchangeCallsDictionary[algorithmEnum]; countOfInterchangeCalls.Second += algroithm.GetCountInterchangeCalls(); } } else { time = new Pair <long, long>(); countOfInterchangeCalls = new Pair <long, long>(); if (i == 0) { time.First = myStopwatch.ElapsedMilliseconds; countOfInterchangeCalls.First = algroithm.GetCountInterchangeCalls(); } else { time.Second = myStopwatch.ElapsedMilliseconds; countOfInterchangeCalls.Second = algroithm.GetCountInterchangeCalls(); } timeDictionary.Add(algorithmEnum, time); countInterchangeCallsDictionary.Add(algorithmEnum, countOfInterchangeCalls); } } } } using (StreamWriter file = File.AppendText(pathFile)) { file.WriteLine(); foreach (var record in timeDictionary) { file.WriteLine("Algorithm: " + record.Key); file.WriteLine("Sparse: "); file.WriteLine("Time (average): " + record.Value.First / (COUNTITERATIONSTIMECOMPLEXITY * countOfGraphs)); file.WriteLine("Count of interchange calls: " + countInterchangeCallsDictionary[record.Key].First / countOfGraphs); file.WriteLine("Dense: "); file.WriteLine("Time (average): " + record.Value.Second / (COUNTITERATIONSTIMECOMPLEXITY * countOfGraphs)); file.WriteLine("Count of interchange calls: " + countInterchangeCallsDictionary[record.Key].Second / countOfGraphs); } } }