Program.cs 141 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379
  1. /*
  2. //коммивояжер
  3. namespace ConsoleApp2 // Note: actual namespace depends on the project name.
  4. {
  5. internal class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. while (true)
  10. {
  11. Console.WriteLine("Для начала работы введиите 1");
  12. Console.WriteLine("Для завершения работы введиите 2");
  13. Console.WriteLine("Для начала работы с ручным вводом значений введиите 3");
  14. int f = Convert.ToInt32(Console.ReadLine());
  15. bool v = false;
  16. switch (f)
  17. {
  18. case 1:
  19. double[,] vs = {
  20. //{0,15,26,52,29,24},
  21. //{13,0,28,28,19,15},
  22. //{24,13,0,14,19,30},
  23. //{46,55,35,0,20,65},
  24. //{23,15,15,28,0,40},
  25. //{35,16,14,10,12,0 }
  26. {0,1,2,3,5},
  27. {1,0,4,4,3},
  28. {2,4,0,1,2},
  29. {7,4,1,0,3},
  30. {5,3,2,3,0}
  31. // {0,15,12,24,19},
  32. //{6,0,25,30,50},
  33. //{25,15,0,12,15},
  34. //{20,10,10,0,15},
  35. //{15,20,10,11,0}
  36. };
  37. int g = 5;
  38. resh(vs, g);
  39. break;
  40. case 2:
  41. v = true;
  42. break;
  43. case 3:
  44. Console.WriteLine("Введите размерность:");
  45. int g1 = 3;
  46. g1 = Convert.ToInt32(Console.ReadLine());
  47. double[,] vs1 = new double[g1, g1];
  48. for (int i = 0; i < g1; i++)
  49. {
  50. for (int j = 0; j < g1; j++)
  51. {
  52. vs1[i, j] = Convert.ToDouble(Console.ReadLine());
  53. }
  54. }
  55. resh(vs1, g1);
  56. break;
  57. }
  58. if (v)
  59. {
  60. break;
  61. }
  62. }
  63. }
  64. public static void resh(double[,] vs, int g)
  65. {
  66. List<List<int>> f1 = new List<List<int>>();
  67. List<double> t = new List<double>();
  68. for (int n = 0; g != n; n++)
  69. {
  70. List<List<int>> f = new List<List<int>>();
  71. List<int> list = new List<int>();
  72. f.Clear();
  73. f.Add(list);
  74. list.Add(n);
  75. while (f[0].Count <= g)
  76. {
  77. List<List<int>> z = new List<List<int>>();
  78. for (int k = 0; k < f.Count; k++)
  79. {
  80. List<int> listic = new List<int>();
  81. for (int i = 0; i < g; i++)
  82. {
  83. listic.Add(i);
  84. }
  85. for (int i = f[k].Count - 1; i >= 0; i--)
  86. {
  87. listic.Remove(f[k][i]);
  88. }
  89. double max = double.MaxValue;
  90. List<int> vs1 = new List<int>();
  91. for (int i = 0; i < listic.Count; i++)
  92. {
  93. if (f[k].Last() == listic[i])
  94. {
  95. continue;
  96. }
  97. double kl = vs[f[k].Last(), listic[i]];
  98. if (max >= kl)
  99. {
  100. max = kl;
  101. vs1.Add(listic[i]);
  102. }
  103. }
  104. z.Add(new List<int>(vs1.ToArray()));
  105. }
  106. bool ret = true;
  107. int x = f.Count;
  108. for (int k = 0; k < x; k++)
  109. {
  110. if (f[k].Count == g)
  111. {
  112. f[k].Add(f[k].First());
  113. continue;
  114. }
  115. for (int i = 0; i < z[k].Count - 1; i++)
  116. {
  117. if (z[k].Count == 0)
  118. {
  119. continue;
  120. }
  121. if (vs[f[k].Last(), z[k][i]] == vs[f[k].Last(), z[k].Last()])
  122. {
  123. f.Add(new List<int>(f[k].ToArray()));
  124. f[f.Count - 1].Add(z[k][i]);
  125. }
  126. }
  127. f[k].Add(z[k].Last());
  128. }
  129. }
  130. for (int i = 0; i < f.Count; i++)
  131. {
  132. double fun = 0;
  133. for (int h = 0; h < f[i].Count - 1; h++)
  134. {
  135. fun += vs[f[i][h], f[i][h + 1]];
  136. }
  137. t.Add(fun);
  138. }
  139. for (int i = 0; i < f.Count; i++)
  140. {
  141. f1.Add(f[i]);
  142. }
  143. }
  144. for (int i = 0; i < f1.Count; i++)
  145. {
  146. for (int j = 0; j < f1[i].Count; j++)
  147. {
  148. Console.Write(f1[i][j] + 1);
  149. }
  150. Console.WriteLine(" Длинна маршрута = " + t[i]);
  151. }
  152. List<int> fi = new List<int>();
  153. for (int i = 0; i < f1.Count - 1; i++)
  154. {
  155. if (t[i] == t.Min())
  156. {
  157. fi.Add(i);
  158. }
  159. }
  160. Console.WriteLine();
  161. Console.WriteLine();
  162. Console.WriteLine("Самый короткий маршрут");
  163. for (int i = 0; i < fi.Count; i++)
  164. {
  165. for (int j = 0; j < f1[i].Count; j++)
  166. {
  167. Console.Write(f1[fi[i]][j] + 1);
  168. }
  169. Console.WriteLine(" Длинна маршрута = " + t[fi[i]]);
  170. }
  171. }
  172. }
  173. }
  174. */
  175. /*
  176. // критический путь
  177. using System;
  178. namespace Indexs
  179. {
  180. class program
  181. {
  182. static void Main(string[] args)
  183. {
  184. while(true)
  185. {
  186. Console.Clear();
  187. Console.WriteLine("Дана таблица работ для сетевого графика. Построить сетевой график и найти критический путь.");
  188. int[] ri = new int[] { 1, 1, 1, 2, 2, 3, 4 }; // начало пути
  189. int[] rj = new int[] { 2, 3, 5, 3, 4, 4, 5 }; // конец пути
  190. int[] dij = new int[ri.Length]; // объявление масива
  191. m1: int otv = 0;
  192. while (true)
  193. {
  194. Console.Write($"Введите номер способа заполнения продолжительностей работ\n1.Вручную\n2.Рандомно\nОтвет: ");
  195. try
  196. {
  197. otv = int.Parse(Console.ReadLine());
  198. break;
  199. }
  200. catch
  201. {
  202. Console.WriteLine("Введено некорректное значение! Повторите ввод");
  203. }
  204. }
  205. switch (otv) // выбор ручного или автоматического заполнения
  206. {
  207. case 1:
  208. int a = 0;
  209. for (int i = 0; i < dij.Length; i++)
  210. {
  211. while (true) // проверка введенного значения
  212. {
  213. Console.Write($"Ввдеите продолжительность {i + 1} работы: "); // ввод продолжительности работ
  214. a = Convert.ToInt32(Console.ReadLine());
  215. if (a > 0)
  216. {
  217. dij[i] = a;
  218. break;
  219. }
  220. else
  221. {
  222. Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
  223. }
  224. }
  225. }
  226. break;
  227. case 2:
  228. Random rnd = new Random();
  229. for (int i = 0; i < dij.Length; i++) // рандомное заполнение
  230. {
  231. dij[i] = rnd.Next(1, 100);
  232. }
  233. break;
  234. default:
  235. Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
  236. goto m1;
  237. break;
  238. }
  239. Console.Clear();
  240. Console.WriteLine($"Работы и их продолжительность:");
  241. for (int i = 0; i < dij.Length; i++)
  242. {
  243. Console.WriteLine($"{ri[i]}-{rj[i]}({dij[i]})"); // вывод таблицы
  244. }
  245. Console.WriteLine();
  246. int[,] table = new int[4, 5];
  247. int[][] pathes = new int[4][]; // массив из массивов (ступенчатый массив)
  248. pathes[0] = new int[5];
  249. pathes[1] = new int[6]; // пути , одна ячейка для F
  250. pathes[2] = new int[5];
  251. pathes[3] = new int[3];
  252. for (int i = 0; i < ri.Length; i++)
  253. {
  254. table[ri[i] - 1, rj[i] - 1] = dij[i]; // заполнение таблицы с продолжительностями в днях
  255. }
  256. pathes[0][0] = 1;
  257. pathes[0][1] = 2; // пути заполняются
  258. pathes[0][2] = 4;
  259. pathes[0][3] = 5;
  260. pathes[1][0] = 1;
  261. pathes[1][1] = 2;
  262. pathes[1][2] = 3;
  263. pathes[1][3] = 4;
  264. pathes[1][4] = 5;
  265. pathes[2][0] = 1;
  266. pathes[2][1] = 3;
  267. pathes[2][2] = 4;
  268. pathes[2][3] = 5;
  269. pathes[3][0] = 1;
  270. pathes[3][1] = 5;
  271. for (int j = 0; j < pathes.Length; j++) // перебирает массивы внутри массива
  272. {
  273. for (int i = 1; i < pathes[j].Length - 1; i++) // перебирает элементы конкретного массива
  274. {
  275. pathes[j][pathes[j].Length - 1] += table[pathes[j][i - 1] - 1, pathes[j][i] - 1]; // обращаемся к последнему элементу массива и плюсуем значение пути
  276. }
  277. }
  278. for (int j = 0; j < pathes.Length; j++)// перебират массивы внутри массива
  279. {
  280. Console.Write($"Путь {j + 1}: "); // выводит путь индекс пути
  281. for (int i = 0; i < pathes[j].Length - 1; i++) // последняя f его не выводим
  282. {
  283. if (i == pathes[j].Length - 2)
  284. {
  285. Console.Write($"{pathes[j][i]}");
  286. }
  287. else
  288. {
  289. Console.Write($"{pathes[j][i]}-");
  290. }
  291. }
  292. Console.WriteLine($"; F = {pathes[j][pathes[j].Length - 1]}"); // вывод f
  293. }
  294. int MaxF = int.MinValue; /// для поиска максимального f
  295. int ind = 0; // индекс максимального пути
  296. for (int i = 0; i < pathes.Length; i++)
  297. {
  298. if (MaxF < pathes[i][pathes[i].Length - 1])
  299. {
  300. MaxF = pathes[i][pathes[i].Length - 1];
  301. ind = i;
  302. }
  303. }
  304. Console.Write($"Критический путь - Путь {ind + 1}: ");//вывод критического пути и его индекс
  305. for (int i = 0; i < pathes[ind].Length - 1; i++)
  306. {
  307. if (i == pathes[ind].Length - 2)
  308. {
  309. Console.Write($"{pathes[ind][i]}");
  310. }
  311. else
  312. {
  313. Console.Write($"{pathes[ind][i]}-");
  314. }
  315. }
  316. Console.WriteLine($"; F = {pathes[ind][pathes[ind].Length - 1]}");
  317. while (true)
  318. {
  319. Console.Write($"Хотите повторить выполнение программы ? (0 - нет, любая цифра - да)");
  320. try
  321. {
  322. otv = int.Parse(Console.ReadLine());
  323. break;
  324. }
  325. catch
  326. {
  327. Console.WriteLine("Введено некорректное значение! Повторите ввод");
  328. }
  329. }
  330. if (otv == 0)
  331. {
  332. break;
  333. }
  334. }
  335. }
  336. }
  337. }
  338. */
  339. /*
  340. // критический путь 2
  341. using System;
  342. using System.Collections.Generic;
  343. using System.Linq;
  344. using System.Text;
  345. using System.Threading.Tasks;
  346. namespace grafs
  347. {
  348. internal class
  349. {
  350. static void Main(string[] args)
  351. {
  352. string reponse = "Кратчайший путь ";
  353. int answer = 0;
  354. Console.Write("Введите расстояние от 1 до 2: ");
  355. int one_two = Convert.ToInt32(Console.ReadLine());
  356. Console.Write("Введите расстояние от 1 до 3: ");
  357. int one_three = Convert.ToInt32(Console.ReadLine());
  358. Console.Write("Введите расстояние от 1 до 4: ");
  359. int one_four = Convert.ToInt32(Console.ReadLine());
  360. Console.Write("Введите расстояние от 2 до 5: ");
  361. int two_five = Convert.ToInt32(Console.ReadLine());
  362. Console.Write("Введите расстояние от 2 до 6: ");
  363. int two_six = Convert.ToInt32(Console.ReadLine());
  364. Console.Write("Введите расстояние от 3 до 5: ");
  365. int three_five = Convert.ToInt32(Console.ReadLine());
  366. Console.Write("Введите расстояние от 3 до 6: ");
  367. int three_six = Convert.ToInt32(Console.ReadLine());
  368. Console.Write("Введите расстояние от 4 до 5: ");
  369. int four_five = Convert.ToInt32(Console.ReadLine());
  370. Console.Write("Введите расстояние от 4 до 6: ");
  371. int four_six = Convert.ToInt32(Console.ReadLine());
  372. Console.Write("Введите расстояние от 5 до 7: ");
  373. int five_seven = Convert.ToInt32(Console.ReadLine());
  374. Console.Write("Введите расстояние от 5 до 8: ");
  375. int five_eight = Convert.ToInt32(Console.ReadLine());
  376. Console.Write("Введите расстояние от 5 до 9: ");
  377. int five_nine = Convert.ToInt32(Console.ReadLine());
  378. Console.Write("Введите расстояние от 6 до 7: ");
  379. int six_seven = Convert.ToInt32(Console.ReadLine());
  380. Console.Write("Введите расстояние от 6 до 8: ");
  381. int six_eight = Convert.ToInt32(Console.ReadLine());
  382. Console.Write("Введите расстояние от 6 до 9: ");
  383. int six_nine = Convert.ToInt32(Console.ReadLine());
  384. Console.Write("Введите расстояние от 7 до 10: ");
  385. int seven_ten = Convert.ToInt32(Console.ReadLine());
  386. Console.Write("Введите расстояние от 8 до 10: ");
  387. int eight_ten = Convert.ToInt32(Console.ReadLine());
  388. Console.Write("Введите расстояние от 9 до 10: ");
  389. int nine_ten = Convert.ToInt32(Console.ReadLine());
  390. if (one_two < one_three && one_two < one_four)
  391. {
  392. reponse += " 1 --> 2 --> ";
  393. answer += one_two;
  394. if (two_five < two_six)
  395. {
  396. reponse += "5 --> ";
  397. answer += two_five;
  398. if (five_seven < five_eight && five_seven < five_nine)
  399. {
  400. reponse += "7 --> 10";
  401. answer += five_seven += seven_ten;
  402. }
  403. else if (five_eight < five_seven && five_eight < five_nine)
  404. {
  405. reponse += "8 --> 10";
  406. answer += five_eight += eight_ten;
  407. }
  408. else if (five_nine < five_seven && five_nine < five_eight)
  409. {
  410. reponse += "9 --> 10";
  411. answer += five_nine += nine_ten;
  412. }
  413. }
  414. else if (two_six < two_five)
  415. {
  416. reponse += "6 --> ";
  417. answer += two_six;
  418. if (six_seven < six_eight && six_seven < six_nine)
  419. {
  420. reponse += "7 --> 10";
  421. answer += five_seven += seven_ten;
  422. }
  423. else if (six_eight < six_seven && six_eight < six_nine)
  424. {
  425. reponse += "8 --> 10";
  426. answer += five_eight += eight_ten;
  427. }
  428. else if (six_nine < six_seven && six_nine < six_eight)
  429. {
  430. reponse += "9 --> 10";
  431. answer += five_nine += nine_ten;
  432. }
  433. }
  434. }
  435. else if (one_four < one_two && one_four < one_three)
  436. {
  437. reponse += " 1 --> 4 --> ";
  438. answer += one_four;
  439. if (four_five < four_six)
  440. {
  441. reponse += "5 --> ";
  442. answer += four_five;
  443. if (five_seven < five_eight && five_seven < five_nine)
  444. {
  445. reponse += "7 --> 10";
  446. answer += five_seven += seven_ten;
  447. }
  448. else if (five_eight < five_seven && five_eight < five_nine)
  449. {
  450. reponse += "8 --> 10";
  451. answer += five_eight += eight_ten;
  452. }
  453. else if (five_nine < five_seven && five_nine < five_eight)
  454. {
  455. reponse += "9 --> 10";
  456. answer += five_nine += nine_ten;
  457. }
  458. }
  459. else if (four_six < four_five)
  460. {
  461. reponse += "6 --> ";
  462. answer += four_six;
  463. if (six_seven < six_eight && six_seven < six_nine)
  464. {
  465. reponse += "7 -->1 0";
  466. answer += five_seven += seven_ten;
  467. }
  468. else if (six_eight < six_seven && six_eight < six_nine)
  469. {
  470. reponse += "8 --> 10";
  471. answer += five_eight += eight_ten;
  472. }
  473. else if (six_nine < six_seven && six_nine < six_eight)
  474. {
  475. reponse += "9 --> 10";
  476. answer += five_nine += nine_ten;
  477. }
  478. }
  479. }
  480. else if (one_three < one_four && one_three < one_two)
  481. {
  482. reponse += " 1 --> 3 --> ";
  483. answer += one_three;
  484. if (three_five < three_six)
  485. {
  486. reponse += "5 --> ";
  487. answer += three_five;
  488. if (five_seven < five_eight && five_seven < five_nine)
  489. {
  490. reponse += "7 --> 10";
  491. answer += five_seven += seven_ten;
  492. }
  493. else if (five_eight < five_seven && five_eight < five_nine)
  494. {
  495. reponse += "8 --> 10";
  496. answer += five_eight += eight_ten;
  497. }
  498. else if (five_nine < five_seven && five_nine < five_eight)
  499. {
  500. reponse += "9 --> 10";
  501. answer += five_nine += nine_ten;
  502. }
  503. }
  504. else if (three_six < three_five)
  505. {
  506. reponse += "6 --> ";
  507. answer += three_six;
  508. if (six_seven < six_eight && six_seven < six_nine)
  509. {
  510. reponse += "7 --> 10";
  511. answer += five_seven += seven_ten;
  512. }
  513. else if (six_eight < six_seven && six_eight < six_nine)
  514. {
  515. reponse += "8 --> 10";
  516. answer += five_eight += eight_ten;
  517. }
  518. else if (six_nine < six_seven && six_nine < six_eight)
  519. {
  520. reponse += "9 --> 10";
  521. answer += five_nine += nine_ten;
  522. }
  523. }
  524. }
  525. Console.WriteLine($"\n {reponse} = {answer}");
  526. Console.ReadKey();
  527. }
  528. }
  529. }
  530. */
  531. /*
  532. // симплекс метод
  533. using System;
  534. namespace Симплекс_м
  535. {
  536. class Program
  537. {
  538. static void Main(string[] args)
  539. {
  540. while (true)
  541. {
  542. int r=0, c=0;//размерности матрицы и векторов
  543. while (true)//ввод количество вида сырья(размерности по стокам)
  544. {
  545. try
  546. {
  547. Console.WriteLine("Введите количество вида сырья");
  548. r = Convert.ToInt32(Console.ReadLine());
  549. if (r < 2)
  550. {
  551. Console.WriteLine("Видов сырья должно быть не менее двух! Повторите ввод");
  552. }
  553. else
  554. {
  555. break;
  556. }
  557. }
  558. catch
  559. {
  560. Console.WriteLine("Введены некорректные данные!");
  561. }
  562. }
  563. while (true)//ввод потребителей(размерности по столбцам)
  564. {
  565. try
  566. {
  567. Console.WriteLine("Введите количество видов продукции");
  568. c = Convert.ToInt32(Console.ReadLine());
  569. if (c < 2)
  570. {
  571. Console.WriteLine("Количество видов продукции должно быть не менее двух! Повторите ввод");
  572. }
  573. else
  574. {
  575. break;
  576. }
  577. }
  578. catch
  579. {
  580. Console.WriteLine("Введены некорректные данные!");
  581. }
  582. }
  583. int i = 0, j = 0;//переменные для циклов
  584. int[,] matrxA = new int[r, c];//таблица без запасов сырья
  585. Console.WriteLine("Ввод таблицы затрат на перевозку продукции:");//ввод данных в таблицу расходов ресурсов
  586. for (i = 0; i < matrxA.GetLength(0); i++)
  587. {
  588. for (j = 0; j < matrxA.GetLength(1); j++)
  589. {
  590. while (true)
  591. {
  592. try
  593. {
  594. Console.Write($"Введите расход {i + 1} сырья для {j + 1} единицы продукции: ");
  595. matrxA[i, j] = Convert.ToInt32(Console.ReadLine());
  596. break;
  597. }
  598. catch
  599. {
  600. Console.WriteLine("Введены некорректные данные!");
  601. }
  602. }
  603. }
  604. Console.WriteLine();
  605. }
  606. Console.WriteLine("Таблица расхода сырья на единицу продукции вида:");//вывод таблицы на экран
  607. for (i = 0; i < matrxA.GetLength(0); i++)
  608. {
  609. for (j = 0; j < matrxA.GetLength(1); j++)
  610. {
  611. Console.Write(matrxA[i, j] + "\t");
  612. }
  613. Console.WriteLine();
  614. }
  615. char otv;
  616. int temp;//переменная для диалога с пользователем
  617. //Изменение матрицы
  618. while (true)
  619. {
  620. while (true)
  621. {
  622. try
  623. {
  624. Console.Write("\nХотите изменить данные о таблице?\nДа(любая клавиша)/Нет(N)\nОтвет: ");
  625. otv = Convert.ToChar(Console.ReadLine());
  626. break;
  627. }
  628. catch
  629. {
  630. Console.WriteLine("Введены некорректные данные!");
  631. }
  632. }
  633. if (otv.Equals('n') || otv.Equals('т') || otv.Equals('N') || otv.Equals('Т'))
  634. {
  635. break;
  636. }
  637. else
  638. {
  639. Console.Write("Введите номер вида сырья, затем номер вида ресурса, который вы хотите изменить\nОтвет:\n");
  640. while (true)
  641. {
  642. i = Convert.ToInt32(Console.ReadLine());
  643. j = Convert.ToInt32(Console.ReadLine());
  644. if (i < c + 1 && j < r + 1)
  645. {
  646. while (true)
  647. {
  648. try
  649. {
  650. Console.Write("Введите новое значение: ");
  651. temp = Convert.ToInt32(Console.ReadLine());
  652. if (temp != 0)
  653. {
  654. Console.WriteLine($" Была изменена {i} {j} ячейка таблицы c {matrxA[i - 1, j - 1]} на {temp}");
  655. matrxA[i - 1, j - 1] = temp;
  656. break;
  657. }
  658. else
  659. {
  660. Console.WriteLine("Вы ввели нулевое значение! Повторите ввод");
  661. }
  662. }
  663. catch
  664. {
  665. Console.WriteLine("Введены некорректные данные!");
  666. }
  667. }
  668. break;
  669. }
  670. else
  671. {
  672. Console.WriteLine("Введенная размерность не соответствует матрице! Повторите ввод");
  673. }
  674. }
  675. }
  676. }
  677. Console.Clear();
  678. int[] m = new int[r];//вектор
  679. Console.WriteLine("Ввод данных о затратах сырья:");//ввод данных в вектор мощности поставщиков
  680. for (i = 0; i < m.Length; i++)
  681. {
  682. while (true)
  683. {
  684. try
  685. {
  686. Console.Write($"Введите затраты сырья {i + 1} вида: ");
  687. m[i] = Convert.ToInt32(Console.ReadLine());
  688. break;
  689. }
  690. catch
  691. {
  692. Console.WriteLine("Введены некорректные данные!");
  693. }
  694. }
  695. }
  696. Console.WriteLine("Вектор затрат сырья:");//вывод на экран
  697. for (i = 0; i < m.Length; i++)
  698. {
  699. Console.WriteLine($"{m[i]} ");
  700. }
  701. int[] d = new int[r];//вектор
  702. Console.WriteLine("Введите доход:");
  703. for (i = 0; i < c; i++)
  704. {
  705. while (true)
  706. {
  707. try
  708. {
  709. Console.Write($"Введите доход продукции {i + 1} вида: ");
  710. d[i] = Convert.ToInt32(Console.ReadLine());
  711. break;
  712. }
  713. catch
  714. {
  715. Console.WriteLine("Введены некорректные данные!");
  716. }
  717. }
  718. }
  719. Console.WriteLine("Вектор дохода:");//вывод на экран
  720. for (i = 0; i < m.Length; i++)
  721. {
  722. Console.WriteLine($"{d[i]} ");
  723. }
  724. Console.WriteLine("\nТаблица:");//вывод на экран матрицы и векторов
  725. Console.Write(" ");
  726. Console.WriteLine();
  727. for (i = 0; i < matrxA.GetLength(0); i++)
  728. {
  729. Console.Write($"{m[i]} ");
  730. for (j = 0; j < matrxA.GetLength(1); j++)
  731. {
  732. Console.Write($"{matrxA[i, j]} ");
  733. }
  734. Console.WriteLine();
  735. }
  736. for ( i = 0; i < d.Length; i++)
  737. {
  738. Console.Write($"{d[i]} ");
  739. }
  740. double[,] simpleks = new double[r + 1, c + 1 + r];
  741. for (i = 0; i < r; i++)
  742. {
  743. for (j = 0; j < c; j++)
  744. {
  745. simpleks[i, j] = matrxA[i, j];
  746. }
  747. }
  748. for (i = 0; i < d.Length; i++)
  749. {
  750. simpleks[simpleks.GetLength(0) - 1, i] = d[i];
  751. }
  752. for (i = 0; i < m.Length; i++)
  753. {
  754. simpleks[i, simpleks.GetLength(1)-1] = m[i];
  755. }
  756. int l = 0;
  757. for (i = c; i < c + r; i++)
  758. {
  759. simpleks[l++, i] = 1;
  760. }
  761. Console.WriteLine("\nCимплекс таблица:");
  762. for (i = 0; i < simpleks.GetLength(0); i++)
  763. {
  764. for (j = 0; j < simpleks.GetLength(1); j++)
  765. {
  766. Console.Write($"{simpleks[i, j]} ");
  767. }
  768. Console.WriteLine();
  769. }
  770. double[] b = new double[0];
  771. int temp2 = 0;
  772. for ( j = 0; j < simpleks.GetLength(1) - 1; j++)
  773. {
  774. temp = 0;
  775. temp2 = 0;
  776. for ( i = 0; i < simpleks.GetLength(0) - 1; i++)
  777. {
  778. if (simpleks[i, j] == 0)
  779. temp++;
  780. if (simpleks[i, j] == 1)
  781. temp2++;
  782. }
  783. if (temp == simpleks.GetLength(0) - 2 && temp2 == 1)
  784. {
  785. for ( i = 0; i < simpleks.GetLength(0) - 1; i++)
  786. {
  787. if (simpleks[i, j] == 1)
  788. {
  789. temp = i;
  790. }
  791. }
  792. Array.Resize(ref b, b.Length + 1);
  793. b[b.Length - 1] = Math.Round(simpleks[temp, simpleks.GetLength(1) - 1]);
  794. }
  795. else
  796. {
  797. Array.Resize(ref b, b.Length + 1);
  798. b[b.Length - 1] = 0;
  799. }
  800. }
  801. for ( i = 0; i < b.Length; i++)
  802. {
  803. Console.WriteLine($"x{i + 1} = {b[i]}");
  804. }
  805. Array.Resize(ref b, 0);
  806. int indexi = 0;
  807. int indexj = 0;
  808. Console.WriteLine($"F'={simpleks[simpleks.GetLength(0) - 1, simpleks.GetLength(1) - 1]}");
  809. Console.WriteLine($"F ={Math.Abs(simpleks[simpleks.GetLength(0) - 1, simpleks.GetLength(1) - 1])}");
  810. double max = double.MinValue;
  811. for (i = 0; i < simpleks.GetLength(1); i++)
  812. {
  813. if (simpleks[simpleks.GetLength(0)-1, i]>max)
  814. {
  815. max = simpleks[simpleks.GetLength(0) - 1, i];
  816. indexj = i;
  817. }
  818. }
  819. double min = double.MaxValue;
  820. for (i = 0; i < simpleks.GetLength(0)- 1; i++)
  821. {
  822. if (simpleks[i,simpleks.GetLength(1)-1]/simpleks[i, indexj] < min)
  823. {
  824. min = simpleks[i, simpleks.GetLength(1) - 1] / simpleks[i, indexj];
  825. indexi = i;
  826. }
  827. }
  828. Console.WriteLine($"{indexi+1} {indexj+1}");
  829. }
  830. }
  831. }
  832. }
  833. */
  834. /*
  835. // распределение с-з
  836. using System;
  837. namespace Программа
  838. {
  839. class Program
  840. {
  841. static void GetRazmer(ref int a, string text)
  842. {
  843. while (true)
  844. {
  845. try
  846. {
  847. Console.Write($"Введите количество {text}: ");
  848. a = Convert.ToInt32(Console.ReadLine());
  849. if (a < 2)
  850. {
  851. Console.WriteLine($"{text} должно быть не менее двух! Повторите ввод");
  852. }
  853. else
  854. {
  855. break;
  856. }
  857. }
  858. catch
  859. {
  860. Console.WriteLine("Введены некорректные данные!");
  861. }
  862. }
  863. }
  864. static void GetMatr(ref int[,] matr, int r, int c, string text)
  865. {
  866. int i = 0, j = 0;//переменные для циклов
  867. Console.WriteLine($"Ввод таблицы затрат на {text} продукции:");//ввод данных в таблицу затрат
  868. for (i = 0; i < matr.GetLength(0); i++)
  869. {
  870. for (j = 0; j < matr.GetLength(1); j++)
  871. {
  872. while (true)
  873. {
  874. try
  875. {
  876. Console.Write($"Введите стоимость {text} от {i + 1} поставщика к {j + 1} потребителю: ");
  877. matr[i, j] = Convert.ToInt32(Console.ReadLine());
  878. break;
  879. }
  880. catch
  881. {
  882. Console.WriteLine("Введены некорректные данные!");
  883. }
  884. }
  885. }
  886. Console.WriteLine();
  887. }
  888. Console.WriteLine($"Таблица затрат на {text} продукции:");//вывод таблицы затрат на экран
  889. for (i = 0; i < matr.GetLength(0); i++)
  890. {
  891. for (j = 0; j < matr.GetLength(1); j++)
  892. {
  893. Console.Write(matr[i, j] + "\t");
  894. }
  895. Console.WriteLine();
  896. }
  897. char otv;//переменная для диалога с пользователем
  898. //Изменение матрицы
  899. while (true)
  900. {
  901. while (true)
  902. {
  903. try
  904. {
  905. Console.Write("\nХотите изменить данные о таблице?\nДа(любая клавиша)/Нет(N)\nОтвет: ");
  906. otv = Convert.ToChar(Console.ReadLine());
  907. break;
  908. }
  909. catch
  910. {
  911. Console.WriteLine("Введены некорректные данные!");
  912. }
  913. }
  914. if (otv.Equals('n') || otv.Equals('т') || otv.Equals('N') || otv.Equals('Т'))
  915. {
  916. break;
  917. }
  918. else
  919. {
  920. Console.Write("Введите номер поставщика, нажмите Enter, затем номер потребителя, который вы хотите изменить\nОтвет:\n");
  921. while (true)
  922. {
  923. i = Convert.ToInt32(Console.ReadLine());
  924. j = Convert.ToInt32(Console.ReadLine());
  925. if (i < c + 1 && j < r + 1)
  926. {
  927. while (true)
  928. {
  929. try
  930. {
  931. Console.Write("Введите новое значение: ");
  932. int temp = Convert.ToInt32(Console.ReadLine());
  933. if (temp != 0)
  934. {
  935. Console.WriteLine($" Была изменена {i} {j} ячейка таблицы c {matr[i - 1, j - 1]} на {temp}");
  936. matr[i - 1, j - 1] = temp;
  937. break;
  938. }
  939. else
  940. {
  941. Console.WriteLine("Вы ввели нулевое значение! Повторите ввод");
  942. }
  943. }
  944. catch
  945. {
  946. Console.WriteLine("Введены некорректные данные!");
  947. }
  948. }
  949. break;
  950. }
  951. else
  952. {
  953. Console.WriteLine("Введенная размерность не соответствует матрице! Повторите ввод");
  954. }
  955. }
  956. }
  957. }
  958. }
  959. static void vector(ref int[] m, int i, int j, string text)
  960. {
  961. Console.WriteLine($"Ввод данных о количестве продукции {text}:");//ввод данных в вектор мощности поставщиков
  962. for (i = 0; i < m.Length; i++)
  963. {
  964. while (true)
  965. {
  966. try
  967. {
  968. Console.Write($"Введите количество продукции у {i + 1} {text}: ");
  969. m[i] = Convert.ToInt32(Console.ReadLine());
  970. break;
  971. }
  972. catch
  973. {
  974. Console.WriteLine("Введены некорректные данные!");
  975. }
  976. }
  977. }
  978. }
  979. static void GetVectora(ref int[] m, ref int[] n)
  980. {
  981. int i = 0, j = 0;//переменные для циклов
  982. int valueM = 0, valueN = 0;
  983. while (true)
  984. {
  985. vector(ref m, i, j, "Поставщика");
  986. vector(ref n, i, j, "Потребителя");
  987. for (i = 0; i < m.Length; i++)
  988. {
  989. valueM += m[i];
  990. }
  991. for (i = 0; i < n.Length; i++)
  992. {
  993. valueN += n[i];
  994. }
  995. if (valueM == valueN)
  996. {
  997. break;
  998. }
  999. else//проверка на равенство суммы элементов векторов
  1000. {
  1001. Console.WriteLine("Вектор мощности (m) и cпроса (n) должны быть равны, повторите ввод!");
  1002. valueM = 0;
  1003. valueN = 0;
  1004. }
  1005. }
  1006. Console.WriteLine("Вектор мощности (m):");//вывод на экран
  1007. for (i = 0; i < m.Length; i++)
  1008. {
  1009. Console.Write($"{m[i]} ");
  1010. }
  1011. Console.WriteLine("\nВектор спроса (n):");//вывод на экран
  1012. for (i = 0; i < n.Length; i++)
  1013. {
  1014. Console.Write($"{n[i]} ");
  1015. }
  1016. }
  1017. static void GetSumma(ref int[,] c, int[,] a, int[,] b) // Мктод для для заполнения массива суммы
  1018. {
  1019. int i = 0, j = 0;//переменные для циклов
  1020. for (i = 0; i < c.GetLength(0); i++)
  1021. {
  1022. for ( j = 0; j < c.GetLength(1); j++)
  1023. {
  1024. c[i,j] = a[i,j] + b[i,j];
  1025. }
  1026. }
  1027. Console.WriteLine($"Матрица суммы:");// вывод матрицы суммы
  1028. for (i = 0; i < c.GetLength(0); i++)
  1029. {
  1030. for (j = 0; j < c.GetLength(1); j++)
  1031. {
  1032. Console.Write(c[i, j] + "\t");
  1033. }
  1034. Console.WriteLine();
  1035. }
  1036. }
  1037. static void GetNewMassive(ref string[,] d, int[] a, int[] b, int[,] c)
  1038. {
  1039. // Цикл для заполнения спросов в новом массиве
  1040. for (int i = 0; i < b.Length; i++)
  1041. {
  1042. d[0, i+1] = Convert.ToString(b[i]);
  1043. }
  1044. // Цикл для заполнения мощностей поставщиков в новом массиве
  1045. for (int j = 0; j < a.Length; j++)
  1046. {
  1047. d[j + 1, 0] = Convert.ToString(a[j]);
  1048. }
  1049. // Цикл для заполнения суммы массивов
  1050. for (int i = 0; i < c.GetLength(0); i++)
  1051. {
  1052. for (int j = 0; j < c.GetLength(1); j++)
  1053. {
  1054. d[i+1,j+1] = Convert.ToString(c[i,j]);
  1055. }
  1056. }
  1057. }
  1058. static int GetDistribution(ref string[,] a) //Выполнения распредления и подсчёта суммы
  1059. {
  1060. int summa = 0; // Переменная для хранения суммы
  1061. for (int i = 1; i < a.GetLength(0); i++) // Цикл по строкам массива
  1062. {
  1063. for (int j = 1; j < a.GetLength(1); j++) // Цикл по столбцам массива
  1064. {
  1065. if(Convert.ToInt32(a[0,j]) != 0) // Проверка, если в ячейке спрос равен 0, то идём дальше
  1066. {
  1067. if(Convert.ToInt32(a[i, 0]) != 0) // Проверка, если в ячейке предложение равно 0, то переходим на новую строчку
  1068. {
  1069. if (Convert.ToInt32(a[i,0]) > Convert.ToInt32(a[0,j])) // Проверка, если предложение больше спроса
  1070. {
  1071. summa = summa + Convert.ToInt32(a[i,j]) * Convert.ToInt32(a[0,j]); // К сумме прибавляем произведение цены с поставкой
  1072. a[i,j] = a[i,j] + " / " + a[0,j]; // В ячекй добавляем символ / и максимальную поставку
  1073. a[i, 0] = Convert.ToString(Convert.ToInt32(a[i, 0]) - Convert.ToInt32(a[0, j])); // Вычитаем из предложения сделанную поставку
  1074. a[0,j] = "0"; // Зануляем спрос, так как весь спрос удовлетворён
  1075. }
  1076. else if (Convert.ToInt32(a[i,0]) < Convert.ToInt32(a[0,j]))// Проверка, если предложение меньше спроса
  1077. {
  1078. summa = summa + (Convert.ToInt32(a[i,j]) * Convert.ToInt32(a[i,0])); // К сумме прибавляем произведение цены с поставкой
  1079. a[i,j] = a[i,j] + " / " + a[i,0]; // В ячекй добавляем символ / и максимальную поставку
  1080. a[0,j] = Convert.ToString(Convert.ToInt32(a[0,j]) - Convert.ToInt32(a[i,0])); // Вычитаем из спроса сделанную поставку
  1081. a[i,0] = "0"; // Зануляем предложение, так как у данного поставщика закончилась продукция
  1082. // Переходим на новую строку на тот же магазин
  1083. if(i != i - 1)
  1084. {
  1085. i++;
  1086. j--;
  1087. }
  1088. }
  1089. else
  1090. {
  1091. summa = summa + (Convert.ToInt32(a[i,j]) * Convert.ToInt32(a[i,0])); // К сумме прибавляем произведение цены с поставкой
  1092. a[i,j] = a[i, j] + " / " + a[i, 0]; // В ячекй добавляем символ / и максимальную поставку
  1093. a[i,0] = "0"; // Зануляем предложение, так как у данного поставщика закончилась продукция
  1094. a[0,j] = "0"; // Зануляем спрос, так как весь спрос удовлетворён
  1095. // Переходим на новую строку на тот же магазин
  1096. if (i != i - 1)
  1097. {
  1098. i++;
  1099. j--;
  1100. }
  1101. }
  1102. }
  1103. else
  1104. {
  1105. i++;
  1106. }
  1107. }
  1108. }
  1109. }
  1110. return summa;
  1111. }
  1112. static void ShowRurult(string [,] d) // метод для вывода результата
  1113. {
  1114. int p = 1; // Переменная хранящая номер записи
  1115. // Циклы для прохождения по массиву распределения
  1116. for (int i = 0; i < d.GetLength(0); i++)
  1117. {
  1118. for (int j = 0; j < d.GetLength(1); j++)
  1119. {
  1120. if (i == 0 && j == 0)
  1121. {
  1122. j++;
  1123. }
  1124. string str = d[i,j]; // Переменная для хранения содержимого ячейки
  1125. int k = 0; // Количесво символов / в ячейке
  1126. int index = 0; // Переменная, которая хранит индекс символа /
  1127. for (int e = 0; e < str.Length; e++)
  1128. {
  1129. if (str[e] == '/')
  1130. {
  1131. k++;
  1132. index = e;
  1133. }
  1134. }
  1135. if (k != 0) // Если в ячейке есть символ /
  1136. {
  1137. // Вывод записи кому и с кем нужно заключить договор
  1138. Console.WriteLine(p + ") " + i + " поставщику требуется заключить договор с " + j + " магазином на поставку " + str.Substring(index + 1) + " единиц продукции\n");
  1139. p++;
  1140. }
  1141. }
  1142. }
  1143. }
  1144. static void Main(string[] args)
  1145. {
  1146. while (true)
  1147. {
  1148. Console.WriteLine("Нахождение первоначального распределения транспортной задачи по метод северо-заподного угла");
  1149. int r = 0, c = 0;//размерности матрицы и векторов
  1150. GetRazmer(ref r, "Потребителей"); //ввод потребителей(размерности по столбцам)
  1151. GetRazmer(ref c, "Поставщиков"); //ввод поставщиков(размерности по стокам)
  1152. int[,] matrxA = new int[r, c];//матрица затрат перевозку единицы процукции
  1153. int[,] matrxB = new int[r, c];//матрица затрат на хранение единицы процукции
  1154. Console.Clear();
  1155. GetMatr(ref matrxA, r, c, "Перевозки");
  1156. Console.Clear();
  1157. GetMatr(ref matrxB, r, c, "Хранения");
  1158. Console.Clear();
  1159. int[] m = new int[r];//вектор мощности поставщиков
  1160. int[] n = new int[c];//вектор спроса потребителей
  1161. GetVectora(ref m, ref n);
  1162. Console.Clear();
  1163. int[,] matrxC = new int[r, c];//матрица суммы матриц затрат на хранение и перевозку единицы продукции
  1164. GetSumma(ref matrxC, matrxA, matrxB);
  1165. string[,] matrxD = new string[r+1, c+1];//матрица для распределения с дополнительной строкой и столбцом для спроса и предложения
  1166. GetNewMassive(ref matrxD, m, n, matrxC); // Формирование новой матрицы
  1167. double summa; // Переменная для хранения значения целевой функции
  1168. summa = GetDistribution(ref matrxD);
  1169. Console.Clear();
  1170. Console.WriteLine($"Матрица суммы:");// вывод матрицы с рапределёнными поставками
  1171. for (int i = 0; i < matrxD.GetLength(0); i++)
  1172. {
  1173. for (int j = 0; j < matrxD.GetLength(1); j++)
  1174. {
  1175. Console.Write(matrxD[i, j] + "\t");
  1176. }
  1177. Console.WriteLine();
  1178. }
  1179. Console.WriteLine("\nОбщие затраты денег: " + summa + " у. д. е.");
  1180. Console.ReadKey();
  1181. Console.Clear();
  1182. ShowRurult(matrxD);
  1183. char otv; // Переменная для диалога с пользователем
  1184. while (true)
  1185. {
  1186. try
  1187. {
  1188. Console.Write("\nПовторить программу?\nДа(Y)/Нет(N)\nОтвет: ");
  1189. otv = Convert.ToChar(Console.ReadLine());
  1190. break;
  1191. }
  1192. catch
  1193. {
  1194. Console.WriteLine("Введены некорректные данные!");
  1195. }
  1196. }
  1197. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  1198. {
  1199. break;
  1200. }
  1201. else if (!(otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
  1202. {
  1203. Console.Clear();
  1204. }
  1205. else
  1206. {
  1207. Console.Clear();
  1208. }
  1209. }
  1210. }
  1211. }
  1212. }
  1213. */
  1214. /*
  1215. // распределение с конченной формулой (максимальный элемент +1)-начальная матрица
  1216. using System;
  1217. namespace Мат_моделирование
  1218. {
  1219. class Program
  1220. {
  1221. static void Main(string[] args)
  1222. {
  1223. while (true)
  1224. {
  1225. Console.WriteLine("Сделать первоначальное распределение по методу северо-западного угла в транспортной задаче с учетом преобразования исходной матрицы А в матрицу В по правилу:В = {mахл + 1}-А");
  1226. uint r, c;//размерности матрицы и векторов
  1227. while (true)//ввод потребителей(размерности по столбцам)
  1228. {
  1229. try
  1230. {
  1231. Console.Write("Введите количество потребителей: ");
  1232. c = Convert.ToUInt32(Console.ReadLine());
  1233. if (c < 2)
  1234. {
  1235. Console.WriteLine("Потребителей должно быть не менее двух! Повторите ввод");
  1236. }
  1237. else
  1238. {
  1239. break;
  1240. }
  1241. }
  1242. catch
  1243. {
  1244. Console.WriteLine("Введены некорректные данные!");
  1245. }
  1246. }
  1247. while (true)//ввод поставщиков(размерности по стокам)
  1248. {
  1249. try
  1250. {
  1251. Console.Write("Введите количество поставщиков: ");
  1252. r= Convert.ToUInt32(Console.ReadLine());
  1253. if (r < 2)
  1254. {
  1255. Console.WriteLine("Поставщиков должно быть не менее двух! Повторите ввод");
  1256. }
  1257. else
  1258. {
  1259. break;
  1260. }
  1261. }
  1262. catch
  1263. {
  1264. Console.WriteLine("Введены некорректные данные!");
  1265. }
  1266. }
  1267. int i = 0, j = 0;//переменные для циклов
  1268. uint[,] matrxA = new uint[r, c];//матрица затрат
  1269. Console.WriteLine("Ввод таблицы затрат на перевозку продукции:");//ввод данных в таблицу затрат
  1270. for (i = 0; i < matrxA.GetLength(0); i++)
  1271. {
  1272. for (j = 0; j < matrxA.GetLength(1); j++)
  1273. {
  1274. while (true)
  1275. {
  1276. try
  1277. {
  1278. Console.Write($"Введите стоимость перевозки от {i + 1} поставщика к {j + 1} потребителю: ");
  1279. matrxA[i, j] = Convert.ToUInt32(Console.ReadLine());
  1280. break;
  1281. }
  1282. catch
  1283. {
  1284. Console.WriteLine("Введены некорректные данные!");
  1285. }
  1286. }
  1287. }
  1288. Console.WriteLine();
  1289. }
  1290. Console.WriteLine("Таблица затрат на перевозку продукции:");//вывод таблицы затрат на экран
  1291. for (i = 0; i < matrxA.GetLength(0); i++)
  1292. {
  1293. for (j = 0; j < matrxA.GetLength(1); j++)
  1294. {
  1295. Console.Write(matrxA[i, j] + "\t");
  1296. }
  1297. Console.WriteLine();
  1298. }
  1299. char otv;//переменная для диалога с пользователем
  1300. //Изменение матрицы
  1301. while (true)
  1302. {
  1303. while (true)
  1304. {
  1305. try
  1306. {
  1307. Console.Write("\nХотите изменить данные о таблице?\nДа(любая клавиша)/Нет(N)\nОтвет: ");
  1308. otv = Convert.ToChar(Console.ReadLine());
  1309. break;
  1310. }
  1311. catch
  1312. {
  1313. Console.WriteLine("Введены некорректные данные!");
  1314. }
  1315. }
  1316. if (otv.Equals('n') || otv.Equals('т') || otv.Equals('N') || otv.Equals('Т'))
  1317. {
  1318. break;
  1319. }
  1320. else
  1321. {
  1322. Console.Write("Введите номер поставщика, затем номер потребителя, который вы хотите изменить\nОтвет:\n");
  1323. while (true)
  1324. {
  1325. i = Convert.ToInt32(Console.ReadLine());
  1326. j = Convert.ToInt32(Console.ReadLine());
  1327. if (i < c + 1 && j < r + 1)
  1328. {
  1329. while (true)
  1330. {
  1331. try
  1332. {
  1333. Console.Write("Введите новое значение: ");
  1334. uint temp = Convert.ToUInt32(Console.ReadLine());
  1335. if (temp != 0)
  1336. {
  1337. Console.WriteLine($" Была изменена {i} {j} ячейка таблицы c {matrxA[i - 1, j - 1]} на {temp}");
  1338. matrxA[i - 1, j - 1] = temp;
  1339. break;
  1340. }
  1341. else
  1342. {
  1343. Console.WriteLine("Вы ввели нулевое значение! Повторите ввод");
  1344. }
  1345. }
  1346. catch
  1347. {
  1348. Console.WriteLine("Введены некорректные данные!");
  1349. }
  1350. }
  1351. break;
  1352. }
  1353. else
  1354. {
  1355. Console.WriteLine("Введенная размерность не соответствует матрице! Повторите ввод");
  1356. }
  1357. }
  1358. }
  1359. }
  1360. Console.Clear();
  1361. uint max = 0;//нахождение максимальной затраты на перевозку
  1362. for (i = 0; i < matrxA.GetLength(0); i++)
  1363. {
  1364. for (j = 0; j < matrxA.GetLength(1); j++)
  1365. {
  1366. if (matrxA[i, j] > max)
  1367. {
  1368. max = matrxA[i, j];
  1369. }
  1370. }
  1371. }
  1372. Console.WriteLine($"Максимальная затрата на перевозку равна - {max}");
  1373. uint[,] matrxB = new uint[r, c];//новая таблица затрат, пересчитанная по правилу, указанному в задании
  1374. for (i = 0; i < matrxB.GetLength(0); i++)
  1375. {
  1376. for (j = 0; j < matrxB.GetLength(1); j++)
  1377. {
  1378. matrxB[i, j] = (max + 1) - matrxA[i, j];
  1379. }
  1380. }
  1381. Console.WriteLine("Пересчитанная таблица затрат:");//вывод на экран новой таблицы затрат
  1382. for (i = 0; i < matrxB.GetLength(0); i++)
  1383. {
  1384. for (j = 0; j < matrxB.GetLength(1); j++)
  1385. {
  1386. Console.Write(matrxB[i, j] + "\t");
  1387. }
  1388. Console.WriteLine();
  1389. }
  1390. uint[] m = new uint[r];//вектор мощности поставщиков
  1391. uint[] n = new uint[c];//вектор спроса потребителей
  1392. uint valueM = 0, valueN = 0;
  1393. while (true)
  1394. {
  1395. Console.WriteLine("Ввод данных о количестве продукции поставщиков (m):");//ввод данных в вектор мощности поставщиков
  1396. for (i = 0; i < m.Length; i++)
  1397. {
  1398. while (true)
  1399. {
  1400. try
  1401. {
  1402. Console.Write($"Введите количество продукции у {i + 1} поставщика: ");
  1403. m[i] = Convert.ToUInt32(Console.ReadLine());
  1404. break;
  1405. }
  1406. catch
  1407. {
  1408. Console.WriteLine("Введены некорректные данные!");
  1409. }
  1410. }
  1411. }
  1412. Console.WriteLine("Ввод данных о запрашиваемом количестве продукции потребителями(n):");//ввод данных в вектор спроса потребителей
  1413. for (i = 0; i < n.Length; i++)
  1414. {
  1415. while (true)
  1416. {
  1417. try
  1418. {
  1419. Console.Write($"Введите количество необходимой продукции для {i + 1} потребителя: ");
  1420. n[i] = Convert.ToUInt32(Console.ReadLine());
  1421. break;
  1422. }
  1423. catch
  1424. {
  1425. Console.WriteLine("Введены некорректные данные!");
  1426. }
  1427. }
  1428. }
  1429. for (i = 0; i < m.Length; i++)
  1430. {
  1431. valueM += m[i];
  1432. }
  1433. for (i = 0; i < n.Length; i++)
  1434. {
  1435. valueN += n[i];
  1436. }
  1437. if (valueM == valueN)
  1438. {
  1439. break;
  1440. }
  1441. else//проверка на равенство суммы элементов векторов
  1442. {
  1443. Console.WriteLine("Вектор мощности (m) и cпроса (n) должны быть равны, повторите ввод!");
  1444. valueM = 0;
  1445. valueN = 0;
  1446. }
  1447. }
  1448. Console.WriteLine("Вектор мощности (m):");//вывод на экран
  1449. for (i = 0; i < m.Length; i++)
  1450. {
  1451. Console.Write($"{m[i]} ");
  1452. }
  1453. Console.WriteLine("\nВектор спроса (n):");//вывод на экран
  1454. for (i = 0; i < n.Length; i++)
  1455. {
  1456. Console.Write($"{n[i]} ");
  1457. }
  1458. Console.WriteLine("\nМатрица тарифов:");//вывод на экран матрицы и векторов
  1459. Console.Write(" ");
  1460. for (i = 0; i < n.Length; i++)
  1461. {
  1462. Console.Write($"{n[i]} ");
  1463. }
  1464. Console.WriteLine();
  1465. for (i = 0; i < matrxB.GetLength(0); i++)
  1466. {
  1467. Console.Write($"{m[i]} ");
  1468. for (j = 0; j < matrxB.GetLength(1); j++)
  1469. {
  1470. Console.Write($"{matrxB[i, j]} ");
  1471. }
  1472. Console.WriteLine();
  1473. }
  1474. uint[,] raspr = new uint[r, c];//массив для распределения
  1475. for (i = 0; i < raspr.GetLength(0); i++)
  1476. {
  1477. for (j = 0; j < raspr.GetLength(1); j++)
  1478. {
  1479. raspr[i, j] = 0;
  1480. }
  1481. }
  1482. i = 0;
  1483. j = 0;
  1484. //алгоритм распределения
  1485. while (i < r && j < c)
  1486. {
  1487. if (n[j] > m[i])
  1488. {
  1489. raspr[i, j] = m[i];
  1490. n[j] -= m[i];
  1491. m[i] = 0;
  1492. i++;
  1493. }
  1494. else
  1495. {
  1496. raspr[i, j] = n[j];
  1497. m[i] -= n[j];
  1498. n[j] = 0;
  1499. j++;
  1500. }
  1501. }
  1502. Console.WriteLine();
  1503. for (i = 0; i < raspr.GetLength(0); i++)
  1504. {
  1505. for (j = 0; j < raspr.GetLength(1); j++)
  1506. {
  1507. Console.Write($"{raspr[i, j]} ");
  1508. }
  1509. Console.WriteLine();
  1510. }
  1511. uint F = 0;//нахождение функции распределения
  1512. for (i = 0; i < raspr.GetLength(0); i++)
  1513. {
  1514. for (j = 0; j < raspr.GetLength(1); j++)
  1515. {
  1516. if (raspr[i, j] != 0)
  1517. {
  1518. F += raspr[i, j] * matrxB[i, j];
  1519. }
  1520. }
  1521. }
  1522. Console.WriteLine($"F = {F} у.д.е");
  1523. while (true)
  1524. {
  1525. try
  1526. {
  1527. Console.Write("\nПовторить программу?\nДа(Y)/Нет(N)\nОтвет: ");
  1528. otv = Convert.ToChar(Console.ReadLine());
  1529. break;
  1530. }
  1531. catch
  1532. {
  1533. Console.WriteLine("Введены некорректные данные!");
  1534. }
  1535. }
  1536. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  1537. {
  1538. break;
  1539. }
  1540. else if (!(otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
  1541. {
  1542. Console.Clear();
  1543. }
  1544. else
  1545. {
  1546. Console.Clear();
  1547. }
  1548. }
  1549. }
  1550. }
  1551. }
  1552. */
  1553. /*
  1554. // распределение с конченной формулой (максимальный элемент +1)-начальная матрица 2
  1555. using System;
  1556. using System.Collections.Generic;
  1557. using System.Linq;
  1558. using System.Text;
  1559. using System.Threading.Tasks;
  1560. namespace ConsoleApplication11
  1561. {
  1562. class
  1563. {
  1564. struct
  1565. {
  1566. public int Delivery { get; set; }
  1567. public int Value { get; set; }
  1568. public static int FindMinElement(int a, int b)
  1569. {
  1570. if (a > b) return b;
  1571. if (a == b) { return a; }
  1572. else return a;
  1573. }
  1574. }
  1575. static void Main(string[] args)
  1576. {
  1577. bool o = true;
  1578. string s;
  1579. while (o == true)
  1580. {
  1581. try
  1582. {
  1583. int i = 0;
  1584. int j = 0;
  1585. int x = 0;
  1586. int y = 0;
  1587. int n;
  1588. int max = 0;
  1589. int summa1 = 0;
  1590. int summa2 = 0;
  1591. bool check = true;
  1592. Console.WriteLine("Первоначальное распределение по методу северо-западного угла \n" +
  1593. " в транспортной задаче с учетом преобразования исходной матрицы \n" +
  1594. " А в матрицу В по правилу: B = {max(эл) + 1} - А \n");
  1595. Console.ForegroundColor = ConsoleColor.Blue;
  1596. Console.WriteLine("Введите количество поставщиков");
  1597. n = Convert.ToInt32(Console.ReadLine());
  1598. int[] a = new int[n];
  1599. Console.ForegroundColor = ConsoleColor.Red;
  1600. Console.WriteLine();
  1601. Console.WriteLine("Введите количество потребителей");
  1602. int m = Convert.ToInt32(Console.ReadLine());
  1603. int[] b = new int[m];
  1604. Element[,] C = new Element[n, m];
  1605. Console.ForegroundColor = ConsoleColor.DarkBlue;
  1606. Console.WriteLine();
  1607. while (check == true)
  1608. {
  1609. summa1 = 0;
  1610. summa2 = 0;
  1611. Console.WriteLine("Введите численные параметры поставщиков");
  1612. for (i = 0; i < a.Length; i++)
  1613. {
  1614. x = i + 1;
  1615. Console.Write($"Поставщик {x}: ");
  1616. a[i] = Convert.ToInt32(Console.ReadLine());
  1617. summa1 += a[i];
  1618. }
  1619. Console.ForegroundColor = ConsoleColor.DarkRed;
  1620. Console.WriteLine();
  1621. Console.WriteLine("Введите численные параметры потребителей");
  1622. for (j = 0; j < b.Length; j++)
  1623. {
  1624. y = j + 1;
  1625. Console.Write($"Потребитель {y}: ");
  1626. b[j] = Convert.ToInt32(Console.ReadLine());
  1627. summa2 += b[j];
  1628. }
  1629. if (summa1 == summa2)
  1630. {
  1631. check = false;
  1632. }
  1633. else if (summa1 != summa2)
  1634. {
  1635. check = true;
  1636. }
  1637. Console.Clear();
  1638. }
  1639. Console.ForegroundColor = ConsoleColor.White;
  1640. Console.WriteLine();
  1641. Console.WriteLine("Введите элементы матриц: ");
  1642. for (i = 0; i < n; i++)
  1643. {
  1644. for (j = 0; j < m; j++)
  1645. {
  1646. Console.Write("a[{0},{1}] = ", i, j);
  1647. Console.ForegroundColor = ConsoleColor.Red;
  1648. C[i, j].Value = Convert.ToInt32(Console.ReadLine());
  1649. Console.ResetColor();
  1650. }
  1651. }
  1652. for (i = 0; i < n; i++)
  1653. {
  1654. for (j = 0; j < m; j++)
  1655. {
  1656. if (max <= C[i, j].Value)
  1657. {
  1658. max = C[i, j].Value;
  1659. }
  1660. }
  1661. }
  1662. max += 1;
  1663. for (i = 0; i < n; i++)
  1664. {
  1665. for (j = 0; j < m; j++)
  1666. {
  1667. if (C[i, j].Value != 0)
  1668. {
  1669. C[i, j].Value = max - C[i, j].Value;
  1670. }
  1671. }
  1672. }
  1673. i = j = 0;
  1674. // действуем по алгоритму
  1675. // идём с северо-западного элемента
  1676. // если a[i] = 0 i++
  1677. // если b[j] = 0 j++
  1678. // если a[i],b[j] = 0 то i++,j++;
  1679. // доходим до последнего i , j
  1680. while (i < n && j < m)
  1681. {
  1682. try
  1683. {
  1684. if (a[i] == 0) { i++; }
  1685. if (b[j] == 0) { j++; }
  1686. if (a[i] == 0 && b[j] == 0) { i++; j++; }
  1687. C[i, j].Delivery = Element.FindMinElement(a[i], b[j]);
  1688. a[i] -= C[i, j].Delivery;
  1689. b[j] -= C[i, j].Delivery;
  1690. }
  1691. catch { }
  1692. }
  1693. Console.WriteLine("\n Итоговая матрица: \n");
  1694. //выводим массив на экран
  1695. for (i = 0; i < n; i++)
  1696. {
  1697. for (j = 0; j < m; j++)
  1698. {
  1699. if (C[i, j].Delivery != 0)
  1700. {
  1701. Console.ForegroundColor = ConsoleColor.Blue;
  1702. Console.Write("{0}", C[i, j].Value);
  1703. Console.ForegroundColor = ConsoleColor.Red;
  1704. Console.Write("({0})", C[i, j].Delivery); Console.ResetColor();
  1705. }
  1706. else
  1707. Console.Write("{0}({1})", C[i, j].Value, C[i, j].Delivery);
  1708. }
  1709. Console.WriteLine();
  1710. }
  1711. int ResultFunction = 0;
  1712. //считаем целевую функцию
  1713. for (i = 0; i < n; i++)
  1714. {
  1715. for (j = 0; j < m; j++) { ResultFunction += (C[i, j].Value * C[i, j].Delivery); }
  1716. }
  1717. Console.WriteLine(" F = {0}", ResultFunction);
  1718. i = 0;
  1719. j = 0;
  1720. int[] u = new int[n];
  1721. int[] v = new int[m];
  1722. Console.WriteLine("Хотите продолжать работу?(да/нет)");
  1723. s = Convert.ToString(Console.ReadLine());
  1724. if (s == "да")
  1725. {
  1726. o = true;
  1727. Console.Clear();
  1728. }
  1729. else if (s == "нет")
  1730. {
  1731. o = false;
  1732. Environment.Exit(0);
  1733. }
  1734. else { Environment.Exit(0); }
  1735. }
  1736. catch(Exception)
  1737. {
  1738. Console.Clear();
  1739. Console.ForegroundColor = ConsoleColor.Red;
  1740. Console.WriteLine("!!!Ошибка!!!");
  1741. Console.ForegroundColor = ConsoleColor.White;
  1742. }
  1743. }
  1744. }
  1745. }
  1746. }
  1747. */
  1748. /*
  1749. // распределение минимальный
  1750. namespace Метод_потенциалов
  1751. {
  1752. internal class
  1753. {
  1754. static int[,] matr;
  1755. static int[] mConst;
  1756. static int[] nConst;
  1757. /// <summary>
  1758. /// Определение вырожденности
  1759. /// </summary>
  1760. /// <param name="divisionArray">Распределение</param>
  1761. /// <param name="m">Поставщики</param>
  1762. /// <param name="n">Потребители</param>
  1763. static void degenerate(bool[,] divisionArray, int m, int n)
  1764. {
  1765. int kol = 0;
  1766. foreach (bool in divisionArray)
  1767. {
  1768. if (item)
  1769. {
  1770. kol++;
  1771. }
  1772. }
  1773. if (m + n - 1 != kol)
  1774. {
  1775. int min = 16;
  1776. int iMin = 0;
  1777. int jMin = 0;
  1778. for (int i = 0; i < mConst.Length; i++)
  1779. {
  1780. for (int j = 0; j < nConst.Length; j++)
  1781. {
  1782. if (!divisionArray[i, j])
  1783. {
  1784. if (matr[i, j] < min) //if (matr[i, j] <= min)
  1785. {
  1786. min = matr[i, j];
  1787. iMin = i;
  1788. jMin = j;
  1789. }
  1790. }
  1791. }
  1792. }
  1793. divisionArray[iMin, jMin] = true;
  1794. }
  1795. }
  1796. /// <summary>
  1797. /// Определение ячеек для цикла перераспределения
  1798. /// </summary>
  1799. /// <param name="divisionArrayBool">Информация о распределении</param>
  1800. /// <param name="iMax">Индекс i максимальной дельты</param>
  1801. /// <param name="jMax">Индекс j максимальной дельты</param>
  1802. /// <returns>Строковый массив с индексами ячеек для цикла перераспределения</returns>
  1803. static string[] cycle(bool[,] divisionArrayBool, int iMax, int jMax)
  1804. {
  1805. Console.WriteLine("Введите индексы ячеек, через которые будет проходить цикл, без разделителей.\nНапример: 13 - ячейка [1;3].");
  1806. Console.WriteLine("Цикл можно проводить только через ячейки, в которых находятся единицы.");
  1807. Console.WriteLine("Для завершения ввода введите 0.");
  1808. Console.WriteLine("Цикл начинается из ячейки [{0},{1}]. Введите следующие ячейки.", iMax + 1, jMax + 1);
  1809. string[] array = new string[1];
  1810. array[0] = Convert.ToString(iMax) + Convert.ToString(jMax);
  1811. int i = 1;
  1812. string check = "0";
  1813. while (true)
  1814. {
  1815. while (true)
  1816. {
  1817. if (i % 2 == 0)
  1818. {
  1819. Console.Write("Введите ячейку цикла (+х): ");
  1820. }
  1821. else
  1822. {
  1823. Console.Write("Введите ячейку цикла (-х): ");
  1824. }
  1825. check = Console.ReadLine();
  1826. if (int.TryParse(check, out int result) && result > 10 && result < 35 || check == "0")
  1827. {
  1828. if (check == "0")
  1829. {
  1830. Console.Clear();
  1831. return ;
  1832. }
  1833. if (divisionArrayBool[Convert.ToInt32(check.Substring(0, 1)) - , Convert.ToInt32(check.Substring(1, 1)) - ])
  1834. {
  1835. Array.Resize(ref array, array.Length + 1);
  1836. array[i] = check;
  1837. i++;
  1838. break;
  1839. }
  1840. }
  1841. Console.WriteLine("Ошибка. Введите ячейку корректно!");
  1842. }
  1843. }
  1844. }
  1845. /// <summary>
  1846. /// Расчёт потенциалов, дельты и цикла перераспределения (2, 3, 4 шаги)
  1847. /// </summary>
  1848. /// <param name="divisionArray">Распределение</param>
  1849. /// <param name="divisionArrayBool">Информация о распределении (есть ли связь между поставщиком и потребителем)</param>
  1850. /// <returns>Оптимальное распределение (true) или нет (false)</returns>
  1851. static bool potentials(int[,] divisionArray, [,] )
  1852. {
  1853. int[] v = new int[mConst.Length];
  1854. int[] u = new int[nConst.Length];
  1855. bool[] vbool = new bool[mConst.Length];
  1856. bool[] ubool = new bool[nConst.Length];
  1857. ubool[0] = true;
  1858. for (int i = 0; i < mConst.Length; i++)
  1859. {
  1860. if (divisionArrayBool[i, 0])
  1861. {
  1862. v[i] = matr[i, 0];
  1863. vbool[i] = true;
  1864. }
  1865. }
  1866. bool checkV = true;
  1867. bool checkU = true;
  1868. while (checkV || checkU)
  1869. {
  1870. for (int i = 0; i < mConst.Length; i++)
  1871. {
  1872. for (int j = 1; j < nConst.Length; j++)
  1873. {
  1874. if (divisionArrayBool[i, j])
  1875. {
  1876. if (ubool[j])
  1877. {
  1878. v[i] = matr[i, j] - u[j];
  1879. vbool[i] = true;
  1880. }
  1881. if (vbool[i])
  1882. {
  1883. u[j] = matr[i, j] - v[i];
  1884. ubool[j] = true;
  1885. }
  1886. }
  1887. }
  1888. }
  1889. checkU = false;
  1890. foreach (bool item in ubool)
  1891. {
  1892. if (item == false)
  1893. {
  1894. checkU = true;
  1895. break;
  1896. }
  1897. }
  1898. checkV = false;
  1899. foreach (bool item in vbool)
  1900. {
  1901. if (item == false)
  1902. {
  1903. checkV = true;
  1904. break;
  1905. }
  1906. }
  1907. }
  1908. int[,] delta = new int[mConst.Length, nConst.Length];
  1909. for (int i = 0; i < mConst.Length; i++)
  1910. {
  1911. for (int j = 0; j < nConst.Length; j++)
  1912. {
  1913. if (!divisionArrayBool[i, j])
  1914. {
  1915. delta[i, j] = v[i] + u[j] - matr[i, j];
  1916. }
  1917. }
  1918. }
  1919. bool check = false;
  1920. foreach (int item in delta)
  1921. {
  1922. if (item > 0)
  1923. {
  1924. check = true;
  1925. break;
  1926. }
  1927. }
  1928. if (!check)
  1929. {
  1930. return true;
  1931. }
  1932. int max = delta[0, 0];
  1933. int iMax = 0;
  1934. int jMax = 0;
  1935. for (int i = 0; i < mConst.Length; i++)
  1936. {
  1937. for (int j = 0; j < nConst.Length; j++)
  1938. {
  1939. if (delta[i, j] > max)
  1940. {
  1941. max = delta[i, j];
  1942. iMax = i;
  1943. jMax = j;
  1944. }
  1945. }
  1946. }
  1947. for (int i = 0; i < mConst.Length; i++)
  1948. {
  1949. for (int j = 0; j < nConst.Length; j++)
  1950. {
  1951. if (divisionArrayBool[i, j])
  1952. {
  1953. Console.Write(1 + "\t");
  1954. }
  1955. else
  1956. {
  1957. Console.Write(0 + "\t");
  1958. }
  1959. }
  1960. Console.WriteLine();
  1961. }
  1962. string[] cycleArray = cycle(divisionArrayBool, iMax, jMax);
  1963. int iMin = Convert.ToInt32(cycleArray[1].Substring(0, 1)) - 1;
  1964. int jMin = Convert.ToInt32(cycleArray[1].Substring(1, 1)) - 1;
  1965. int min = divisionArray[iMin, jMin];
  1966. for (int i = 3; i < cycleArray.Length; i+=2)
  1967. {
  1968. iMin = Convert.ToInt32(cycleArray[i].Substring(0, 1)) - 1;
  1969. jMin = Convert.ToInt32(cycleArray[i].Substring(1, 1)) - 1;
  1970. if (divisionArray[iMin, jMin] < min)
  1971. {
  1972. min = divisionArray[iMin, jMin];
  1973. }
  1974. }
  1975. int indexI = Convert.ToInt32(cycleArray[0].Substring(0, 1));
  1976. int jndexJ = Convert.ToInt32(cycleArray[0].Substring(1, 1));
  1977. divisionArray[indexI, jndexJ] += min;
  1978. if (divisionArray[indexI, jndexJ] > 0)
  1979. {
  1980. divisionArrayBool[indexI, jndexJ] = true;
  1981. }
  1982. for (int c = 1; c < cycleArray.Length; c++)
  1983. {
  1984. int i = Convert.ToInt32(cycleArray[c].Substring(0, 1)) - 1;
  1985. int j = Convert.ToInt32(cycleArray[c].Substring(1, 1)) - 1;
  1986. if (c % 2 == 0)
  1987. {
  1988. divisionArray[i, j] += min;
  1989. if (divisionArray[i, j] > 0)
  1990. {
  1991. divisionArrayBool[i, j] = true;
  1992. }
  1993. }
  1994. else
  1995. {
  1996. divisionArray[i, j] -= min;
  1997. if (divisionArray[i, j] == 0)
  1998. {
  1999. divisionArrayBool[i, j] = false;
  2000. }
  2001. }
  2002. }
  2003. return false;
  2004. }
  2005. /// <summary>
  2006. /// Расчёт функции и заключения договоров
  2007. /// </summary>
  2008. static void calculation()
  2009. {
  2010. int[] m = new int[mConst.Length];
  2011. int[] n = new int[nConst.Length];
  2012. bool[,] divisionArrayBool = new bool[m.Length, n.Length];
  2013. int[,] divisionArray = new int[m.Length, n.Length];
  2014. int[,] firstDivision = new int[m.Length, n.Length];
  2015. bool check = false;
  2016. int func = 0;
  2017. string funcS = "";
  2018. Array.Copy(matr, firstDivision, matr.Length);
  2019. Array.Copy(mConst, m, mConst.Length);
  2020. Array.Copy(nConst, n, nConst.Length);
  2021. int sum = 1;
  2022. while (sum != 0)
  2023. {
  2024. int min = 16;
  2025. int iMin = 0;
  2026. int jMin = 0;
  2027. for (int i = 0; i < m.Length; i++)
  2028. {
  2029. for (int j = 0; j < n.Length; j++)
  2030. {
  2031. if (firstDivision[i, j] < min && firstDivision[i, j] > 0)
  2032. {
  2033. min = firstDivision[i, j];
  2034. iMin = i;
  2035. jMin = j;
  2036. }
  2037. }
  2038. }
  2039. firstDivision[iMin, jMin] = 0;
  2040. if (m[iMin] > 0 && n[jMin] > 0)
  2041. {
  2042. if (n[jMin] < m[iMin])
  2043. {
  2044. func += matr[iMin, jMin] * n[jMin];
  2045. funcS += matr[iMin, jMin] + "*" + n[jMin] + " + ";
  2046. divisionArray[iMin, jMin] = n[jMin];
  2047. divisionArrayBool[iMin, jMin] = true;
  2048. m[iMin] -= n[jMin];
  2049. n[jMin] = 0;
  2050. }
  2051. else
  2052. {
  2053. func += matr[iMin, jMin] * m[iMin];
  2054. funcS += matr[iMin, jMin] + "*" + m[iMin] + " + ";
  2055. divisionArray[iMin, jMin] = m[iMin];
  2056. divisionArrayBool[iMin, jMin] = true;
  2057. n[jMin] -= m[iMin];
  2058. m[iMin] = 0;
  2059. }
  2060. }
  2061. sum = 0;
  2062. foreach (int item in m)
  2063. {
  2064. sum += item;
  2065. }
  2066. }
  2067. degenerate(divisionArrayBool, m.Length, n.Length);
  2068. funcS = "Ответ: Fопт = " + funcS.Substring(0, funcS.Length - 3) + " = " + func + " у.д.е.";
  2069. check = potentials(divisionArray, divisionArrayBool);
  2070. if (!check)
  2071. {
  2072. while (check != true)
  2073. {
  2074. funcS = "";
  2075. func = 0;
  2076. Array.Copy(mConst, m, mConst.Length);
  2077. Array.Copy(nConst, n, nConst.Length);
  2078. for (int i = 0; i < m.Length; i++)
  2079. {
  2080. for (int j = 0; j < n.Length; j++)
  2081. {
  2082. if (divisionArray[i, j] > 0)
  2083. {
  2084. if (n[j] < m[i])
  2085. {
  2086. func += matr[i, j] * divisionArray[i, j];
  2087. funcS += matr[i, j] + "*" + divisionArray[i, j] + " + ";
  2088. }
  2089. else
  2090. {
  2091. func += matr[i, j] * divisionArray[i, j];
  2092. funcS += matr[i, j] + "*" + divisionArray[i, j] + " + ";
  2093. }
  2094. }
  2095. }
  2096. }
  2097. funcS = "Ответ: Fопт = " + funcS.Substring(0, funcS.Length - 3) + " = " + func + " у.д.е.";
  2098. check = potentials(divisionArray, divisionArrayBool);
  2099. }
  2100. }
  2101. Console.WriteLine(funcS + "\n");
  2102. Console.WriteLine("\t\tЗаключение договоров");
  2103. for (int i = 0; i < m.Length; i++)
  2104. {
  2105. for (int j = 0; j < n.Length; j++)
  2106. {
  2107. if (divisionArray[i, j] > 0)
  2108. {
  2109. Console.WriteLine("{0}-й поставщик с {1}-м потребителем на {2} ед. продукции", i + 1, j + 1, divisionArray[i, j]);
  2110. }
  2111. }
  2112. }
  2113. Console.WriteLine();
  2114. }
  2115. /// <summary>
  2116. /// Заполнение исходных данных по условию задачи
  2117. /// </summary>
  2118. static void fill()
  2119. {
  2120. matr = new int[3, 4];
  2121. matr[0, 0] = 9;
  2122. matr[0, 1] = 5;
  2123. matr[0, 2] = 3;
  2124. matr[0, 3] = 10;
  2125. matr[1, 0] = 6;
  2126. matr[1, 1] = 3;
  2127. matr[1, 2] = 8;
  2128. matr[1, 3] = 2;
  2129. matr[2, 0] = 3;
  2130. matr[2, 1] = 8;
  2131. matr[2, 2] = 4;
  2132. matr[2, 3] = 7;
  2133. mConst = new int[3];
  2134. mConst[0] = 25;
  2135. mConst[1] = 55;
  2136. mConst[2] = 22;
  2137. nConst = new int[4];
  2138. nConst[0] = 45;
  2139. nConst[1] = 15;
  2140. nConst[2] = 22;
  2141. nConst[3] = 20;
  2142. }
  2143. /// <summary>
  2144. /// Ввод исходных данных вручную
  2145. /// </summary>
  2146. static void vvod()
  2147. {
  2148. int m, n;
  2149. while (true)
  2150. {
  2151. Console.Write("Введите количество поставщиков: ");
  2152. if (int.TryParse(Console.ReadLine(), out int result) && result > 1 && result < 11)
  2153. {
  2154. m = result;
  2155. break;
  2156. }
  2157. Console.WriteLine("Ошибка. Введите значение корректно!");
  2158. }
  2159. while (true)
  2160. {
  2161. Console.Write("Введите количество потребителей: ");
  2162. if (int.TryParse(Console.ReadLine(), out int result) && result > 1 && result < 11)
  2163. {
  2164. n = result;
  2165. break;
  2166. }
  2167. Console.WriteLine("Ошибка. Введите значение корректно!");
  2168. }
  2169. matr = new int[m, n];
  2170. mConst = new int[m];
  2171. nConst = new int[n];
  2172. Console.WriteLine("Заполнение матрицы затрат на перевозку.");
  2173. for (int i = 0; i < mConst.Length; i++)
  2174. {
  2175. for (int j = 0; j < nConst.Length; j++)
  2176. {
  2177. while (true)
  2178. {
  2179. Console.Write("Введите [{0},{1}] элемент матрицы: ", i + 1, j + 1);
  2180. if (int.TryParse(Console.ReadLine(), out int result) && result > 0 && result < 16)
  2181. {
  2182. matr[i, j] = result;
  2183. break;
  2184. }
  2185. Console.WriteLine("Ошибка. Введите значение корректно!");
  2186. }
  2187. }
  2188. }
  2189. while (true)
  2190. {
  2191. for (int i = 0; i < mConst.Length; i++)
  2192. {
  2193. while (true)
  2194. {
  2195. Console.Write("Введите мощность {0}-го поставщика: ", i + 1);
  2196. if (int.TryParse(Console.ReadLine(), out int result) && result > 1 && result < 151)
  2197. {
  2198. mConst[i] = result;
  2199. break;
  2200. }
  2201. Console.WriteLine("Ошибка. Введите значение корректно!");
  2202. }
  2203. }
  2204. for (int i = 0; i < nConst.Length; i++)
  2205. {
  2206. while (true)
  2207. {
  2208. Console.Write("Введите спрос {0}-го потребителя: ", i + 1);
  2209. if (int.TryParse(Console.ReadLine(), out int result) && result > 1 && result < 151)
  2210. {
  2211. nConst[i] = result;
  2212. break;
  2213. }
  2214. Console.WriteLine("Ошибка. Введите значение корректно!");
  2215. }
  2216. }
  2217. Console.Clear();
  2218. int sumM = 0;
  2219. foreach (int item in mConst)
  2220. {
  2221. sumM += item;
  2222. }
  2223. int sumN = 0;
  2224. foreach (int item in nConst)
  2225. {
  2226. sumN += item;
  2227. }
  2228. if (sumM == sumN)
  2229. {
  2230. break;
  2231. }
  2232. Console.WriteLine("Ошибка. Суммарные мощности поставщиков и спросов потребителей не равны!");
  2233. }
  2234. }
  2235. static void Main(string[] args)
  2236. {
  2237. bool check = true;
  2238. while (check)
  2239. {
  2240. Console.WriteLine("1 - Ввести данные вручную.");
  2241. Console.WriteLine("2 - Заполнить данные автоматически (по условию задачи).");
  2242. Console.WriteLine("3 - Очистить экран.");
  2243. Console.WriteLine("4 - Завершить работу.");
  2244. Console.Write("Выберите действие: ");
  2245. if (int.TryParse(Console.ReadLine(), out int result) && result > 0 && result < 5)
  2246. {
  2247. switch (result)
  2248. {
  2249. case 1:
  2250. Console.Clear();
  2251. vvod();
  2252. calculation();
  2253. break;
  2254. case 2:
  2255. Console.Clear();
  2256. fill();
  2257. calculation();
  2258. break;
  2259. case 3:
  2260. Console.Clear();
  2261. break;
  2262. case 4:
  2263. check = false;
  2264. break;
  2265. }
  2266. }
  2267. else
  2268. {
  2269. Console.WriteLine("Введите действие корректно!");
  2270. }
  2271. }
  2272. }
  2273. }
  2274. }
  2275. */
  2276. /*
  2277. //Методом потенциалов. (с преобразованием из лаб.6) Найти оптимальное распределение трех видов механизмов между тремя участками работ. Данные об эффективности использования механизмов конкретного типа на участке работ сведены в таблицу.
  2278. using System;
  2279. namespace matmodelirovanie
  2280. {
  2281. class program
  2282. {
  2283. static void Main(string[] args)
  2284. {
  2285. while (true)
  2286. {
  2287. Console.WriteLine("Задача №3.\nНахождение оптимального распределения трех видов механизмов между тремя участками работ. ");//постановка задачи
  2288. uint r1, r2;//размерности матрицы и векторов
  2289. r1 = 3;
  2290. r2 = 3;
  2291. char otv;//переменная для диалога
  2292. uint[,] arr = new uint[r2, r1];//матрица затрат
  2293. uint[] m = new uint[r2];//вектор мощности
  2294. uint[] n = new uint[r1];//вектор спроса
  2295. uint valueM = 0, valueN = 0;//переменные для подсчета суммы
  2296. uint min = uint.MaxValue;//переменная для поиска минимального элемента
  2297. uint max = uint.MinValue;//переменная для поиска максимального элемента
  2298. uint minL = uint.MinValue;
  2299. uint maxx = uint.MinValue;//переменная для поиска максимального элемента
  2300. int indI = 0, indJ = 0;//переменные для хранения индекса минимального элемента
  2301. int indII = 0, indJJ = 0;//переменные для хранения индекса максимального элемента
  2302. uint[,] raspr = new uint[r2, r1];//массив в котором хранятся значения, куда и сколько использовалось механизмов
  2303. uint F = 0;//целевая функция
  2304. string[] postavki = new string[0];//массив строк в котором прописано, кто с кем заключил договор
  2305. string[,] itog = new string[r2, r1];//матрица, которая схожа с исходной, но в ней проставлены поставки через слеш
  2306. Console.WriteLine();
  2307. Console.WriteLine("Ввод данных об эффективности использования механизмов конкретного типа на участках работы:");
  2308. for (int i = 0; i < arr.GetLength(0); i++)
  2309. {
  2310. for (int j = 0; j < arr.GetLength(1); j++)
  2311. {
  2312. while (true) // ввод данных об эффективности использования механизмов конкретного типа на участках работы
  2313. {
  2314. try
  2315. {
  2316. Console.Write($"Введите производительность {i + 1}-го механизма при работе на {j + 1}-ом участке: ");
  2317. arr[i, j] = Convert.ToUInt32(Console.ReadLine());
  2318. if (arr[i, j] > 0)
  2319. break;
  2320. else
  2321. {
  2322. Console.WriteLine($"Не можеть быть 0");
  2323. }
  2324. }
  2325. catch
  2326. {
  2327. Console.WriteLine("Введены некорректные данные!");
  2328. }
  2329. }
  2330. }
  2331. }
  2332. while (true) // ввод данных об количестве механизмов каждого типа
  2333. {
  2334. Console.WriteLine();
  2335. Console.WriteLine("Ввод данных о количестве механизмов каждого типа:");
  2336. for (int i = 0; i < m.Length; i++)
  2337. {
  2338. while (true)
  2339. {
  2340. try
  2341. {
  2342. Console.Write($"Введите количество механизмов {i + 1}-го типа: ");
  2343. m[i] = Convert.ToUInt32(Console.ReadLine());
  2344. break;
  2345. }
  2346. catch
  2347. {
  2348. Console.WriteLine("Введены некорректные данные!");
  2349. }
  2350. }
  2351. }
  2352. Console.WriteLine();
  2353. Console.WriteLine("Ввод данных о запрашиваемых механизмах для каждого участка:");
  2354. for (int i = 0; i < n.Length; i++)
  2355. {
  2356. while (true) //ввод данных о запрашиваемых механизмах для каждого участка
  2357. {
  2358. try
  2359. {
  2360. Console.Write($"Введите количество запрашиваемых механизмов для {i + 1}-го участка работы: ");
  2361. n[i] = Convert.ToUInt32(Console.ReadLine());
  2362. break;
  2363. }
  2364. catch
  2365. {
  2366. Console.WriteLine("Введены некорректные данные!");
  2367. }
  2368. }
  2369. }
  2370. for (int i = 0; i < m.Length; i++) // проверка на одинаковость суммы векторов
  2371. {
  2372. valueM += m[i];
  2373. }
  2374. for (int i = 0; i < n.Length; i++)
  2375. {
  2376. valueN += n[i];
  2377. }
  2378. if (valueM == valueN)
  2379. {
  2380. break;
  2381. }
  2382. else
  2383. {
  2384. Console.WriteLine("Вектор механизмов и участков работ должны быть равны, повторите ввод!");
  2385. valueM = 0;
  2386. valueN = 0;
  2387. }
  2388. }
  2389. Console.WriteLine();
  2390. //вывод таблицы производительности и векторов
  2391. Console.WriteLine("\nТаблица производительности:");
  2392. for (int i = 0; i < arr.GetLength(0); i++)
  2393. {
  2394. for (int j = 0; j < arr.GetLength(1); j++)
  2395. {
  2396. Console.Write($"{arr[i, j]} ");
  2397. }
  2398. Console.WriteLine();
  2399. }
  2400. Console.WriteLine();
  2401. Console.WriteLine("Вектор механизмов (m):");
  2402. for (int i = 0; i < m.Length; i++)
  2403. {
  2404. Console.Write($"{m[i]} ");
  2405. }
  2406. Console.WriteLine();
  2407. Console.WriteLine("\nВектор участков работы (n):");
  2408. for (int i = 0; i < n.Length; i++)
  2409. {
  2410. Console.Write($"{n[i]} ");
  2411. }
  2412. //Возможность изменять матрицу
  2413. while (true)
  2414. {
  2415. while (true)
  2416. {
  2417. try
  2418. {
  2419. Console.Write("\nХотите изменить данные в таблице?\nЕсли нет, то нажмите на кнопку Д на клавиатуре\nЕсли да, то можете нажать на любую другую кнопку\nОтвет: ");
  2420. otv = Convert.ToChar(Console.ReadLine());
  2421. break;
  2422. }
  2423. catch
  2424. {
  2425. Console.WriteLine("Введены некорректные данные!");
  2426. }
  2427. }
  2428. if (otv.Equals('l') || otv.Equals('д') || otv.Equals('Д') || otv.Equals('L'))
  2429. {
  2430. break;
  2431. }
  2432. else
  2433. {
  2434. Console.Write("Введите номер вида механизма, затем номер участка работ, который вы хотите изменить\nОтвет:\n");
  2435. while (true)
  2436. {
  2437. int i = Convert.ToInt32(Console.ReadLine()), j = Convert.ToInt32(Console.ReadLine());
  2438. if (i < r2 + 1 && j < r1 + 1)
  2439. {
  2440. while (true)
  2441. {
  2442. try
  2443. {
  2444. Console.Write("Введите новое значение: ");
  2445. uint temp = Convert.ToUInt32(Console.ReadLine());
  2446. if (temp != 0)
  2447. {
  2448. Console.WriteLine($"Вы изменили {i} {j} ячейку таблицы c {arr[i - 1, j - 1]} на {temp}");
  2449. arr[i - 1, j - 1] = temp;
  2450. break;
  2451. }
  2452. else
  2453. {
  2454. Console.WriteLine("Нельзя ввести нулевое значение! Повторите ввод");
  2455. }
  2456. }
  2457. catch
  2458. {
  2459. Console.WriteLine("Введены некорректные данные!");
  2460. }
  2461. }
  2462. break;
  2463. }
  2464. else
  2465. {
  2466. Console.WriteLine("Введенная размерность не соответствует! Повторите ввод");
  2467. }
  2468. }
  2469. }
  2470. }
  2471. Console.Clear();
  2472. Console.WriteLine("\nМатрица:"); //вывод матрицы тарифов
  2473. Console.Write(" ");
  2474. for (int i = 0; i < n.Length; i++)
  2475. {
  2476. Console.Write($"{n[i]} ");
  2477. }
  2478. Console.WriteLine();
  2479. for (int i = 0; i < arr.GetLength(0); i++)
  2480. {
  2481. Console.Write($"{m[i]} ");
  2482. for (int j = 0; j < arr.GetLength(1); j++)
  2483. {
  2484. Console.Write($"{arr[i, j]} ");
  2485. }
  2486. Console.WriteLine();
  2487. }
  2488. for (int i = 0; i < raspr.GetLength(0); i++) // создание таблицы распределения и заполнение её пока что нулями
  2489. {
  2490. for (int j = 0; j < raspr.GetLength(1); j++)
  2491. {
  2492. raspr[i, j] = 0;
  2493. }
  2494. }
  2495. max = uint.MinValue; // Максимальное значение
  2496. for (int i = 0; i < arr.GetLength(0); i++) // поиск максимального и преобразование по формуле Maxl+1-A
  2497. {
  2498. for (int j = 0; j < arr.GetLength(1); j++)
  2499. {
  2500. if (arr[i, j] > max)
  2501. {
  2502. max = arr[i, j];
  2503. }
  2504. }
  2505. }
  2506. max = max + 1;
  2507. for (int i = 0; i < arr.GetLength(0); i++)
  2508. {
  2509. for (int j = 0; j < arr.GetLength(1); j++)
  2510. {
  2511. arr[i, j] = max - arr[i, j]; // преобразование по формуле Maxl+1-A
  2512. }
  2513. }
  2514. Console.WriteLine("\nПреобразование значений матрицы:"); // вывод преобразованной таблицы
  2515. for (int i = 0; i < arr.GetLength(0); i++)
  2516. {
  2517. for (int j = 0; j < arr.GetLength(1); j++)
  2518. {
  2519. Console.Write($" {arr[i, j]} ");
  2520. }
  2521. Console.WriteLine();
  2522. }
  2523. while (true) //алгоритм решения по минимальному элементу
  2524. {
  2525. min = uint.MaxValue;
  2526. valueM = 0;
  2527. valueN = 0;
  2528. for (int i = 0; i < arr.GetLength(0); i++)
  2529. {
  2530. for (int j = 0; j < arr.GetLength(1); j++)
  2531. {
  2532. if (arr[i, j] < min && raspr[i, j] == 0 && m[i] != 0 && n[j] != 0)
  2533. {
  2534. min = arr[i, j];
  2535. indI = i;
  2536. indJ = j;
  2537. }
  2538. }
  2539. }
  2540. if (n[indJ] != 0 && m[indI] != 0)
  2541. {
  2542. if (n[indJ] > m[indI])
  2543. {
  2544. raspr[indI, indJ] = m[indI];
  2545. n[indJ] -= m[indI];
  2546. m[indI] = 0;
  2547. }
  2548. else
  2549. {
  2550. raspr[indI, indJ] = n[indJ];
  2551. m[indI] -= n[indJ];
  2552. n[indJ] = 0;
  2553. }
  2554. }
  2555. for (int i = 0; i < m.Length; i++) // проверка на то, что первоначальное рапределение выполнено полностью
  2556. {
  2557. valueM += m[i];
  2558. }
  2559. for (int i = 0; i < n.Length; i++)
  2560. {
  2561. valueN += n[i];
  2562. }
  2563. if (valueM == 0 && valueN == 0)
  2564. {
  2565. break;
  2566. }
  2567. }
  2568. Console.WriteLine("\nПервоначальное распределение методом минимального элемента:");
  2569. uint zap = 0;//переменная для подсчета заполненных клеток, понадобиться для проверки вырожденности
  2570. for (int i = 0; i < itog.GetLength(0); i++) //вывод матрицы, в которой через слеш написаны поставки
  2571. {
  2572. for (int j = 0; j < itog.GetLength(1); j++)
  2573. {
  2574. if (raspr[i, j] != 0)
  2575. {
  2576. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  2577. zap = zap + 1;
  2578. }
  2579. else
  2580. {
  2581. itog[i, j] = $"{arr[i, j]} ";
  2582. }
  2583. Console.Write($"{itog[i, j]} ");
  2584. }
  2585. Console.WriteLine();
  2586. }
  2587. uint strst = r1 + r2 - 1;
  2588. minL = uint.MaxValue; //проверка на вырожденность
  2589. Console.WriteLine();
  2590. Console.WriteLine("\nПроверка на вырожденность:");
  2591. if (strst != zap) //если количество заполненных клеток не равно столбцы+строки-1, то приписание 0 в мин поставку из свободных
  2592. {
  2593. Console.WriteLine("Таблица вырождена");
  2594. for (int i =
  2595. 0; i < arr.GetLength(0); i++) // поиск миним. эл среди не заполненных
  2596. {
  2597. for (int j = 0; j < arr.GetLength(1); j++)
  2598. {
  2599. if (raspr[i, j] == 0)
  2600. {
  2601. if (arr[i, j] < minL)
  2602. {
  2603. minL = arr[i, j];
  2604. indI = i;
  2605. indJ = j;
  2606. }
  2607. }
  2608. }
  2609. }
  2610. raspr[indI, indJ] = 9999; // помечаем не заполненные минимальные клетки
  2611. for (int i = 0; i < itog.GetLength(0); i++)
  2612. {
  2613. for (int j = 0; j < itog.GetLength(1); j++)
  2614. {
  2615. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  2616. {
  2617. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  2618. }
  2619. else if (raspr[i, j] == 9999)
  2620. {
  2621. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999}"; //добавление поставки 0
  2622. }
  2623. else
  2624. {
  2625. itog[i, j] = $"{arr[i, j]} ";
  2626. }
  2627. Console.Write($"{itog[i, j]} ");
  2628. }
  2629. Console.WriteLine();
  2630. }
  2631. }
  2632. else
  2633. {
  2634. Console.WriteLine("Таблица не вырождена");
  2635. }
  2636. metka:
  2637. Console.WriteLine();
  2638. int[] U = new int[r2]; // начальное заполнение массива потенциалов, для дальнейшего решения
  2639. int[] V = new int[r1];
  2640. for (int i = 0; i < r1; i++)
  2641. {
  2642. U[i] = 99;
  2643. V[i] = 99;
  2644. }
  2645. //Для заполненных клеток рассчитываются потенциалы Uj и Vi
  2646. // проверка на то, является ли ячейка пустой и не записаны ли для неё потенциалы, если нет, то высчитывается потенциал
  2647. Console.WriteLine("Расчёт потенциалов");
  2648. while (true)
  2649. {
  2650. bool proverk = true; // для выхода из бесконечного цикла
  2651. U[0] = 0; // первому элементу u всегда присваивается 0
  2652. for (int j = 0; j < r2; j++)
  2653. {
  2654. for (int i = 0; i < r1; i++)
  2655. {
  2656. if (raspr[i, j] != 0)
  2657. {
  2658. if (U[j] != 99)
  2659. {
  2660. V[i] = Convert.ToInt32(arr[i, j] - U[j]); // растановка потенциалов V
  2661. }
  2662. else if (V[i] != 99)
  2663. {
  2664. U[j] = Convert.ToInt32(arr[i, j] - V[i]);// растановка потенциалов U
  2665. }
  2666. }
  2667. }
  2668. }
  2669. for (int i = 0; i < r1; i++) // если все потенциалы расставлены, т.е они перестали быть = 99, то выходим из бессконечного цикла
  2670. {
  2671. if (U[i] == 99 || V[i] == 99)
  2672. {
  2673. proverk = false;
  2674. }
  2675. }
  2676. if (proverk)
  2677. {
  2678. break;
  2679. }
  2680. }
  2681. Console.WriteLine("Таблица с раставленными потенциалами:"); // вывод таблицы с потенциалами
  2682. for (int i = 0; i < arr.GetLength(0); i++)
  2683. {
  2684. for (int j = 0; j < arr.GetLength(1); j++)
  2685. {
  2686. Console.Write($"{itog[i, j]} ");
  2687. }
  2688. Console.Write($" {V[i]}");
  2689. Console.WriteLine();
  2690. }
  2691. for (int i = 0; i < arr.GetLength(1); i++)
  2692. {
  2693. Console.Write($"{U[i]} ");
  2694. }
  2695. Console.WriteLine();
  2696. Console.WriteLine();
  2697. int[,] Delta = new int[r2, r1]; // задаеем массив дельт
  2698. int maxxx = 0; // задаем максимпальной дельте 0
  2699. Console.WriteLine("Для пустых клеток расчет дельты:");
  2700. for (int i = 0; i < arr.GetLength(0); i++) //определение оптимальности - расчет дельта
  2701. {
  2702. for (int j = 0; j < arr.GetLength(1); j++)
  2703. {
  2704. if (raspr[i, j] == 0) // если клетка пустая, то считаем дельту
  2705. {
  2706. Delta[i, j] = Convert.ToInt32(U[j] + V[i] - arr[i, j]);
  2707. if (Delta[i, j] > maxxx) // если посчитанная дельта больше макс.дельты, то присваиваем максимальной дельте полученную дельту и запоминаем её индексы
  2708. {
  2709. maxxx = Delta[i, j];
  2710. indI = i;
  2711. indJ = j;
  2712. }
  2713. if (Delta[i, j] == maxxx && Delta[i, j] != 0) // выводим положительные дельты
  2714. {
  2715. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]} - max");
  2716. }
  2717. else // выводим не положительные дельты
  2718. {
  2719. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]}");
  2720. }
  2721. }
  2722. }
  2723. }
  2724. Console.WriteLine();
  2725. int[,] optimal = new int[r2, r1]; // массив оптимальности, для построения цикла перераспределения
  2726. int indi = indI; // переприсвоение индексов максимальной дельты
  2727. int indj = indJ;
  2728. bool proverk1 = true; // для выхода из бесконечного цикла
  2729. bool proverk2 = true;
  2730. if (maxxx > 0) // проверка на оптимальность
  2731. {
  2732. Console.WriteLine("Решение не оптимальное:");
  2733. for (int i = 0; i < optimal.GetLength(0); i++)
  2734. {
  2735. for (int j = 0; j < optimal.GetLength(0); j++)
  2736. {
  2737. optimal[i, j] = 0; // заполнение массива 0, понадобится для дальнейших расчетов
  2738. if (i == indI && j == indJ) //если элемент является максимальрной дельтой, то присваиваем ему 1 (отличный от всех)
  2739. {
  2740. optimal[i, j] = 1;
  2741. }
  2742. }
  2743. }
  2744. F = 0; // промежуточный вывод целувой функции
  2745. for (int i = 0; i < raspr.GetLength(0); i++)
  2746. {
  2747. for (int
  2748. j = 0; j < raspr.GetLength(1); j++)
  2749. {
  2750. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  2751. {
  2752. F += raspr[i, j] * arr[i, j];
  2753. }
  2754. }
  2755. }
  2756. Console.WriteLine($"\nF = {F} у.д.е");
  2757. Console.WriteLine();
  2758. while (true)
  2759. {
  2760. proverk2 = true; //для бесконечного цикла
  2761. for (int i = 0; i < optimal.GetLength(0); i++)
  2762. {
  2763. for (int j = 0; j < optimal.GetLength(1); j++)
  2764. {
  2765. if (i != indi && j != indj && raspr[i, j] != 0 && optimal[i, j] != 2) // находим заполненные клетки, которые не являются максимальной дельтой
  2766. {
  2767. optimal[i, j] = 2; // присваиваем им 2, для отличия
  2768. indI = i;
  2769. indJ = j;
  2770. proverk2 = false; // выход из бесконечного цикла по j
  2771. break;
  2772. }
  2773. }
  2774. if (!proverk2) // выход из бесконечного цикла по i
  2775. {
  2776. break;
  2777. }
  2778. }
  2779. if (raspr[indI, indj] != 0 && raspr[indi, indJ] != 0) // строим цикл перераспр.
  2780. {
  2781. optimal[indI, indj] = optimal[indi, indJ] = -1; //помечаем клетку от куда будем вычитать -x
  2782. optimal[indI, indJ] = 1;//помечаем клетку куда будем прибавлять +x
  2783. proverk1 = false;
  2784. }
  2785. if (!proverk1) // выход из бесконечного цикла
  2786. {
  2787. break;
  2788. }
  2789. }
  2790. uint minT = uint.MaxValue;
  2791. for (int i = 0; i < optimal.GetLength(0); i++) // выбираем X=MIN(-x)
  2792. {
  2793. for (int j = 0; j < optimal.GetLength(1); j++)
  2794. {
  2795. if (optimal[i, j] == -1)
  2796. {
  2797. if (raspr[i, j] < minT)
  2798. {
  2799. minT = raspr[i, j];
  2800. }
  2801. }
  2802. }
  2803. }
  2804. Console.WriteLine($"X = MIN = {minT}");
  2805. Console.WriteLine();
  2806. for (int i = 0; i < optimal.GetLength(0); i++) // выполняем перераспределение
  2807. {
  2808. for (int j = 0; j < optimal.GetLength(1); j++)
  2809. {
  2810. if (optimal[i, j] == -1) // если клетка помечена -1, из её поставки вычитаем MIN
  2811. {
  2812. raspr[i, j] -= Convert.ToUInt32(minT);
  2813. }
  2814. if (optimal[i, j] == 1 && raspr[i, j] != 9999) // если клетка помечена 1 и является заполненной к ней прибавляем MIN
  2815. {
  2816. raspr[i, j] += Convert.ToUInt32(minT);
  2817. }
  2818. else if (optimal[i, j] == 1 && raspr[i, j] == 999) //если клетка помечена 1 и не заполнена к ней прибавляем MIN
  2819. {
  2820. raspr[i, j] += Convert.ToUInt32(minT) - 999;
  2821. }
  2822. }
  2823. }
  2824. zap = 0; // вывод матрицы после цикла перераспределения
  2825. Console.WriteLine("Построенные цикл перераспределения");
  2826. for (int i = 0; i < itog.GetLength(0); i++)
  2827. {
  2828. for (int j = 0; j < itog.GetLength(1); j++)
  2829. {
  2830. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  2831. {
  2832. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]} ";
  2833. zap++;
  2834. }
  2835. else if (raspr[i, j] == 9999)
  2836. {
  2837. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999} ";
  2838. zap++;
  2839. }
  2840. else
  2841. {
  2842. itog[i, j] = $"{arr[i, j]} ";
  2843. }
  2844. Console.Write($"{itog[i, j]} ");
  2845. }
  2846. Console.WriteLine();
  2847. }
  2848. goto metka; // опять проверка на оптимальность
  2849. }
  2850. else
  2851. {
  2852. Console.WriteLine();
  2853. Console.WriteLine("Решение оптимальное:");
  2854. max = uint.MinValue; // Максимальное значение
  2855. for (int i = 0; i < arr.GetLength(0); i++) // поиск максимального и преобразование по формуле Maxl+1-A
  2856. {
  2857. for (int j = 0; j < arr.GetLength(1); j++)
  2858. {
  2859. if (arr[i, j] > max)
  2860. {
  2861. max = arr[i, j];
  2862. }
  2863. }
  2864. }
  2865. max = max + 1;
  2866. for (int i = 0; i < arr.GetLength(0); i++)
  2867. {
  2868. for (int j = 0; j < arr.GetLength(1); j++)
  2869. {
  2870. arr[i, j] = max - arr[i, j]; // преобразование по формуле Maxl+1-A
  2871. }
  2872. }
  2873. Console.WriteLine("\nОбратное преобразование матрицы:"); // вывод преобразованной таблицы
  2874. for (int i = 0; i < itog.GetLength(0); i++)
  2875. {
  2876. for (int j = 0; j < itog.GetLength(1); j++)
  2877. {
  2878. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  2879. {
  2880. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  2881. zap++;
  2882. }
  2883. else if (raspr[i, j] == 9999)
  2884. {
  2885. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999}";
  2886. zap++;
  2887. }
  2888. else
  2889. {
  2890. itog[i, j] = $"{arr[i, j]} ";
  2891. }
  2892. Console.Write($"{itog[i, j]} ");
  2893. }
  2894. Console.WriteLine();
  2895. }
  2896. F = 0;//подсчет и вывод целевой функции
  2897. for (int i = 0; i < raspr.GetLength(0); i++)
  2898. {
  2899. for (int j = 0; j < raspr.GetLength(1); j++)
  2900. {
  2901. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  2902. {
  2903. F += raspr[i, j] * arr[i, j];
  2904. }
  2905. }
  2906. }
  2907. Console.WriteLine($"\nF = {F} у.д.е");
  2908. }
  2909. // повтор выполнения программы
  2910. while (true)
  2911. {
  2912. try
  2913. {
  2914. Console.Write("\nХотите повторить выполнение программы?\nЕсли да, то нажмите на кнопку Y(на англ) на клавиатуре\nЕсли нет, то можете нажать на любую другую кнопку\nОтвет: ");
  2915. otv = Convert.ToChar(Console.ReadLine());
  2916. break;
  2917. }
  2918. catch
  2919. {
  2920. Console.WriteLine("Введены некорректные данные!");
  2921. }
  2922. }
  2923. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  2924. {
  2925. Console.WriteLine("Программу выполнила студентка группы 31П\nЛебедева Александра Федоровна");
  2926. break;
  2927. }
  2928. else
  2929. {
  2930. Console.Clear();
  2931. }
  2932. }
  2933. }
  2934. }
  2935. }
  2936. */
  2937. // ЗАДАЧА 33П!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2938. /*
  2939. // ГЛАВНЫЙ МЕТОД
  2940. using System;
  2941. using System.Collections.Generic;
  2942. using System.Diagnostics;
  2943. using System.Linq;
  2944. using System.Windows.Forms;
  2945. namespace МЭ_вар2
  2946. {
  2947. public class Program
  2948. {
  2949. public static List<User_income> user_income = new List<User_income>();
  2950. static void Main(string[] args)
  2951. {
  2952. Console.WriteLine("Введите начальную сумму");
  2953. User user = new User(Convert.ToInt32(Console.ReadLine()));
  2954. User_contribution contribution = new User_contribution(user.money);
  2955. for (int i = 1; i <= user.month; i++)
  2956. {
  2957. contribution.all_money += contribution.Get_persentMoney();
  2958. if (i == user.month)
  2959. {
  2960. Console.WriteLine($"Итого");
  2961. Console.WriteLine($"{contribution.all_money} % - {contribution.percent}");
  2962. }
  2963. else
  2964. {
  2965. Console.WriteLine($"Месяц {i}");
  2966. Console.WriteLine($"{contribution.all_money} % - {contribution.percent}");
  2967. Console.WriteLine("_________________________________");
  2968. }
  2969. if (i % 3 == 0)
  2970. {
  2971. contribution.Update_percent();
  2972. }
  2973. }
  2974. Console.WriteLine("Расчитать максимальный максимальный доход при вложении до 1.000.000?");
  2975. sw:
  2976. switch (Console.ReadLine().ToLower())
  2977. {
  2978. case "да":
  2979. Console.Clear();
  2980. Get_maxIncome();
  2981. break;
  2982. case "нет":
  2983. Console.Clear();
  2984. break;
  2985. default:
  2986. Console.MoveBufferArea(0, 38, Console.BufferWidth, 1, Console.BufferWidth, 38, ' ', Console.ForegroundColor, Console.BackgroundColor);
  2987. Console.SetCursorPosition(0, 38);
  2988. goto sw;
  2989. break;
  2990. }
  2991. Console.ReadKey();
  2992. }
  2993. public static void Get_maxIncome()
  2994. {
  2995. TextWriterTraceListener tr2 = new TextWriterTraceListener(System.IO.File.CreateText("../../../Output.txt"));
  2996. Debug.Listeners.Add(tr2);
  2997. for (int i = 50000; i <= 1000000; i += 1000)
  2998. {
  2999. User user = new User(i);
  3000. User_contribution contribution = new User_contribution(user.money);
  3001. for (int m = 1; m <= user.month; m++)
  3002. {
  3003. contribution.all_money += contribution.Get_persentMoney();
  3004. if (i % 3 == 0)
  3005. {
  3006. contribution.Update_percent();
  3007. }
  3008. }
  3009. user_income.Add(new User_income(user.money, contribution.all_money));
  3010. }
  3011. var income = user_income.OrderByDescending(u => u.end_money);
  3012. Console.WriteLine($"\nмаксимальный доход -------- начальная сумма - {income.First().start_money}, конечная сумма - {income.First().end_money}");
  3013. Debug.WriteLine($"\nмаксимальный доход -------- начальная сумма - {income.First().start_money}, конечная сумма - {income.First().end_money}");
  3014. Debug.Flush();
  3015. }
  3016. }
  3017. }
  3018. //КЛАСС 1 User
  3019. using System;
  3020. using System.Collections.Generic;
  3021. using System.Linq;
  3022. using System.Text;
  3023. using System.Threading.Tasks;
  3024. namespace МЭ_вар2
  3025. {
  3026. public class User
  3027. {
  3028. public int money{ get; set; }
  3029. public int month { get; set; } = 12;
  3030. public User(int money)
  3031. {
  3032. this.money = money;
  3033. }
  3034. }
  3035. }
  3036. //КЛАСС 2 User_contribution
  3037. using System;
  3038. using System.Collections.Generic;
  3039. using System.Linq;
  3040. using System.Text;
  3041. using System.Threading.Tasks;
  3042. namespace МЭ_вар2
  3043. {
  3044. public class User_contribution
  3045. {
  3046. public double all_money { get; set; }
  3047. public double percent_money { get; set; }
  3048. public int tax{ get; set; } = 0;
  3049. public double percent { get; set; }
  3050. private double percent_bank = 8.0;
  3051. public User_contribution(int all_money)
  3052. {
  3053. this.all_money = all_money;
  3054. if(all_money < 700000)
  3055. {
  3056. percent = all_money / 50000 + 1;
  3057. }
  3058. else
  3059. {
  3060. int s = all_money - 700000;
  3061. percent = 20 - s / 50000;
  3062. }
  3063. if(percent > percent_bank + 5)
  3064. {
  3065. tax = 30;
  3066. }
  3067. }
  3068. public double Get_persentMoney()
  3069. {
  3070. double m = Math.Round(percent * all_money / 100,2);
  3071. return m - Math.Round(tax * m / 100,2);
  3072. }
  3073. public void Update_percent()
  3074. {
  3075. percent += 0.5;
  3076. if (percent > percent_bank + 5)
  3077. {
  3078. tax = 30;
  3079. }
  3080. }
  3081. }
  3082. }
  3083. // КЛАСС 3 User_income
  3084. using System;
  3085. using System.Collections.Generic;
  3086. using System.Linq;
  3087. using System.Text;
  3088. using System.Threading.Tasks;
  3089. namespace МЭ_вар2
  3090. {
  3091. public class User_income
  3092. {
  3093. public double start_money { get; set; }
  3094. public double end_money { get; set; }
  3095. public User_income(double start_money, double end_money)
  3096. {
  3097. this.start_money = start_money;
  3098. this.end_money = end_money;
  3099. }
  3100. }
  3101. }
  3102. // ТЕСТЫ
  3103. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3104. using System;
  3105. using МЭ_вар2;
  3106. namespace UnitTestProject
  3107. {
  3108. [TestClass]
  3109. public class UnitTest1
  3110. {
  3111. [TestMethod]
  3112. public void TestGetPercentMoney()
  3113. {
  3114. var cont = new User_contribution(750000);
  3115. double result = cont.Get_persentMoney();
  3116. double expected = 99750;
  3117. Assert.AreEqual(expected, result);
  3118. }
  3119. [TestMethod]
  3120. public void TestTax()
  3121. {
  3122. var cont = new User_contribution(750000);
  3123. int result = cont.tax;
  3124. int expected = 30;
  3125. Assert.AreEqual(expected, result);
  3126. }
  3127. }
  3128. }
  3129. */