public TwoWayLinkedList GetRoute(TwoWayLinkedList chosenCities, City startPoint)
        {
            /*
             * LIST chosenCities SHOULDN'T CONTAIN STARTPOINT
             */
            City currentCity = startPoint;

            int currentCityIndex = 0;

            int[] distanceFromCurrentCity;

            City nearestNeighbour;

            int nearestNeighbourIndex;

            TwoWayLinkedList route = new TwoWayLinkedList();

            while (chosenCities.GetSize() != 0)
            {
                currentCityIndex        = FindCurrentCityIndex(currentCity);
                distanceFromCurrentCity = Dijkstra(CitiesInfo.Distances, currentCityIndex);
                nearestNeighbourIndex   = MinDistanceIndex(distanceFromCurrentCity, chosenCities);
                nearestNeighbour        = CitiesInfo.Cities[nearestNeighbourIndex];
                route.Concatenation(intermediateCities[nearestNeighbourIndex]);
                route.PushLast(nearestNeighbour);
                chosenCities.DelMidle(chosenCities.IndexOf(nearestNeighbour));
                currentCity = nearestNeighbour;
            }
            return(ClearRepetitions(route));
        }
예제 #2
0
        public TwoWayLinkedList GetBestCities(int citiesQuantity)
        {
            TwoWayLinkedList cities = new TwoWayLinkedList();

            HidddenRMLTraversal(ref citiesQuantity, cities, root);
            return(cities);
        }
예제 #3
0
        public TwoWayLinkedList BestCitiesByPopulation(int minPopulation, int maxPopulation, int citiesQuantity)
        {
            TwoWayLinkedList cities = new TwoWayLinkedList();

            HiddenBestCitiesByPopulation(minPopulation, maxPopulation, ref citiesQuantity, cities, root);
            return(cities);
        }
