Пример #1
0
        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);
        }