PathFinder.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace MathModTasks
  8. {
  9. class PathFinder
  10. {
  11. string readPath;
  12. string savePath;
  13. public PathFinder(string readPath, string savePath)
  14. {
  15. this.readPath = readPath;
  16. this.savePath = savePath;
  17. }
  18. List<Activity> activities = new List<Activity>(); //Список всех работ (в графике это дуги)
  19. List<Path> pathes = new List<Path>(); //Список всех путей
  20. int FindStartingPos() //Метод для поиска начальной точки
  21. {
  22. foreach (Activity activity in activities) //Если нет таких дуг, которые бы входили в данную точку, то она начальная.
  23. if (activities.Where(x => x.eventEnd == activity.eventStart).Count() == 0) return activity.eventStart;
  24. return -1;
  25. }
  26. int FindEndingPos() //Метод для поиска конечной точки
  27. {
  28. foreach (Activity activity in activities) //Если нет таких дуг, которые бы исходили из данной точки, то она конечная.
  29. if (activities.Where(x => x.eventStart == activity.eventEnd).Count() == 0) return activity.eventEnd;
  30. return -1;
  31. }
  32. void CalculatePathes() //Метод подсчета путей
  33. {
  34. foreach (Activity activity in activities.Where(x => x.eventStart == FindStartingPos())) //Сначала в список путей заносятся все начальные дуги
  35. {
  36. pathes.Add(new Path { path = activity.eventStart + "--" + activity.eventEnd, lastPoint = activity.eventEnd, length = activity.time });
  37. }
  38. for (int i = 0; i < pathes.Count; i++) //Затем программа начинает обход по всем записанным путям (в ходе выполнения цикла их количество пополняется)
  39. {
  40. foreach (Activity activity in activities.Where(x => x.eventStart == pathes[i].lastPoint)) //В список путей заносятся новые пути, которые исходят из проверяемого в данных момент
  41. {
  42. //Таким образом в список заносятся все промежуточные пути, зато работает
  43. pathes.Add(new Path { path = pathes[i].path + "--" + activity.eventEnd, lastPoint = activity.eventEnd, length = pathes[i].length + activity.time });
  44. }
  45. }
  46. }
  47. Path FindCriticalPath() //Метод поиска критического пути
  48. {
  49. int maxLength = 0;
  50. foreach (Path path in pathes.Where(x => x.lastPoint == FindEndingPos())) //Проверяет все пути, конечная точка которых совпадает с концом сети
  51. {
  52. if (path.length > maxLength) maxLength = path.length; //Вычисляет самый длинный путь из представленных
  53. }
  54. Path criticalPath = pathes.Find(x => x.length == maxLength); //И возвращает его
  55. return criticalPath;
  56. }
  57. Path FindMinimalPath() //Метод поиска минимального пути
  58. {
  59. int minLength = int.MaxValue;
  60. foreach (Path path in pathes.Where(x => x.lastPoint == FindEndingPos()))
  61. {
  62. if (path.length < minLength) minLength = path.length; //То же самое, но ищет минимальный
  63. }
  64. Path minimalPath = pathes.Find(x => x.length == minLength);
  65. return minimalPath;
  66. }
  67. public void CalculateCriticalPath()
  68. {
  69. ReadSaveData.ReadData(readPath, ref activities);
  70. CalculatePathes();
  71. var criticalPath = FindCriticalPath();
  72. ReadSaveData.WriteToFile(savePath, criticalPath);
  73. pathes.Clear();
  74. }
  75. public void CalculateMinimalPath()
  76. {
  77. ReadSaveData.ReadData(readPath, ref activities);
  78. CalculatePathes();
  79. var minimalPath = FindMinimalPath();
  80. ReadSaveData.WriteToFile(savePath, minimalPath);
  81. pathes.Clear();
  82. }
  83. }
  84. }