예제 #4
0
 private void HidddenRMLTraversal(ref int citiesQuantity, TwoWayLinkedList cities, Node node)
 {
     if (node.IsLeaf())
     {
         if (citiesQuantity != 0)
         {
             cities.PushLast(node.value);
             citiesQuantity--;
         }
         else
         {
             return;
         }
     }
     else
     {
         if (node.rightLeaf != null)
         {
             HidddenRMLTraversal(ref citiesQuantity, cities, node.rightLeaf);
         }
         if (citiesQuantity != 0)
         {
             cities.PushLast(node.value);
             citiesQuantity--;
             if (node.leftLeaf != null)
             {
                 HidddenRMLTraversal(ref citiesQuantity, cities, node.leftLeaf);
             }
         }
         else
         {
             return;
         }
     }
 }
 private void button1_Click(object sender, EventArgs e)
 {
     //foreach (City city in C)
     //{
     //    CClon.DelByName(city.Name);
     //}
     C = CClon;
     ShouC();
 }
        private TwoWayLinkedList CopyList(TwoWayLinkedList list)
        {
            TwoWayLinkedList copy = new TwoWayLinkedList();

            foreach (City city in list)
            {
                copy.PushLast(city);
            }
            return(copy);
        }
        private int MinDistanceIndex(int[] array, TwoWayLinkedList chosenCities)
        {
            int minValue = int.MaxValue;
            int minIndex = 0;

            for (int i = 0; i < array.Length; i++)
            {
                if (array[i] < minValue && array[i] != 0 && chosenCities.Contains(CitiesInfo.Cities[i]))
                {
                    minIndex = i;
                    minValue = array[i];
                }
            }
            return(minIndex);
        }
        private void tourGridViewB_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string cityName = tourGridViewB.CurrentCell.Value.ToString();
            City   city     = C.Find(cityName);

            CC.DelByName(cityName);
            C = new TwoWayLinkedList();
            foreach (City city1 in CC)
            {
                C.PushLast(city1);
            }
            D.PushLast(city);
            ShouC();
            ShouD();
        }
        private void givenCitiesGridViewA_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            string cityName = givenCitiesGridViewA.CurrentCell.Value.ToString();
            City   city     = AA.Find(cityName);

            AA.DelByName(cityName);
            A = new TwoWayLinkedList();
            foreach (City city1 in AA)
            {
                A.PushLast(city1);
            }
            B.PushLast(city);
            ShouA();
            ShouB();
        }
 public void Concatenation(TwoWayLinkedList secondList)/// В этот метод передаёться список который надо добавить к
 ///самому себе лист.конкатенация(лист2)
 {
     // secondHead =  secondList.head;
     //Node secondTail = secondList.last;
     if (secondList.Size == 0)
     {
         return;
     }
     else if (this.Size == 0)
     {
         head = secondList.head;
         last = secondList.last;
     }
     this.last.pNext = secondList.head;
     this.last       = secondList.last;
 }
        private TwoWayLinkedList ClearRepetitions(TwoWayLinkedList listWithRepetetives)
        {
            /*
             * Unfortunately, GetRoute method has some issues. It creates necessary list, it's already good,
             * but also contains some repetetive cities. This problem isn't fatal, so this method was created
             * to fix it.
             */
            TwoWayLinkedList list = new TwoWayLinkedList();
            City             tmp  = new City(".", 0, 0);

            foreach (City city in listWithRepetetives)
            {
                if (tmp.Name != city.Name)
                {
                    list.PushLast(city);
                    tmp = city;
                }
            }
            return(list);
        }
        //!!!1по нажатию на город на гридвю А нужно из списка А удеалить указаный город Добавить его в список Б
        //!!!1 и вывести список А в грид А и список Б в Грид Б

        private void MakeWayBtn_Click(object sender, EventArgs e)
        {
            WayCreator wayCreator = new WayCreator();
            City       city       = B.GetFirst();

            B.DelFirst();
            C = wayCreator.GetRoute(B, city);
            foreach (City city1 in C)
            {
                CC.PushLast(city1);
            }
            foreach (City city2 in C)
            {
                CClon.PushLast(city2);
            }

            ShouC();
            groupBoxSelectMandatoryCityToVisit.Enabled = false; // это должно быть в конце метода!!!!
            groupBoxDefinitionListOfCities.Enabled     = true;  //  это должно быть в конце метода!!!!

            //!!!1 в грид С передать список городов который был проложен саниным искателем пути (в искатель пути передать спаисок Б)
            //!!!1 Сделать не активными все уж ненужные елементы формы
        }
        public void QuickSortPeopleYoungerTwenty()
        {
            Node pivot = this.last;

            //Node first = this.head;
            if (this.Size > 1)
            {
                TwoWayLinkedList listMorePivot = new TwoWayLinkedList();
                TwoWayLinkedList listLessPivot = new TwoWayLinkedList();
                foreach (City city in this)
                {
                    if (city == this.last.data)
                    {
                        break;
                    }
                    if (city.AmountPeople >= pivot.data.AmountPeopleYoungerTwenty)
                    {
                        listMorePivot.PushFirst(city);
                    }
                    else
                    {
                        listLessPivot.PushFirst(city);
                    }
                }

                listMorePivot.QuickSortPeopleYoungerTwenty();
                listLessPivot.QuickSortPeopleYoungerTwenty();

                listLessPivot.PushLast(pivot.data);
                listLessPivot.Concatenation(listMorePivot);

                this.head = listLessPivot.head;
                this.last = listLessPivot.last; // присваевается концу списка меньших за опорный ибо после конкатенации в списке меньших за опроный
                                                // находится уже сума списков больших и меньших за опроных, а список больших остаеться быть таким же и иногода он может  быть пустым.
            }
        }
        public ManagerForm()
        {
            TwoWayLinkedList toReturnList = new TwoWayLinkedList();// список городов для передачи на следущую форму

            InitializeComponent();
        }
