|
@@ -0,0 +1,344 @@
|
|
|
+using System;
|
|
|
+
|
|
|
+namespace Мат_моделирование_1
|
|
|
+{
|
|
|
+ class Program
|
|
|
+ {
|
|
|
+ static void Main(string[] args)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ Console.WriteLine("Сделать первоначальное распределение по методу северо-западного угла в транспортной задаче с учетом преобразования исходной матрицы А в матрицу В по правилу:В = {mахл + 1}-А");
|
|
|
+ uint r, c;//размерности матрицы и векторов
|
|
|
+ while (true)//ввод потребителей(размерности по столбцам)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write("Введите количество потребителей: ");
|
|
|
+ c = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ if (c < 2)
|
|
|
+ {
|
|
|
+ Console.WriteLine("Потребителей должно быть не менее двух! Повторите ввод");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ while (true)//ввод поставщиков(размерности по стокам)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write("Введите количество поставщиков: ");
|
|
|
+ r = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ if (r < 2)
|
|
|
+ {
|
|
|
+ Console.WriteLine("Поставщиков должно быть не менее двух! Повторите ввод");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ int i = 0, j = 0;//переменные для циклов
|
|
|
+ uint[,] matrxA = new uint[r, c];//матрица затрат
|
|
|
+ Console.WriteLine("Ввод таблицы затрат на перевозку продукции:");//ввод данных в таблицу затрат
|
|
|
+ for (i = 0; i < matrxA.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < matrxA.GetLength(1); j++)
|
|
|
+ {
|
|
|
+
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write($"Введите стоимость перевозки от {i + 1} поставщика к {j + 1} потребителю: ");
|
|
|
+ matrxA[i, j] = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.WriteLine("Таблица затрат на перевозку продукции:");//вывод таблицы затрат на экран
|
|
|
+ for (i = 0; i < matrxA.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < matrxA.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ Console.Write(matrxA[i, j] + "\t");
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+ char otv;//переменная для диалога с пользователем
|
|
|
+ //Изменение матрицы
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write("\nХотите изменить данные о таблице?\nДа(N)/Нет(любая клавиша)\nОтвет: ");
|
|
|
+ otv = Convert.ToChar(Console.ReadLine());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (otv.Equals('n') || otv.Equals('т') || otv.Equals('N') || otv.Equals('Т'))
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Console.Write("Введите номер поставщика, затем номер потребителя, который вы хотите изменить\nОтвет:\n");
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ i = Convert.ToInt32(Console.ReadLine());
|
|
|
+ j = Convert.ToInt32(Console.ReadLine());
|
|
|
+ if (i < c + 1 && j < r + 1)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write("Введите новое значение: ");
|
|
|
+ uint temp = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ if (temp != 0)
|
|
|
+ {
|
|
|
+ Console.WriteLine($" Была изменена {i} {j} ячейка таблицы c {matrxA[i - 1, j - 1]} на {temp}");
|
|
|
+ matrxA[i - 1, j - 1] = temp;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Console.WriteLine("Вы ввели нулевое значение! Повторите ввод");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введенная размерность не соответствует матрице! Повторите ввод");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.Clear();
|
|
|
+ uint max = 0;//нахождение максимальной затраты на перевозку
|
|
|
+ for (i = 0; i < matrxA.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < matrxA.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ if (matrxA[i, j] > max)
|
|
|
+ {
|
|
|
+ max = matrxA[i, j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine($"Максимальная затрата на перевозку равна - {max}");
|
|
|
+ uint[,] matrxB = new uint[r, c];//новая таблица затрат, пересчитанная по правилу, указанному в задании
|
|
|
+ for (i = 0; i < matrxB.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < matrxB.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ matrxB[i, j] = (max + 1) - matrxA[i, j];
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ Console.WriteLine("Пересчитанная таблица затрат:");//вывод на экран новой таблицы затрат
|
|
|
+ for (i = 0; i < matrxB.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < matrxB.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ Console.Write(matrxB[i, j] + "\t");
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+ uint[] m = new uint[r];//вектор мощности поставщиков
|
|
|
+ uint[] n = new uint[c];//вектор спроса потребителей
|
|
|
+ uint valueM = 0, valueN = 0;
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ Console.WriteLine("Ввод данных о количестве продукции поставщиков (m):");//ввод данных в вектор мощности поставщиков
|
|
|
+ for (i = 0; i < m.Length; i++)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write($"Введите количество продукции у {i + 1} поставщика: ");
|
|
|
+ m[i] = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine("Ввод данных о запрашиваемом количестве продукции потребителями(n):");//ввод данных в вектор спроса потребителей
|
|
|
+ for (i = 0; i < n.Length; i++)
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write($"Введите количество необходимой продукции для {i + 1} потребителя: ");
|
|
|
+ n[i] = Convert.ToUInt32(Console.ReadLine());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (i = 0; i < m.Length; i++)
|
|
|
+ {
|
|
|
+ valueM += m[i];
|
|
|
+ }
|
|
|
+ for (i = 0; i < n.Length; i++)
|
|
|
+ {
|
|
|
+ valueN += n[i];
|
|
|
+ }
|
|
|
+ if (valueM == valueN)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else//проверка на равенство суммы элементов векторов
|
|
|
+ {
|
|
|
+ Console.WriteLine("Вектор мощности (m) и cпроса (n) должны быть равны, повторите ввод!");
|
|
|
+ valueM = 0;
|
|
|
+ valueN = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine("Вектор мощности (m):");//вывод на экран
|
|
|
+ for (i = 0; i < m.Length; i++)
|
|
|
+ {
|
|
|
+ Console.Write($"{m[i]} ");
|
|
|
+ }
|
|
|
+ Console.WriteLine("\nВектор спроса (n):");//вывод на экран
|
|
|
+ for (i = 0; i < n.Length; i++)
|
|
|
+ {
|
|
|
+ Console.Write($"{n[i]} ");
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.WriteLine("\nМатрица тарифов:");//вывод на экран матрицы и векторов
|
|
|
+ Console.Write(" ");
|
|
|
+ for (i = 0; i < n.Length; i++)
|
|
|
+ {
|
|
|
+ Console.Write($"{n[i]} ");
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ for (i = 0; i < matrxB.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ Console.Write($"{m[i]} ");
|
|
|
+ for (j = 0; j < matrxB.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ Console.Write($"{matrxB[i, j]} ");
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+ uint[,] raspr = new uint[r, c];//массив для распределения
|
|
|
+ for (i = 0; i < raspr.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < raspr.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ raspr[i, j] = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ i = 0;
|
|
|
+ j = 0;
|
|
|
+ //алгоритм распределения
|
|
|
+ while (i < r && j < c)
|
|
|
+ {
|
|
|
+ if (n[j] > m[i])
|
|
|
+ {
|
|
|
+ raspr[i, j] = m[i];
|
|
|
+ n[j] -= m[i];
|
|
|
+ m[i] = 0;
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ raspr[i, j] = n[j];
|
|
|
+ m[i] -= n[j];
|
|
|
+ n[j] = 0;
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ for (i = 0; i < raspr.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < raspr.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ Console.Write($"{raspr[i, j]} ");
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+ uint F = 0;//нахождение функции распределения
|
|
|
+ for (i = 0; i < raspr.GetLength(0); i++)
|
|
|
+ {
|
|
|
+ for (j = 0; j < raspr.GetLength(1); j++)
|
|
|
+ {
|
|
|
+ if (raspr[i, j] != 0)
|
|
|
+ {
|
|
|
+ F += raspr[i, j] * matrxB[i, j];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Console.WriteLine($"F = {F} у.д.е");
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ Console.Write("\nПовторить программу?\nДа(Y)/Нет(N)\nОтвет: ");
|
|
|
+ otv = Convert.ToChar(Console.ReadLine());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ catch
|
|
|
+ {
|
|
|
+ Console.WriteLine("Введены некорректные данные!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (!(otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
|
|
|
+ {
|
|
|
+ Console.Clear();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Console.Clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|