methods.cs 31 KB

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