예제 #15
0
 private void HiddenBestCitiesByPopulation(int minPopulation, int maxPopulation, ref int citiesQuantity, TwoWayLinkedList cities, Node node)
 {
     if (node.IsLeaf())
     {
         if (node.value.AmountPeople >= minPopulation && node.value.AmountPeople <= maxPopulation)
         {
             if (citiesQuantity != 0)
             {
                 cities.PushLast(node.value);
                 citiesQuantity--;
             }
             else
             {
                 return;
             }
         }
     }
     else
     {
         if (node.rightLeaf != null)
         {
             HiddenBestCitiesByPopulation(minPopulation, maxPopulation, ref citiesQuantity, cities, node.rightLeaf);
         }
         if (node.value.AmountPeople >= minPopulation && node.value.AmountPeople <= maxPopulation)
         {
             if (citiesQuantity != 0)
             {
                 cities.PushLast(node.value);
                 citiesQuantity--;
             }
             else
             {
                 return;
             }
         }
         if (node.leftLeaf != null)
         {
             HiddenBestCitiesByPopulation(minPopulation, maxPopulation, ref citiesQuantity, cities, node.leftLeaf);
         }
     }
 }
 public Vertex(int weight, bool isValid)
 {
     Weight  = weight;
     IsValid = isValid;
     Route   = new TwoWayLinkedList();
 }
        private void findCitiesBtn_Click(object sender, EventArgs e)
        {
            int amountCytisWichWined = cityNumTrackBar.Value;

            if (populationRBtn.Checked)
            {
                try
                {
                    if (textBoxPeopleFrom.Text == "")
                    {
                        MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми.");
                        textBoxPeopleFrom.Text = "0";
                        return;
                    }
                    if (textBoxPeopleTo.Text == "")
                    {
                        MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми.");
                        textBoxPeopleTo.Text = "3611000";
                        return;
                    }
                    A = citiesBTree.BestCitiesByPopulation(Convert.ToInt32(textBoxPeopleFrom.Text), Convert.ToInt32(textBoxPeopleTo.Text), cityNumTrackBar.Value);
                    //!!!1 вытащить из дерева нужный список добавить на офрму нужные текст боксы для данных аналоично
                    //!!!1 для последующих ийфов. Текстбоксы с мин и макс занчением можно сделать общиедля всех
                    groupBoxSearchAmountCities.Enabled         = false;
                    groupBoxSelectMandatoryCityToVisit.Enabled = true;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            else if (underTwentyRBtn.Checked)
            {
                if (textBoxPeopleFrom.Text == "" && textBoxPeopleTo.Text == "")
                {
                    MessageBox.Show("Минимальное и максимальное значения не могут быть пустыми.");
                    return;
                }
                A = citiesBTree.BestCitiesByPopulationYounger20(Convert.ToInt32(textBoxPeopleFrom.Text), Convert.ToInt32(textBoxPeopleTo.Text), cityNumTrackBar.Value);
                groupBoxSearchAmountCities.Enabled         = false;
                groupBoxSelectMandatoryCityToVisit.Enabled = true;
            }
            else if (citiesHashRBtn.Checked)
            {
                A = citiesBTree.GetBestCities(cityNumTrackBar.Value);
                groupBoxSearchAmountCities.Enabled         = false;
                groupBoxSelectMandatoryCityToVisit.Enabled = true;
            }
            else
            {
                MessageBox.Show("Выбирите 1 параметр по которому нужно представить города");
                return;
            }
            foreach (City city in A)
            {
                AA.PushLast(city);
            }
            //!!!1 добавленые поля толжны стать не доступны после нажатия указаного батона
            //!!!1 также небходимо будет создать кнопку обнуления которая сбросит вообще все параметры на начало если юзер рукожоп и ошибся
            //!!!1 вывести в грид вю "givenCitiesGridViewA" список полученый в итоге
            //!!!1 записать етот полученый список в атрибьут класа "список А"
            for (int k = 0; k < cityNumTrackBar.Value; k++)
            {
                givenCitiesGridViewA.Rows.Add();
            }
            int a = 0;

            foreach (City city in A)
            {
                givenCitiesGridViewA[0, a].Value = city.Name;
                givenCitiesGridViewA[2, a].Value = city.AmountPeopleYoungerTwenty;
                givenCitiesGridViewA[1, a].Value = city.AmountPeople;
                a++;
            }
        }
예제 #18
0
 public MapForm(TwoWayLinkedList city)
 {
     InitializeComponent();
     cities = city;
 }