private bool CompareEdges(Edge firstEdge, Edge secondEdge) // Funkcja sprawdzajaca czy zamiana dwoch krawedzi polepszy rozwiazanie { var cost = CalculateCost(BestSolution); // Zapamietanie kosztu dotychczas najlepszego rozwiazania var list = CurrentSolution.ToList(); // Zapamietanie obecnego rozwiazania var edge = new Edge(list[firstEdge.Start], list[firstEdge.End]); // Zapamietanie krawedzi ktora jest pod tymi indeksami, aby pozniej mozna bylo ja zamienic list[firstEdge.Start] = list[secondEdge.Start]; // Zamiana krawedzi list[firstEdge.End] = list[secondEdge.End]; list[secondEdge.Start] = edge.Start; list[secondEdge.End] = edge.End; var cost1 = CalculateCost(list); // Obliczenie kosztu otrzymanego rozwiazania var list1 = CurrentSolution.ToList(); // Zapamietanie obecnego rozwiazania var edge1 = new Edge(list1[firstEdge.Start], list1[firstEdge.End]); // Inna mozliwozc zamiany krawedzi list1[firstEdge.Start] = list1[secondEdge.End]; list1[firstEdge.End] = list1[secondEdge.Start]; list1[secondEdge.Start] = edge.End; list1[secondEdge.End] = edge.Start; var cost2 = CalculateCost(list1); // Obliczenie kosztu otrzymanego rozwiazania if (cost1 < cost2) // Jezeli pierwsze otrzymane rozwiazanie jest lepsze od drugiego { if (cost1 < cost) // Jezeli rozwiazanie jest lepsze od dotychczas najlepszego { if (TabuList.Count != 0) // Jezeli tabu lista nie jest pusta zmniejsz kadencje kazdego elementu { for (int k = TabuList.Count - 1; k >= 0; k--) { TabuList[k].Cadency--; if (TabuList[k].Cadency == 0) { TabuList.RemoveAt(k); } } } var tabu = new TabuElement(Cadency, edge); // Dodanie pierwszej krawedzi z ruchu do tabu listy TabuList.Add(tabu); CurrentSolution = list; // Zapisanie otzrymanego rozwiazania jako najlepsze i aktualne BestSolution.Clear(); foreach (var j in CurrentSolution) { BestSolution.Add(j); } return(true); } } else // Jezeli drugie otrzymane rozwiazanie jest lepsze od pierwszego { if (cost2 < cost) // Jezeli rozwiazanie jest lepsze od dotychczas najlepszego { if (TabuList.Count != 0) // Jezeli tabu lista nie jest pusta zmniejsz kadencje kazdego elementu { for (int k = TabuList.Count - 1; k >= 0; k--) { TabuList[k].Cadency--; if (TabuList[k].Cadency == 0) { TabuList.RemoveAt(k); } } } var tabu = new TabuElement(Cadency, edge1); // Dodanie pierwszej krawedzi z ruchu do tabu listy TabuList.Add(tabu); CurrentSolution = list1; // Zapisanie otzrymanego rozwiazania jako najlepsze i aktualne BestSolution.Clear(); foreach (var j in CurrentSolution) { BestSolution.Add(j); } return(true); } } return(false); }