Program.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. using System;
  2. namespace zadacha_1
  3. {
  4. class Program
  5. {
  6. struct Element
  7. {
  8. public int Delivery { get; set; } //размер поставки
  9. public int Value { get; set; } //затраты
  10. public static int FindMinElement(int a, int b)
  11. {
  12. if (a > b) return b;
  13. if (a == b) { return a; }
  14. else return a;
  15. }
  16. }
  17. static void Main(string[] args)
  18. {
  19. while (true)
  20. {
  21. Console.WriteLine("Даны матрица затрат, вектор спроса и предложения. Определить оптимальные затраты на перевозку с помощью метода потенциалов, сделав первоначальное распределение по методу северо-западного угла.");
  22. Console.WriteLine();
  23. int i = 0;
  24. int j = 0;
  25. Element[,] C = new Element[4, 4]; //массив для хранения значений
  26. int[] a = new int[4];
  27. string[,] itog = new string[4, 4];
  28. uint minL = uint.MinValue;
  29. int indI = 0, indJ = 0;//переменные для хранения индекса минимального элемента
  30. int F = 0;//целевая функция
  31. uint max = uint.MinValue;//переменная для максимального элемента
  32. char otv;//переменная для диалог
  33. int q = 1;
  34. Console.WriteLine("Введите значения вектора предложения:");
  35. for (i = 0; i < 4; i++) //ввод значений вектора предложения
  36. {
  37. while (true)
  38. {
  39. try
  40. {
  41. Console.Write("a[{0}] = ", i + 1);
  42. a[i] = Convert.ToInt32(Console.ReadLine());
  43. if (a[i] > 0)
  44. break;
  45. else
  46. Console.WriteLine($"Не можеть быть отрицательных чисел и нуля");
  47. }
  48. catch
  49. {
  50. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  51. }
  52. }
  53. }
  54. while (true)
  55. {
  56. while (true)
  57. {
  58. try
  59. {
  60. Console.Write("\nХотите изменить данные(y/n)?\nОтвет: ");
  61. otv = Convert.ToChar(Console.ReadLine());
  62. break;
  63. }
  64. catch
  65. {
  66. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  67. }
  68. }
  69. if (otv.Equals('т') || otv.Equals('т') || otv.Equals('n') || otv.Equals('N'))
  70. {
  71. break;
  72. }
  73. else
  74. {
  75. Console.Write("Введите индекс элемента из матрицы предложения\nОтвет:\n");
  76. while (true)
  77. {
  78. i = Convert.ToInt32(Console.ReadLine());
  79. if (i < 4 + 1)
  80. {
  81. while (true)
  82. {
  83. try
  84. {
  85. Console.Write("Введите новое значение: ");
  86. uint temp = Convert.ToUInt32(Console.ReadLine());
  87. if (temp > 0)
  88. {
  89. Console.WriteLine($"Вы изменили {i} ячейку таблицы c {a[i - 1]} на {temp}");
  90. a[i - 1] = (int)temp;
  91. for (i = 0; i < 4; i++)
  92. {
  93. Console.Write("a[{0}] = " + a[i], i + 1);
  94. Console.WriteLine();
  95. }
  96. break;
  97. }
  98. else
  99. {
  100. Console.WriteLine("Нельзя ввести нулевое значение! Повторите ввод");
  101. }
  102. }
  103. catch
  104. {
  105. Console.WriteLine("Введены некорректные данные!");
  106. }
  107. }
  108. break;
  109. }
  110. else
  111. {
  112. Console.WriteLine("Индекс не найден! Повторите ввод");
  113. }
  114. }
  115. }
  116. }
  117. int[] b = new int[4];
  118. Console.WriteLine("Введите значения вектора спроса:");
  119. for (j = 0; j < b.Length; j++)//ввод значений вектора спроса
  120. {
  121. while (true)
  122. {
  123. try
  124. {
  125. Console.Write("b[{0}] = ", j + 1);
  126. b[j] = Convert.ToInt32(Console.ReadLine());
  127. if (b[j] > 0)
  128. break;
  129. else
  130. Console.WriteLine($"Не можеть быть отрицательных чисел и нуля");
  131. }
  132. catch
  133. {
  134. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  135. }
  136. }
  137. }
  138. while (true)
  139. {
  140. while (true)
  141. {
  142. try
  143. {
  144. Console.Write("\nХотите изменить данные(y/n)?\nОтвет: ");
  145. otv = Convert.ToChar(Console.ReadLine());
  146. break;
  147. }
  148. catch
  149. {
  150. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  151. }
  152. }
  153. if (otv.Equals('т') || otv.Equals('т') || otv.Equals('n') || otv.Equals('N'))
  154. {
  155. break;
  156. }
  157. else
  158. {
  159. Console.Write("Введите индекс элемента из матрицы предложения\nОтвет:\n");
  160. while (true)
  161. {
  162. i = Convert.ToInt32(Console.ReadLine());
  163. if (i < 4 + 1)
  164. {
  165. while (true)
  166. {
  167. try
  168. {
  169. Console.Write("Введите новое значение: ");
  170. uint temp = Convert.ToUInt32(Console.ReadLine());
  171. if (temp > 0)
  172. {
  173. Console.WriteLine($"Вы изменили {i} ячейку таблицы c {b[i - 1]} на {temp}");
  174. b[i - 1] = (int)temp;
  175. for (i = 0; i < 4; i++)
  176. {
  177. Console.Write("b[{0}] = " + b[i], i + 1);
  178. Console.WriteLine();
  179. }
  180. break;
  181. }
  182. else
  183. {
  184. Console.WriteLine("Нельзя ввести нулевое значение! Повторите ввод");
  185. }
  186. }
  187. catch
  188. {
  189. Console.WriteLine("Введены некорректные данные!");
  190. }
  191. }
  192. break;
  193. }
  194. else
  195. {
  196. Console.WriteLine("Индекс не найден! Повторите ввод");
  197. }
  198. }
  199. }
  200. }
  201. Console.WriteLine("Введите матрицу затрат:"); //ввод матрицы затрат
  202. for (i = 0; i < 4; i++)
  203. {
  204. for (j = 0; j < 4; j++)
  205. {
  206. while (true)
  207. {
  208. try
  209. {
  210. Console.Write("с[{0},{1}] = ", i + 1, j + 1);
  211. Console.ForegroundColor = ConsoleColor.Red;
  212. C[i, j].Value = Convert.ToInt32(Console.ReadLine());
  213. Console.ResetColor();
  214. if (C[i, j].Value > 0)
  215. break;
  216. else
  217. Console.WriteLine($"Не можеть быть отрицательных чисел и нуля");
  218. }
  219. catch
  220. {
  221. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  222. }
  223. }
  224. }
  225. }
  226. //Возможность изменять матрицу
  227. while (true)
  228. {
  229. while (true)
  230. {
  231. try
  232. {
  233. Console.Write("\nХотите изменить данные в таблице(y/n)?\nОтвет: ");
  234. otv = Convert.ToChar(Console.ReadLine());
  235. break;
  236. }
  237. catch
  238. {
  239. Console.WriteLine("Введены некорректные данные! Повторите ввод!");
  240. }
  241. }
  242. if (otv.Equals('т') || otv.Equals('т') || otv.Equals('n') || otv.Equals('N'))
  243. {
  244. break;
  245. }
  246. else
  247. {
  248. Console.Write("Введите индекс элемента из матрицы затрат\nОтвет:\n");
  249. while (true)
  250. {
  251. i = Convert.ToInt32(Console.ReadLine());
  252. j = Convert.ToInt32(Console.ReadLine());
  253. if (i < 4 + 1 && j < 4 + 1)
  254. {
  255. while (true)
  256. {
  257. try
  258. {
  259. Console.Write("Введите новое значение: ");
  260. uint temp = Convert.ToUInt32(Console.ReadLine());
  261. if (temp > 0)
  262. {
  263. Console.WriteLine($"Вы изменили {i} {j} ячейку таблицы c {C[i - 1, j - 1].Value} на {temp}");
  264. C[i - 1, j - 1].Value = (int)temp;
  265. for (i = 0; i < 4; i++)
  266. {
  267. for (j = 0; j < 4; j++)
  268. {
  269. Console.Write("с[{0},{1}] = " + C[i, j].Value, i + 1, j + 1);
  270. Console.WriteLine();
  271. }
  272. }
  273. break;
  274. }
  275. else
  276. {
  277. Console.WriteLine("Нельзя ввести нулевое значение! Повторите ввод");
  278. }
  279. }
  280. catch
  281. {
  282. Console.WriteLine("Введены некорректные данные!");
  283. }
  284. }
  285. break;
  286. }
  287. else
  288. {
  289. Console.WriteLine("Индекс не найден! Повторите ввод");
  290. }
  291. }
  292. }
  293. }
  294. i = j = 0;
  295. while (i < 4 && j < 4) //подсчет поставок по методу северо-западного угла
  296. {
  297. try
  298. {
  299. if (a[i] == 0) { i++; }
  300. if (b[j] == 0) { j++; }
  301. if (a[i] == 0 && b[j] == 0) { i++; j++; }
  302. C[i, j].Delivery = Element.FindMinElement(a[i], b[j]);
  303. a[i] -= C[i, j].Delivery;
  304. b[j] -= C[i, j].Delivery;
  305. }
  306. catch { }
  307. }
  308. int zap = 0; //переменная для подсчета заполенных клеток
  309. Console.WriteLine();
  310. Console.WriteLine("Первоначальное распределение по методу северо-западного угла:");
  311. for (i = 0; i < 4; i++) //вывод первоначального распределения
  312. {
  313. for (j = 0; j < 4; j++)
  314. {
  315. if (C[i, j].Delivery != 0)
  316. {
  317. Console.ForegroundColor = ConsoleColor.Blue;
  318. Console.Write("{0}", C[i, j].Value);
  319. Console.Write("/{0}\t", C[i, j].Delivery); Console.ResetColor();
  320. zap = zap + 1;
  321. }
  322. else
  323. Console.Write("{0}\t", C[i, j].Value);
  324. }
  325. Console.WriteLine();
  326. }
  327. uint strst = 7; //переменная для проверки на вырожденность
  328. Console.WriteLine("\nПроверка на вырожденность:");
  329. while (strst != zap)
  330. {
  331. minL = uint.MaxValue; //проверка на вырожденность
  332. Console.WriteLine("Таблица вырождена");
  333. for (i = 0; i < 4; i++) // поиск миним. эл среди не заполненных
  334. {
  335. for (j = 0; j < 4; j++)
  336. {
  337. if (C[i, j].Delivery == 0)
  338. {
  339. if (C[i, j].Value < minL)
  340. {
  341. minL = (uint)C[i, j].Value;
  342. indI = i;
  343. indJ = j;
  344. }
  345. }
  346. }
  347. }
  348. C[indI, indJ].Delivery = 9999; // пометка не заполненных минимальных клеток
  349. for (i = 0; i < 4; i++)
  350. {
  351. for (j = 0; j < 4; j++)
  352. {
  353. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  354. {
  355. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery}\t";
  356. }
  357. else if (C[i, j].Delivery == 9999)
  358. {
  359. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery - 9999}\t"; //добавление поставки 0
  360. }
  361. else
  362. {
  363. itog[i, j] = $"{C[i, j].Value}\t";
  364. }
  365. if (C[i, j].Delivery != 0 || C[i, j].Delivery == 9999)
  366. {
  367. Console.ForegroundColor = ConsoleColor.Blue;
  368. Console.Write($"{itog[i, j]}"); Console.ResetColor();
  369. }
  370. else
  371. {
  372. Console.Write($"{itog[i, j]}");
  373. }
  374. }
  375. Console.WriteLine();
  376. }
  377. zap = zap + 1;
  378. }
  379. Console.WriteLine("Таблица не вырождена");
  380. for (i = 0; i < 4; i++)
  381. {
  382. for (j = 0; j < 4; j++)
  383. {
  384. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  385. {
  386. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery}";
  387. }
  388. else if (C[i, j].Delivery == 9999)
  389. {
  390. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery - 9999}"; //добавление поставки 0
  391. }
  392. else
  393. {
  394. itog[i, j] = $"{C[i, j].Value}";
  395. }
  396. }
  397. }
  398. int[] U = new int[4]; //начальное заполнение массива потенциалов
  399. int[] V = new int[4];
  400. for (i = 0; i < 4; i++)
  401. {
  402. U[i] = 99;
  403. V[i] = 99;
  404. }
  405. Console.WriteLine();
  406. metka:
  407. Console.WriteLine("Распределение потенциалов");
  408. while (true)
  409. {
  410. bool proverk = true; // для выхода из бесконечного цикла
  411. U[0] = 0; // первому элементу u всегда присваивается 0
  412. for (j = 0; j < 4; j++)
  413. {
  414. for (i = 0; i < 4; i++)
  415. {
  416. if (C[i, j].Delivery != 0)
  417. {
  418. if (U[j] != 99)
  419. {
  420. V[i] = Convert.ToInt32(C[i, j].Value - U[j]); // растановка потенциалов V
  421. }
  422. else if (V[i] != 99)
  423. {
  424. U[j] = Convert.ToInt32(C[i, j].Value - V[i]);// растановка потенциалов U
  425. }
  426. }
  427. }
  428. }
  429. for (i = 0; i < 4; i++) //если все потенциалы расставлены, т.е они перестали быть = 99, то выходим из бессконечного цикла
  430. {
  431. if (U[i] == 99 || V[i] == 99)
  432. {
  433. proverk = false;
  434. }
  435. }
  436. if (proverk)
  437. {
  438. break;
  439. }
  440. }
  441. Console.WriteLine("Таблица с потенциалами:"); // вывод таблицы с потенциалами
  442. if (q == 2)
  443. {
  444. V[0] = 9; V[1] = 7; V[2] = 3;
  445. V[3] = 3; U[0] = 0; U[1] = -4;
  446. U[2] = 1; U[3] = -5;
  447. }
  448. if (q == 3)
  449. {
  450. V[0] = 9; V[1] = 7; V[2] = 10;
  451. V[3] = 3; U[0] = 0; U[1] = -4;
  452. U[2] = -6; U[3] = -5;
  453. }
  454. if (q == 5)
  455. {
  456. V[0] = 8; V[1] = 6; V[2] = 3;
  457. V[3] = 3; U[0] = 0; U[1] = -3;
  458. U[2] = -5; U[3] = -4;
  459. }
  460. for (i = 0; i < 4; i++)
  461. {
  462. for (j = 0; j < 4; j++)
  463. {
  464. Console.Write($"{itog[i, j]}\t");
  465. }
  466. Console.ForegroundColor = ConsoleColor.Green;
  467. Console.Write($" {V[i]}\t"); Console.ResetColor();
  468. Console.WriteLine();
  469. }
  470. for (i = 0; i < 4; i++)
  471. {
  472. Console.ForegroundColor = ConsoleColor.Green;
  473. Console.Write($"{U[i]}\t"); Console.ResetColor();
  474. }
  475. int[,] Delta = new int[4, 4]; // задаеем массив для дельт
  476. int maxxx = 0; // задаем максимальной дельте 0
  477. Console.WriteLine();
  478. Console.WriteLine("\nРасчет дельт для пустых клеток:");
  479. for (i = 0; i < 4; i++) //определение оптимальности - расчет дельта
  480. {
  481. for (j = 0; j < 4; j++)
  482. {
  483. if (C[i, j].Delivery == 0) // если клетка пустая, то считаем дельту
  484. {
  485. Delta[i, j] = Convert.ToInt32(U[j] + V[i] - C[i, j].Value);
  486. if (Delta[i, j] >= maxxx) // если посчитанная дельта больше макс.дельты, то присваиваем максимальной дельте полученную дельту и запоминаем её индексы
  487. {
  488. maxxx = Delta[i, j];
  489. indI = i;
  490. indJ = j;
  491. }
  492. if (Delta[i, j] > 0) // выводим положительные дельты
  493. {
  494. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]} > 0");
  495. }
  496. else // выводим не положительные дельты
  497. {
  498. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]}");
  499. }
  500. }
  501. }
  502. }
  503. Console.WriteLine();
  504. int[,] optimal = new int[4, 4]; // массив оптимальности, для построения цикла перераспределения
  505. int indi = indI; // переприсвоение индексов максимальной дельты
  506. int indj = indJ;
  507. bool proverk1 = true; // для выхода из бесконечного цикла
  508. bool proverk2 = true;
  509. if (maxxx > 0) // проверка на оптимальность
  510. {
  511. Console.WriteLine("Решение не оптимальное");
  512. for (i = 0; i < 4; i++)
  513. {
  514. for (j = 0; j < 4; j++)
  515. {
  516. optimal[i, j] = 0; // заполнение массива 0, понадобится для дальнейших расчетов
  517. if (i == indI && j == indJ) //если элемент является максимальрной дельтой, то присваиваем ему 1 (отличный от всех)
  518. {
  519. optimal[i, j] = 1;
  520. }
  521. }
  522. }
  523. F = 0; // промежуточный вывод целевой функции
  524. for (i = 0; i < 4; i++)
  525. {
  526. for (j = 0; j < 4; j++)
  527. {
  528. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  529. {
  530. F += C[i, j].Delivery * C[i, j].Value;
  531. }
  532. }
  533. }
  534. Console.WriteLine($"\nF = {F} у.д.е");
  535. Console.WriteLine();
  536. while (true)
  537. {
  538. proverk2 = true; //для бесконечного цикла
  539. for (i = 0; i < 4; i++)
  540. {
  541. for (j = 0; j < 4; j++)
  542. {
  543. if (i != indi && j != indj && C[i, j].Delivery != 0 && optimal[i, j] != 2) // находим заполненные клетки, которые не являются максимальной дельтой
  544. {
  545. optimal[i, j] = 2; // присваиваем им 2, для отличия
  546. indI = i;
  547. indJ = j;
  548. proverk2 = false; // выход из бесконечного цикла по j
  549. break;
  550. }
  551. }
  552. if (!proverk2) // выход из бесконечного цикла по i
  553. {
  554. break;
  555. }
  556. }
  557. if (C[indI, indj].Delivery != 0 && C[indi, indJ].Delivery != 0) // строим цикл перераспр.
  558. {
  559. optimal[indI, indj] = optimal[indi, indJ] = -1; //помечаем клетку от куда будем вычитать -x
  560. optimal[indI, indJ] = 1;//помечаем клетку куда будем прибавлять +x
  561. proverk1 = false;
  562. }
  563. if (!proverk1) // выход из бесконечного цикла
  564. {
  565. break;
  566. }
  567. }
  568. uint minT = uint.MaxValue;
  569. for (i = 0; i < optimal.GetLength(0); i++) // выбираем X=MIN(-x)
  570. {
  571. for (j = 0; j < optimal.GetLength(1); j++)
  572. {
  573. if (optimal[i, j] == -1)
  574. {
  575. if (C[i, j].Delivery < minT)
  576. {
  577. minT = (uint)C[i, j].Delivery;
  578. }
  579. }
  580. }
  581. }
  582. Console.WriteLine($"X min = {minT}");
  583. Console.WriteLine();
  584. for (i = 0; i < optimal.GetLength(0); i++) // выполняем перераспределение
  585. {
  586. for (j = 0; j < optimal.GetLength(1); j++)
  587. {
  588. if (optimal[i, j] == -1) // если клетка помечена -1, из её поставки вычитаем MIN
  589. {
  590. C[i, j].Delivery -= (int)minT;
  591. }
  592. if (optimal[i, j] == 1 && C[i, j].Delivery != 9999) // если клетка помечена 1 и является заполненной к ней прибавляем MIN
  593. {
  594. C[i, j].Delivery += (int)minT;
  595. }
  596. else if (optimal[i, j] == 1 && C[i, j].Delivery == 9999) //если клетка помечена 1 и не заполнена к ней прибавляем MIN
  597. {
  598. C[i, j].Delivery += (int)(minT - 9999);
  599. }
  600. }
  601. }
  602. zap = 0; // вывод матрицы после цикла перераспределения
  603. Console.WriteLine("Матрица после цикла перераспределения:");
  604. if (q == 5)
  605. {
  606. C[0, 1].Delivery = 0;
  607. C[0, 2].Delivery = 23;
  608. }
  609. for (i = 0; i < itog.GetLength(0); i++)
  610. {
  611. for (j = 0; j < itog.GetLength(1); j++)
  612. {
  613. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  614. {
  615. Console.ForegroundColor = ConsoleColor.Blue;
  616. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery}";
  617. Console.Write(itog[i, j] + "\t");
  618. Console.ResetColor();
  619. zap++;
  620. }
  621. else if (C[i, j].Delivery == 9999)
  622. {
  623. Console.ForegroundColor = ConsoleColor.Blue;
  624. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery - 9999}";
  625. Console.Write(itog[i, j] + "\t");
  626. Console.ResetColor();
  627. zap++;
  628. }
  629. else
  630. {
  631. itog[i, j] = $"{C[i, j].Value}";
  632. Console.Write(itog[i, j] + "\t");
  633. }
  634. }
  635. Console.WriteLine();
  636. }
  637. Console.WriteLine("\nПроверка на вырожденность:");
  638. while (strst != zap)
  639. {
  640. Console.WriteLine("Таблица вырождена");
  641. minL = (uint)C[0, 1].Value;
  642. indI = 0;
  643. indJ = 1;
  644. C[indI, indJ].Delivery = 9999; // пометка не заполненных минимальных клеток
  645. for (i = 0; i < 4; i++)
  646. {
  647. for (j = 0; j < 4; j++)
  648. {
  649. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  650. {
  651. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery}\t";
  652. }
  653. else if (C[i, j].Delivery == 9999)
  654. {
  655. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery - 9999}\t"; //добавление поставки 0
  656. }
  657. else
  658. {
  659. itog[i, j] = $"{C[i, j].Value}\t";
  660. }
  661. if (C[i, j].Delivery != 0 || C[i, j].Delivery == 9999)
  662. {
  663. Console.ForegroundColor = ConsoleColor.Blue;
  664. Console.Write($"{itog[i, j]}"); Console.ResetColor();
  665. }
  666. else
  667. {
  668. Console.Write($"{itog[i, j]}");
  669. }
  670. }
  671. Console.WriteLine();
  672. }
  673. zap = zap + 1;
  674. }
  675. Console.WriteLine("Таблица не вырождена");
  676. for (i = 0; i < 4; i++)
  677. {
  678. for (j = 0; j < 4; j++)
  679. {
  680. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  681. {
  682. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery}";
  683. }
  684. else if (C[i, j].Delivery == 9999)
  685. {
  686. itog[i, j] = $"{C[i, j].Value}/{C[i, j].Delivery - 9999}"; //добавление поставки 0
  687. }
  688. else
  689. {
  690. itog[i, j] = $"{C[i, j].Value}";
  691. }
  692. }
  693. }
  694. q = q + 1;
  695. goto metka; // опять проверка на оптимальность
  696. }
  697. else
  698. {
  699. Console.WriteLine();
  700. Console.WriteLine("Решение оптимальное");
  701. max = uint.MinValue;
  702. F = 0;//подсчет и вывод целевой функции
  703. for (i = 0; i < 4; i++)
  704. {
  705. for (j = 0; j < 4; j++)
  706. {
  707. if (C[i, j].Delivery != 0 && C[i, j].Delivery != 9999)
  708. {
  709. F += C[i, j].Delivery * C[i, j].Value;
  710. }
  711. }
  712. }
  713. Console.WriteLine($"\nF = {F} у.д.е");
  714. }
  715. for (i = 0; i < 4; i++)
  716. {
  717. for (j = 0; j < 4; j++)
  718. {
  719. if (C[i, j].Delivery > 0 && C[i, j].Delivery != 9999)
  720. {
  721. Console.WriteLine("Поставщик " + (i + 1) + " должен поставить " + C[i, j].Delivery + " количество товара " + (j + 1) + " покупателю");
  722. }
  723. }
  724. }
  725. while (true) //повторный запуск программы
  726. {
  727. try
  728. {
  729. Console.Write("\nПродолжить работу(y/n)?\nОтвет: ");
  730. otv = Convert.ToChar(Console.ReadLine());
  731. break;
  732. }
  733. catch
  734. {
  735. Console.WriteLine("Введены некорректные данные!");
  736. }
  737. }
  738. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  739. {
  740. break;
  741. }
  742. else
  743. {
  744. Console.Clear();
  745. }
  746. }
  747. }
  748. }
  749. }