ReadSaveData.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. public struct Item : IComparable<Item>
  10. {
  11. public int number, aTime, bTime;
  12. public override string ToString()
  13. {
  14. return aTime + " " + bTime;
  15. }
  16. public int CompareTo(Item item)
  17. {
  18. if (aTime <= bTime)
  19. {
  20. if (aTime > item.aTime)
  21. return 1;
  22. if (aTime < item.aTime)
  23. return -1;
  24. }
  25. else
  26. {
  27. if (bTime > item.bTime)
  28. return 1;
  29. if (bTime < item.bTime)
  30. return -1;
  31. }
  32. return 0;
  33. }
  34. }
  35. struct Activity
  36. {
  37. public int eventStart, eventEnd, time;
  38. }
  39. struct Path
  40. {
  41. public string path;
  42. public int lastPoint, length;
  43. }
  44. static class ReadSaveData
  45. {
  46. //Считывание данных для поиска критического и минимального пути
  47. //В первую строку записывается начало работы
  48. //Во вторую строку конец работы
  49. //В третью — ее длительность
  50. //В файле: начало | конец | длительность
  51. public static void ReadData(string path, ref List<Activity> activities)
  52. {
  53. if (!File.Exists(path))
  54. {
  55. Console.WriteLine("Файл не найден!");
  56. Console.ReadKey();
  57. Environment.Exit(0);
  58. }
  59. var lines = File.ReadAllLines(path);
  60. foreach (var line in lines)
  61. {
  62. string[] str = line.Split(';');
  63. activities.Add(new Activity { eventStart = Convert.ToInt32(str[0]), eventEnd = Convert.ToInt32(str[1]), time = Convert.ToInt32(str[2]) });
  64. }
  65. }
  66. //Считывание данных для поиска критического и минимального пути
  67. //В первую строку автоматически (в файле писать не надо) записывается номер
  68. //Во вторую строку время на первом станке
  69. //В третью строку время на втором станке
  70. //В файле: 1 станок | 2 станок
  71. public static void ReadData(string path, ref List<Item> items)
  72. {
  73. if (!File.Exists(path))
  74. {
  75. Console.WriteLine("Файл не найден!");
  76. Console.ReadKey();
  77. Environment.Exit(0);
  78. }
  79. var lines = File.ReadAllLines(path);
  80. int i = 1;
  81. foreach (var line in lines)
  82. {
  83. string[] str = line.Split(';');
  84. items.Add(new Item { number = i, aTime = Convert.ToInt32(str[0]), bTime = Convert.ToInt32(str[1]) });
  85. i++;
  86. }
  87. }
  88. /// <summary>
  89. /// Чтение данных из CSV-файла по указанному пути
  90. /// </summary>
  91. /// <param name="path">Путь к файлу</param>
  92. /// <returns></returns>
  93. /// <remarks>Транспортная задача: для чтения надо первую ячейку сделать НУЛЕМ! Остальные - как в таблице. Распределение работ между станками: данные в файле должны выглядеть как таблица, у которой значения ячеек разделены с помощью ";", без пробелов.</remarks>
  94. static public List<string[]> ReadData(string path)
  95. {
  96. List<string[]> data = new List<string[]>();
  97. try
  98. {
  99. using (StreamReader sr = new StreamReader(path, Encoding.UTF8, true))
  100. {
  101. while (sr.EndOfStream != true)
  102. {
  103. string[] str = sr.ReadLine().Split(';');
  104. data.Add(str);
  105. }
  106. }
  107. return data;
  108. }
  109. catch (FileNotFoundException)
  110. {
  111. Console.WriteLine("Ошибка считывания данных!");
  112. return data;
  113. }
  114. }
  115. //Для комивояжера
  116. /// <summary>
  117. /// Чтение данных из файла для задачи комивояжера
  118. /// </summary>
  119. /// <param name="path">Путь файла, из которого берутся данные</param>
  120. /// <param name="time">Массив, в который записываются данные</param>
  121. /// <remarks>Формат записи: Даннные записываются в файл csv. Там должны быть только САМИ ДЛИНЫ ПУТЕЙ, разделённые ';' (на концах элементов последнего столбца этого не нужно ставить)</remarks>
  122. public static void ReadData(string path, ref int[,] time)
  123. {
  124. if (!File.Exists(path))
  125. {
  126. Console.WriteLine("Файл не найден!");
  127. Console.ReadKey();
  128. Environment.Exit(0);
  129. }
  130. var lines = File.ReadAllLines(path);
  131. int k = 0;
  132. time = new int[lines.Length, lines.Length]; //Инициализируется массив, куда будут записываться значения
  133. foreach (var line in lines)
  134. {
  135. string[] str = line.Split(';'); //Считывание в строковой массив
  136. for (int j = 0; j < str.Length; j++)
  137. {
  138. time[k, j] = Convert.ToInt32(str[j]); //Передача в основной массив
  139. }
  140. k++;
  141. }
  142. }
  143. /// <summary>
  144. /// Запись в CSV-файл по указанному пути элементов массива message через ";"
  145. /// </summary>
  146. /// <param name="path">Путь для записи файла</param>
  147. /// <param name="messege">Строковый массив сообщений</param>
  148. /// <remarks>Используется в задаче распределения работ между станками</remarks>
  149. static public void WriteToFile(string path, string[] messege)
  150. {
  151. using (StreamWriter sw = File.CreateText(path))
  152. {
  153. foreach (var s in messege)
  154. {
  155. sw.WriteLine(s + ";");
  156. }
  157. }
  158. }
  159. /// <summary>
  160. /// Запись в CSV-файл по указанному пути элементов матрицы message через ";" (каждая строка - на новой строке)
  161. /// </summary>
  162. /// <param name="path">Путь для записи файла</param>
  163. /// <param name="message">Коллекция строковых массивов сообщений для записи</param>
  164. /// <remarks>Используется при решении транспортной задачи.</remarks>
  165. static public void WriteToFile(string path, List<string[]> message)
  166. {
  167. using (StreamWriter sw = File.CreateText(path))
  168. {
  169. foreach (var text in message)
  170. {
  171. foreach(var s in text)
  172. {
  173. sw.Write(s + ";");
  174. }
  175. sw.WriteLine();
  176. }
  177. }
  178. }
  179. /// <summary>
  180. /// Конвертирует коллекцию строкового типа в матрицу double
  181. /// </summary>
  182. /// <param name="list">Коллекция строкового типа</param>
  183. /// <returns></returns>
  184. /// <remarks>Используется в симплекс-методе.</remarks>
  185. static public double[,] StringListConverter(List<string[]> list)
  186. {
  187. double[,] d = new double[list.Count, list.First().Length];
  188. for (int i = 0; i < list.Count; i++)
  189. for (int j = 0; j < list.First().Length; j++)
  190. d[i, j] = Convert.ToDouble(list[i][j]);
  191. return d;
  192. }
  193. //Метод для путей
  194. public static void WriteToFile(string path, Path savingPath)
  195. {
  196. if (!File.Exists(path)) File.Create(path).Close();
  197. try
  198. {
  199. using (StreamWriter sw = new StreamWriter(path, false))
  200. {
  201. sw.WriteLine("Найденный путь имеет вид:");
  202. sw.WriteLine(savingPath.path);
  203. sw.WriteLine("Его длина составляет: " + savingPath.length);
  204. }
  205. }
  206. catch
  207. {
  208. Console.WriteLine("Не удалось записать данные в файл!");
  209. Console.ReadKey();
  210. Environment.Exit(0);
  211. }
  212. }
  213. //Для симплекс метода
  214. /// <summary>
  215. /// Запись результатов в файл для симплекс-метода
  216. /// </summary>
  217. /// <param name="path">Путь к файлу</param>
  218. /// <param name="result">Массив с результатами</param>
  219. public static void WriteToFile(string path, double[] result)
  220. {
  221. using (StreamWriter sw = new StreamWriter(path, false))
  222. {
  223. sw.WriteLine();
  224. sw.WriteLine("Решение:");
  225. sw.WriteLine("X[1] = " + result[0]);
  226. sw.WriteLine("X[2] = " + result[1]);
  227. }
  228. }
  229. //Для метода коммивояжера
  230. /// <summary>
  231. /// Метод записи результатов решения задачи комивояжера в файл
  232. /// </summary>
  233. /// <param name="path">Путь к файлу, в который записываются результаты</param>
  234. /// <param name="uzli">Количество узлов</param>
  235. /// <param name="puti">Массив, в котором хранятся получившиеся пути</param>
  236. /// <param name="f">Массив, в котором хранятся длины путей</param>
  237. public static void WriteToFile(string path, int uzli, string[] puti, int[] f)
  238. {
  239. if (!File.Exists(path)) File.Create(path).Close();
  240. using (StreamWriter sw = new StreamWriter(path, false))
  241. {
  242. sw.WriteLine("Все пути:");
  243. for (int i = 0; i < puti.Length; i++)
  244. {
  245. sw.WriteLine($"Путь: {puti[i]}, F = {f[i]} у.д.е.");
  246. }
  247. int min = f[0];
  248. for (int i = 1; i < puti.Length; i++)
  249. {
  250. if (min > f[i])
  251. min = f[i];
  252. }
  253. sw.WriteLine("\nОТВЕТ:\nПути с наименьшими затратами: \r\n");
  254. for (int i = 0; i < puti.Length; i++)
  255. {
  256. if (f[i] == min)
  257. sw.WriteLine((puti[i] + ", F = " + f[i] + "\r\n"));
  258. }
  259. }
  260. }
  261. }
  262. }