using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MathModTasks { public struct Item : IComparable { public int number, aTime, bTime; public override string ToString() { return aTime + " " + bTime; } public int CompareTo(Item item) { if (aTime <= bTime) { if (aTime > item.aTime) return 1; if (aTime < item.aTime) return -1; } else { if (bTime > item.bTime) return 1; if (bTime < item.bTime) return -1; } return 0; } } struct Activity { public int eventStart, eventEnd, time; } struct Path { public string path; public int lastPoint, length; } static class ReadSaveData { //Считывание данных для поиска критического и минимального пути //В первую строку записывается начало работы //Во вторую строку конец работы //В третью — ее длительность //В файле: начало | конец | длительность public static void ReadData(string path, ref List activities) { if (!File.Exists(path)) { Console.WriteLine("Файл не найден!"); Console.ReadKey(); Environment.Exit(0); } var lines = File.ReadAllLines(path); foreach (var line in lines) { string[] str = line.Split(';'); activities.Add(new Activity { eventStart = Convert.ToInt32(str[0]), eventEnd = Convert.ToInt32(str[1]), time = Convert.ToInt32(str[2]) }); } } //Считывание данных для поиска критического и минимального пути //В первую строку автоматически (в файле писать не надо) записывается номер //Во вторую строку время на первом станке //В третью строку время на втором станке //В файле: 1 станок | 2 станок public static void ReadData(string path, ref List items) { if (!File.Exists(path)) { Console.WriteLine("Файл не найден!"); Console.ReadKey(); Environment.Exit(0); } var lines = File.ReadAllLines(path); int i = 1; foreach (var line in lines) { string[] str = line.Split(';'); items.Add(new Item { number = i, aTime = Convert.ToInt32(str[0]), bTime = Convert.ToInt32(str[1]) }); i++; } } /// /// Чтение данных из CSV-файла по указанному пути /// /// Путь к файлу /// /// Транспортная задача: для чтения надо первую ячейку сделать НУЛЕМ! Остальные - как в таблице. Распределение работ между станками: данные в файле должны выглядеть как таблица, у которой значения ячеек разделены с помощью ";", без пробелов. static public List ReadData(string path) { List data = new List(); try { using (StreamReader sr = new StreamReader(path, Encoding.UTF8, true)) { while (sr.EndOfStream != true) { string[] str = sr.ReadLine().Split(';'); data.Add(str); } } return data; } catch (FileNotFoundException) { Console.WriteLine("Ошибка считывания данных!"); return data; } } //Для комивояжера /// /// Чтение данных из файла для задачи комивояжера /// /// Путь файла, из которого берутся данные /// Массив, в который записываются данные /// Формат записи: Даннные записываются в файл csv. Там должны быть только САМИ ДЛИНЫ ПУТЕЙ, разделённые ';' (на концах элементов последнего столбца этого не нужно ставить) public static void ReadData(string path, ref int[,] time) { if (!File.Exists(path)) { Console.WriteLine("Файл не найден!"); Console.ReadKey(); Environment.Exit(0); } var lines = File.ReadAllLines(path); int k = 0; time = new int[lines.Length, lines.Length]; //Инициализируется массив, куда будут записываться значения foreach (var line in lines) { string[] str = line.Split(';'); //Считывание в строковой массив for (int j = 0; j < str.Length; j++) { time[k, j] = Convert.ToInt32(str[j]); //Передача в основной массив } k++; } } /// /// Запись в CSV-файл по указанному пути элементов массива message через ";" /// /// Путь для записи файла /// Строковый массив сообщений /// Используется в задаче распределения работ между станками static public void WriteToFile(string path, string[] messege) { using (StreamWriter sw = File.CreateText(path)) { foreach (var s in messege) { sw.WriteLine(s + ";"); } } } /// /// Запись в CSV-файл по указанному пути элементов матрицы message через ";" (каждая строка - на новой строке) /// /// Путь для записи файла /// Коллекция строковых массивов сообщений для записи /// Используется при решении транспортной задачи. static public void WriteToFile(string path, List message) { using (StreamWriter sw = File.CreateText(path)) { foreach (var text in message) { foreach(var s in text) { sw.Write(s + ";"); } sw.WriteLine(); } } } /// /// Конвертирует коллекцию строкового типа в матрицу double /// /// Коллекция строкового типа /// /// Используется в симплекс-методе. static public double[,] StringListConverter(List list) { double[,] d = new double[list.Count, list.First().Length]; for (int i = 0; i < list.Count; i++) for (int j = 0; j < list.First().Length; j++) d[i, j] = Convert.ToDouble(list[i][j]); return d; } //Метод для путей public static void WriteToFile(string path, Path savingPath) { if (!File.Exists(path)) File.Create(path).Close(); try { using (StreamWriter sw = new StreamWriter(path, false)) { sw.WriteLine("Найденный путь имеет вид:"); sw.WriteLine(savingPath.path); sw.WriteLine("Его длина составляет: " + savingPath.length); } } catch { Console.WriteLine("Не удалось записать данные в файл!"); Console.ReadKey(); Environment.Exit(0); } } //Для симплекс метода /// /// Запись результатов в файл для симплекс-метода /// /// Путь к файлу /// Массив с результатами public static void WriteToFile(string path, double[] result) { using (StreamWriter sw = new StreamWriter(path, false)) { sw.WriteLine(); sw.WriteLine("Решение:"); sw.WriteLine("X[1] = " + result[0]); sw.WriteLine("X[2] = " + result[1]); } } //Для метода коммивояжера /// /// Метод записи результатов решения задачи комивояжера в файл /// /// Путь к файлу, в который записываются результаты /// Количество узлов /// Массив, в котором хранятся получившиеся пути /// Массив, в котором хранятся длины путей public static void WriteToFile(string path, int uzli, string[] puti, int[] f) { if (!File.Exists(path)) File.Create(path).Close(); using (StreamWriter sw = new StreamWriter(path, false)) { sw.WriteLine("Все пути:"); for (int i = 0; i < puti.Length; i++) { sw.WriteLine($"Путь: {puti[i]}, F = {f[i]} у.д.е."); } int min = f[0]; for (int i = 1; i < puti.Length; i++) { if (min > f[i]) min = f[i]; } sw.WriteLine("\nОТВЕТ:\nПути с наименьшими затратами: \r\n"); for (int i = 0; i < puti.Length; i++) { if (f[i] == min) sw.WriteLine((puti[i] + ", F = " + f[i] + "\r\n")); } } } } }