PathFinder.cs 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. DebugandTrace.CreeateTXT();
  74. DebugandTrace.OTV(criticalPath);
  75. pathes.Clear();
  76. }
  77. public void CalculateMinimalPath()
  78. {
  79. ReadSaveData.ReadData(readPath, ref activities);
  80. CalculatePathes();
  81. var minimalPath = FindMinimalPath();
  82. ReadSaveData.WriteToFile(savePath, minimalPath);
  83. pathes.Clear();
  84. }
  85. }
  86. }