Exemplo n.º 1
0
        // поиск перевозчика с саммым коротким маршрутом от точки A до точки B
        public void SearchBestWay(Carriers carriers, Routes routes, Order order)
        {
            int pointA = routes.GetCityNumber(order.from);
            int pointB = routes.GetCityNumber(order.to);

            // подсчет найденных перевозчиков
            int carriersCount = 1;

            // смотрим перевозчиков
            foreach (Carrier c in carriers.carriersList)
            {
                // смотрим маршрутный лист перевозчика - идем по связке путей
                for (int i = 0; i < c.carrierRoutesIdList.Length; i++)
                {
                    string strID     = c.carrierRoutesIdList[i];
                    int    firstNode = Convert.ToInt32(strID.Substring(0, strID.IndexOf('-')));
                    if (pointA == firstNode)
                    {
                        int secondNode = Convert.ToInt32(strID.Substring(strID.IndexOf('-') + 1));
                        ABdistance += routes.arrRoutes[firstNode, secondNode].routeDistance;
                        pointA      = secondNode;

                        if (secondNode == pointB)
                        {
                            c.foundRouteAB = true;
                            //carriersCount++;
                            c.distanceABforOrder = ABdistance;
                            break;
                        }
                    }
                }

                if (ABdistance < minDistance)
                {
                    minDistance          = ABdistance;
                    carrierIDwithBestWay = c.carrierID;
                }



                c.distanceABforOrder = ABdistance;

                if (c.foundRouteAB)
                {
                    Console.WriteLine($" {carriersCount++}) - Перевозчик № {c.carrierID} - " +
                                      $"Расстояние между пунктами {c.distanceABforOrder}км {c.dayABforOrder = c.distanceABforOrder / kmPerDay}дн ");
                }


                // для просмотра маршрута у следующего перевозчика приводим вводные данные в исходное состояние
                ABdistance = 0;
                pointA     = routes.GetCityNumber(order.from);
                pointB     = routes.GetCityNumber(order.to);
            }
            Console.WriteLine();
            //Console.WriteLine($"Найдено по запросу - {carriersCount - 1}");
            Console.WriteLine($"Самый короткий путь из {order.from} в {order.to} у Перевозчика № {carrierIDwithBestWay} - расстояние {minDistance}км");

            Console.WriteLine();
            Console.WriteLine($"Будет доставлено за  {minDistance / kmPerDay} дней");

            Console.WriteLine("\n\n");
        }
        public void AD(Routes routes, Carriers carriers) //(int pointA, int pointB)
        {
            Console.WriteLine(routes.arrRoutes.GetLength(1));
            int size = routes.arrRoutes.GetLength(1); // устанавливаем размер матрицы связей

            int[,] linkMatrix = new int[size, size];  // матрица связей
            int[] distance = new int[size];           // минимальное расстояние
            int[] nodes = new int[size];              // посещенные вершины
            int   tempDistance, minIndex, minDistance;
            int   beginIndex = 0;

            /* Считываем все routeID (3-15 это имя, в имени 3 - номер города 15 - номер для связи)
             * у всех имеющихся перевозчиков,
             * чтобы заполнить матрицу связей для поиска оптимального маршрута
             */
            List <string> routesID = new List <string>();

            foreach (Carrier i in carriers.carriersList)
            {
                for (int r = 0; r != i.carrierRoutesIdList.Length; r++)
                {
                    routesID.Add(i.carrierRoutesIdList[r]);
                    Console.WriteLine(i.carrierRoutesIdList[r]);
                }
            }

            /* routeID содержит запись 3-15, где 3 вершина  15 это признак второй вершины с которой
             * есть связь например у вершины 3-15 есть связь с вершиной 15-18 */

            //Инициализация матрицы связей
            //Записываем в матрицу имеющиеся маршруты перевозчиков
            for (int i = 0; i < size; i++)
            {
                linkMatrix[i, i] = 0;
                for (int j = i + 1; j < size; j++)
                {
                    foreach (string strRouteId in routesID)
                    {
                        int firstInd  = Convert.ToInt32(strRouteId.Substring(strRouteId.IndexOf('-')));
                        int secondInd = Convert.ToInt32(strRouteId.Substring(0, strRouteId.IndexOf('-')));
                        if (true)
                        {
                            linkMatrix[i, j] = routes.arrRoutes[i, j].routeDistance;
                            linkMatrix[j, i] = routes.arrRoutes[j, i].routeDistance;
                        }
                        //if (strRouteId == routes.arrRoutes[i, j].routeID)
                        //{
                        //    linkMatrix[i, j] = routes.arrRoutes[i, j].routeDistance;
                        //    linkMatrix[j, i] = routes.arrRoutes[j, i].routeDistance;
                        //}
                    }
                }
            }
            Console.WriteLine();

            // Вывод матрицы связей
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    Console.Write(linkMatrix[i, j] + "\t");
                }
                Console.WriteLine();
            }
            Console.WriteLine();

            //Инициализация вершин и расстояний
            for (int i = 0; i < size; i++)
            {
                distance[i] = 10000; // устанавливаем максимальный вес вершины
                nodes[i]    = 1;     // помечаем все вершины 1, признак того что они не просмотрены
            }
            distance[beginIndex] = 0;

            // Шаг алгоритма
            do
            {
                minIndex    = 10000;
                minDistance = 10000;
                for (int i = 0; i < size; i++)
                {     // Если вершину ещё не обошли и вес меньше minDistance
                    if ((nodes[i] == 1) && (distance[i] < minDistance))
                    { // Переприсваиваем значения
                        minDistance = distance[i];
                        minIndex    = i;
                    }
                }
                // Добавляем найденный минимальный вес
                // к текущему весу вершины
                // и сравниваем с текущим минимальным весом вершины
                if (minIndex != 10000)
                {
                    for (int i = 0; i < size; i++)
                    {
                        // проверяем есть ли связь у вершины
                        if (linkMatrix[minIndex, i] > 0)
                        {
                            tempDistance = minDistance + linkMatrix[minIndex, i];
                            if (tempDistance < distance[i])
                            {
                                distance[i] = tempDistance;
                            }
                        }
                    }
                    nodes[minIndex] = 0;
                }
            } while (minIndex < 10000);


            // Вывод кратчайших расстояний до вершин
            Console.Write("\nКратчайшие расстояния до вершин: ");
            for (int i = 0; i < size; i++)
            {
                Console.Write(distance[i] + " ");
            }
            Console.WriteLine();

            // Восстановление пути
            int[] checkNodes = new int[size];                         // массив посещенных вершин
            int   end        = 4;                                     // индекс конечной вершины = 5 - 1

            checkNodes[0] = end + 1;                                  // начальный элемент - конечная вершина
            int k      = 1;                                           // индекс предыдущей вершины
            int weight = distance[end];                               // вес конечной вершины

            while (end != beginIndex)                                 // пока не дошли до начальной вершины
            {
                for (int i = 0; i < size; i++)                        // просматриваем все вершины
                {
                    if (linkMatrix[end, i] != 0)                      // если связь есть
                    {
                        int tempWeight = weight - linkMatrix[end, i]; // определяем вес пути из предыдущей вершины
                        if (tempWeight == distance[i])                // если вес совпал с рассчитанным
                        {                                             // значит из этой вершины и был переход
                            weight        = tempWeight;               // сохраняем новый вес
                            end           = i;                        // сохраняем предыдущую вершину
                            checkNodes[k] = i + 1;                    // и записываем ее в массив
                            k++;
                        }
                    }
                }
            }


            // Вывод пути (начальная вершина оказалась в конце массива из k элементов)
            Console.WriteLine("Вывод кратчайшего пути : ");
            for (int i = k - 1; i >= 0; i--)
            {
                Console.Write(checkNodes[i] + " - ");
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            // создаем строку с данными для подключения к БД SQL
            ConnDataBaseSQL db = new ConnDataBaseSQL();

            // создаем базу данных если не существует
            //db.CreareDataBase();

            // создаем основные объекты для работы программы
            //Worker worker = new Worker();
            Employee  employee  = new Employee();
            Employees employees = new Employees();

            Customer  customer  = new Customer();
            Customers customers = new Customers();

            Carrier  carrier  = new Carrier();
            Carriers carriers = new Carriers();

            Transport  transport  = new Transport();
            Transports transports = new Transports();

            Route  route  = new Route();
            Routes routes = new Routes();

            Order  order  = new Order();
            Orders orders = new Orders();
            // 1, 2, ...

            //==== делегаты ==== https://metanit.com/sharp/tutorial/3.13.php

            ObjectsInfo objectsInfo;

            objectsInfo  = employees.Info;
            objectsInfo += carriers.Info;
            objectsInfo += orders.Info;


            //==== события ==== https://metanit.com/sharp/tutorial/3.14.php

            //employees.EmployeeAdded += Show_Message;
            //employees.EmployeesAddedtoDB += Show_Message;

            //customers.CustomerAdded += Show_Message;
            //customers.CustomersAddedtoDB += Show_Message;

            //carriers.CarrierAdded += Show_Message;
            //customers.CustomersAddedtoDB += Show_Message;

            // ==================== создаем необходимые таблицы в БД ====================
            //employees.CreateTable(db);
            //customers.CreateTable(db);
            //carriers.CreateTable(db);
            //transports.CreateTable(db);
            //routes.CreateTable(db);
            // 1, 2, ...

            // ==================== Счетчики объектов ====================
            // установка начального значения для счетчика объектов,
            //чтобы корректно отражать ID вновь созданных объектов в текущей сессии программы
            //employee.SetCountObj(db);
            //customer.SetCountObj(db);
            //carrier.SetCountObj(db);
            //transport.SetCountObj(db);

            // ==================== Создаем объекты ====================
            Employee employee1 = new Employee("Селезнев", "Павел", "Федорович", new DateTime(1981, 01, 08), 810108100011, new DateTime(2010, 01, 23), "менеджер", 180000);
            Employee employee2 = new Employee("Подорогин", "Семен", "Петрович", new DateTime(1992, 08, 25), 920825100021, new DateTime(2010, 01, 23), "экспедитор", 120000);
            Employee employee3 = new Employee("Синицына", "Анна", "Дмитриевна", new DateTime(1994, 03, 18), 940318200031, new DateTime(2010, 01, 23), "техник", 80000);
            Employee employee4 = new Employee("Нестеров", "Павел", "Николаевич", new DateTime(2003, 10, 12), 031012300041, new DateTime(2010, 01, 23), "экспедитор", 180000);

            Customer customer1 = new Customer("Быстров", "Олег", "Васильевич", new DateTime(2001, 01, 01), 010101300051);
            Customer customer2 = new Customer("Хотелов", "Василий", "Генадьевич", new DateTime(2003, 12, 01), 031201300061);
            Customer customer3 = new Customer("Подавайкин", "Иван", "Петрович", new DateTime(2012, 02, 25), 120225300071);
            Customer customer4 = new Customer("Занудов", "Петр", "Алексеевич", new DateTime(2008, 08, 12), 080812300081);
            Customer customer5 = new Customer("Хорошев", "Андрей", "Юрьевич", new DateTime(1985, 03, 21), 850321100091);

            Carrier carrier1 = new Carrier("Скороходов", "Павел", "Васильевич", new DateTime(1985, 01, 01), 850101100051);
            Carrier carrier2 = new Carrier("Тяжеловесов", "Григорий", "Генадьевич", new DateTime(1991, 12, 01), 911201100061);
            Carrier carrier3 = new Carrier("Далеков", "Валентин", "Петрович", new DateTime(1987, 02, 25), 870225100071);
            Carrier carrier4 = new Carrier("Запасов", "Тарас", "Олегович", new DateTime(1985, 05, 15), 850515100093);

            Transport transport1 = new Transport("Volkswagen_Caddy", 815, 3);
            Transport transport2 = new Transport("Газель-Фургон", 1500, 9);
            Transport transport3 = new Transport("Камаз-Автофургон", 10200, 35);

            Order order1 = new Order(1, 100, 0.5, "Алматы", "Костанай", Order.OrderStatuses.newOrder);
            Order order2 = new Order(1, 100, 0.5, "Павлодар", "Костанай", Order.OrderStatuses.newOrder);
            Order order3 = new Order(1, 100, 0.5, "Караганда", "Петропавловск", Order.OrderStatuses.newOrder);
            Order order4 = new Order(1, 100, 0.5, "Алматы", "Караганда", Order.OrderStatuses.newOrder);

            // === создаем матрицу маршрутов и заполняем ее из файла ===
            //routes.FillArray();
            //routes.PrintArray();

            // ==================== Создаем списки объектов ====================

            employees.AddEmployee(employee1);
            employees.AddEmployee(employee2);
            employees.AddEmployee(employee3);
            employees.AddEmployee(employee4);

            customers.AddCustomer(customer1);
            customers.AddCustomer(customer2);
            customers.AddCustomer(customer3);
            customers.AddCustomer(customer4);
            customers.AddCustomer(customer5);

            carriers.AddCarrier(carrier1);
            carriers.AddCarrier(carrier2);
            carriers.AddCarrier(carrier3);
            carriers.AddCarrier(carrier4);

            transports.AddTransport(transport1);
            transports.AddTransport(transport2);
            transports.AddTransport(transport3);

            routes.FillArrayRoutes();
            //routes.PrintArrayRoutes();

            orders.AddOrder(order1);
            orders.AddOrder(order2);
            orders.AddOrder(order3);

            // ==================== Собираем маршрут перевозчику - формируем реальный маршрут ====================

            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Алматы", "Тараз");
            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Тараз", "Шымкент");
            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Шымкент", "Кызылорда");
            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Кызылорда", "Жезказган");
            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Жезказган", "Караганда");
            carrier1.AddRouteToСarrierRouteListByCityNamesAB(db, "Караганда", "Костанай");

            carrier2.AddRouteToСarrierRouteListByCityNamesAB(db, "Алматы", "Караганда");
            carrier2.AddRouteToСarrierRouteListByCityNamesAB(db, "Караганда", "Жезказган");
            carrier2.AddRouteToСarrierRouteListByCityNamesAB(db, "Жезказган", "Нур-Султан");
            carrier2.AddRouteToСarrierRouteListByCityNamesAB(db, "Нур-Султан", "Петропавловск");
            carrier2.AddRouteToСarrierRouteListByCityNamesAB(db, "Петропавловск", "Костанай");

            carrier3.AddRouteToСarrierRouteListByCityNamesAB(db, "Алматы", "Семей");
            carrier3.AddRouteToСarrierRouteListByCityNamesAB(db, "Семей", "Павлодар");
            carrier3.AddRouteToСarrierRouteListByCityNamesAB(db, "Павлодар", "Петропавловск");
            carrier3.AddRouteToСarrierRouteListByCityNamesAB(db, "Петропавловск", "Нур-Султан");
            carrier3.AddRouteToСarrierRouteListByCityNamesAB(db, "Нур-Султан", "Костанай");

            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Алматы", "Усть-Каменогорск");
            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Усть-Каменогорск", "Караганда");
            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Караганда", "Жезказган");
            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Жезказган", "Актобе");
            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Актобе", "Костанай");
            carrier4.AddRouteToСarrierRouteListByCityNamesAB(db, "Костанай", "Актобе");

            // ==================== Закрепляем транспорт за перевозчиком ====================
            carrier1.AddTransportToTransportsList(db, 1);
            carrier2.AddTransportToTransportsList(db, 2);
            carrier3.AddTransportToTransportsList(db, 3);
            carrier4.AddTransportToTransportsList(db, 3);

            // Запись одиночных объектов в таблицу SQL
            //employee1.InsertTable(db);
            //carrier1.InsertTable(db);
            //transport1.InsertTable(db);
            //route1.InsertTable(db);

            // запись коллекции объектов в таблицу SQL
            //employees.InsertTable(db);
            //customers.InsertTable(db);
            //routes.InsertTable(db);
            //transports.InsertTable(db);



            // Вывод информации об объекте
            //employees.Info();
            //customers.Info();
            //carriers.Info();
            //transports.Info();
            //routes.InfoFromSQLtable();
            //routes.InfoFromSQLtable();
            //transports.InfoFromSQLtable();

            ///////////////////////////////////////////////////////////
            //order1.Info();
            //order1.ChangeOrderStatus(Order.OrderStatuses.closeOrder);
            //order1.Info();


            // !!!!!!!!!!!!!! Реализовать алгоритм Дейкстры !!!!!!!!!!!!

            carriers.Info();
            //da.PrintLinkMatrix();
            DijkstraAlgorithm da = new DijkstraAlgorithm(routes, carriers);

            da.Algorithm(order1, routes);


            //========================================================================================

            /*По двум точкам из заказа сделать поиск маршрутов их содержащих, посчитать расстояние и
             * выбрать маршрут с наименьшей дистанцией.*/
            /*Посмотреть машину с максимальной загрузкой, но так чтобы в нее помещалась посылка из заказа*/

            //transports.Info();
            transport1.Loading(800, 1.5);
            transport2.Loading(1200, 4.5);
            transport3.Loading(10000, 34.0);
            //transports.Info();

            //carriers.Info();
            BestCarrier bc = new BestCarrier();

            bc.BestWayandPrice(carriers, routes, order1, transports);
            //bc.BestWayandPrice(carriers, routes, order2, transports);
            //bc.BestWayandPrice(carriers, routes, order3, transports);
            //bc.BestWayandPrice(carriers, routes, order4, transports);

            //========================================================================================

            // ========= Чтение запись объектов в XML =========

            //employees.DOMWriteXML("Employees.xml");
            //Employees xe = new Employees();
            //xe.DOMReadXML("Employees.xml");
            //xe.Info();

            //customers.Info();
            //customers.DOMWriteXML("Customers.xml");
            //Customers xc = new Customers();
            //xc.DOMReadXML("Customers.xml");
            //xc.Info();

            //carriers.DOMWriteXML("Carriers.xml");
            //Carriers xcarriers = new Carriers();
            //xcarriers.DOMReadXML("Carriers.xml");
            //xcarriers.Info();

            // ========= Перегрузка базовых методов =========
            //Console.WriteLine($"Hash code for object {employee.GetType()} : {employee1.GetHashCode()}");
            //Console.WriteLine($"Hash code for object {employee.GetType()} : {employee2.GetHashCode()}");
            //Console.WriteLine($"Hash code for object {employee.GetType()} : {employee3.GetHashCode()}");
            //Console.WriteLine($"Hash code for object {employee.GetType()} : {employee4.GetHashCode()}");

            //Console.WriteLine("----------------------------------------------------------------");
            //Console.WriteLine(employee1.Equals(employee1));
            //Console.WriteLine("----------------------------------------------------------------");
            //Console.WriteLine(employee1.ToString());

            // === сортировки через обобщенные интерфейсы ===

            /*
             * employees.Show();
             * employees.employeesList.Sort();
             * Console.WriteLine("===== сортировка фамилии =====");
             * employees.Show();
             *
             * employees.Show();
             * Console.WriteLine("===== сортировка по имени =====");
             * employees.employeesList.Sort(new Employee.SortByName());
             * employees.Show();
             *
             * employees.Show();
             * Console.WriteLine("===== сортировка по возрасту =====");
             * employees.employeesList.Sort(new Employee.SortByAge());
             * employees.Show();
             */

            // === Вызов методов инфо через делегата ===
            //objectsInfo();

            Console.ReadKey();
        }