public void Selection(AbstractTrack[] parentTracks, AbstractTrack[] childTracks)
        {
            double sumOfProgress = _proxySelectionList.Sum(proxySelection => proxySelection.GetProgress());
            double[] sectorsOfWheel = new double[_proxySelectionList.Count];
            for (int i = 0; i < _proxySelectionList.Count; i++)
            {
                sectorsOfWheel[i] = _proxySelectionList[i].GetProgress() / sumOfProgress * 100; // формула для поиска размера сектров колеса рулетки
            }

            int fallenSector = _random.Next(100);
            double sum = 0;
            for (int j = 0; j < sectorsOfWheel.Length; j++)
            {
                sum += sectorsOfWheel[j];
                if (sum > fallenSector)
                {
                    int countOfTracks = parentTracks.Length;
                    AbstractTrack[] allTracks = new AbstractTrack[parentTracks.Length * 2];
                    for (int i = 0; i < countOfTracks; i++)
                    {
                        allTracks[i] = parentTracks[i].Clone();
                        allTracks[i + countOfTracks] = childTracks[i].Clone();
                    }
                    Array.Sort(allTracks);
                    double currentResult = allTracks[0].GetTrackLength();

                    DateTime startTime = DateTime.Now;
                    _proxySelectionList[j].GetSelection().Selection(parentTracks, childTracks);
                    DateTime endTime = DateTime.Now;
                    TimeSpan time = endTime - startTime;
                    _proxySelectionList[j].AddOperationTime(time);

                    AbstractTrack[] newParentTracks = new AbstractTrack[parentTracks.Length];
                    for (int i = 0; i < countOfTracks; i++)
                    {
                        newParentTracks[i] = parentTracks[i].Clone();
                    }
                    Array.Sort(newParentTracks);
                    double sumOfParentTracks = newParentTracks.Sum(track => track.GetTrackLength());
                    double newResult = newParentTracks[0].GetTrackLength();
                    double sumOfBestResult = newResult * newParentTracks.Length;
                    if ((0 == newResult.CompareTo(currentResult)) && (0 != sumOfParentTracks.CompareTo(sumOfBestResult)))
                    {
                        _proxySelectionList[j].AddGoodStart();
                    }
                    else
                    {
                        _proxySelectionList[j].AddBadStart();
                    }
                    break;
                }
            }
        }
        public void Selection(AbstractTrack[] parentTracks, AbstractTrack[] childTracks)
        {
            if (_index == _proxySelectionList.Count)
            {
                _index = 0;
            }

            int countOfTracks = parentTracks.Length;
            AbstractTrack[] allTracks = new AbstractTrack[parentTracks.Length * 2];
            for (int i = 0; i < countOfTracks; i++)
            {
                allTracks[i] = parentTracks[i].Clone();
                allTracks[i + countOfTracks] = childTracks[i].Clone();
            }
            Array.Sort(allTracks);
            double currentResult = allTracks[0].GetTrackLength();

            DateTime startTime = DateTime.Now;
            _proxySelectionList[_index].GetSelection().Selection(parentTracks, childTracks);
            DateTime endTime = DateTime.Now;
            TimeSpan time = endTime - startTime;
            _proxySelectionList[_index].AddOperationTime(time);

            AbstractTrack[] newParentTracks = new AbstractTrack[parentTracks.Length];
            for (int i = 0; i < countOfTracks; i++)
            {
                newParentTracks[i] = parentTracks[i].Clone();
            }
            Array.Sort(newParentTracks);
            double sumOfParentTracks = newParentTracks.Sum(track => track.GetTrackLength());
            double newResult = newParentTracks[0].GetTrackLength();
            double sumOfBestResult = newResult * newParentTracks.Length;
            if ((0 == newResult.CompareTo(currentResult)) && (0 != sumOfParentTracks.CompareTo(sumOfBestResult)))
            {
                _proxySelectionList[_index].AddGoodStart();
            }
            else
            {
                _proxySelectionList[_index].AddBadStart();
            }
            _index++;
        }