// поиск перевозчика с саммым коротким маршрутом от точки 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(); }