static void Main(string[] args) { FirstBasis transpMatr = new FirstBasis(); tm = transpMatr.Initialize(); Potencials potencMatr = new Potencials(transpMatr.tm); // создаем переменную класса Loop для работы с циклом Loop lo = new Loop(); // создаем переменную класса Statistics для подсчета // омеги, Zожидаемого, Z, и k Statistics Statis = new Statistics(); TranspMass.Gamma = -1; Console.Clear(); //lo.Vyvod(transpMatr.tm); List <CirlcleType> tree = new List <CirlcleType>(); Kords koord = new Kords(); int kol = 1; koord = potencMatr.DetermCoef(tm); while (TranspMass.Gamma < 0) { Console.WriteLine("План №{0} Новые точки цикла {1} {2}", kol++, koord.i, koord.j); tree = lo.Circle(koord.i, koord.j, transpMatr.tm); if (tree[0].flag == false) { Console.WriteLine("Невозможно построить цикл, в данном плане"); break; } lo.Vyvod(transpMatr.tm); Statis.CountZ(transpMatr.tm, transpMatr.tm.GetLength(0), transpMatr.tm.GetLength(1)); NewPlan plan = new NewPlan(transpMatr.tm, tree); transpMatr.tm = plan.UpdatePlan(); // второй раз выводится таблица уже с перемещенным минимумом в точку начала цикла Statis.OutParametr(); lo.ClearSign(transpMatr.tm); while (Console.ReadKey().Key != ConsoleKey.Enter) { } koord = potencMatr.DetermCoef(tm); } Console.WriteLine("План №{0}", kol); lo.Vyvod(transpMatr.tm); Statis.CountZ(transpMatr.tm, transpMatr.tm.GetLength(0), transpMatr.tm.GetLength(1)); Console.WriteLine("Z = {0}", TranspMass.Z); Console.WriteLine("Конец программы, для выхода нажмите Esc"); while (Console.ReadKey().Key != ConsoleKey.Escape) { } }
//Работает. Вычисляет коэффициенты и потенциалы текущего плана. public Kords DetermCoef(TranspMass[,] t) { Array.Clear(TranspMass.coefA, 0, TranspMass.coefA.Length); Array.Clear(TranspMass.coefB, 0, TranspMass.coefB.Length); for (int i = 0; i < t.GetLength(0); i++) { for (int j = 0; j < t.GetLength(1); j++) { t[i, j]._potencial = null; } } TranspMass.coefA[0] = 0; int cA = 1; int cB = 0; //Console.WriteLine("Коорд.[{0},{1}] coefA[{2}] = {3}", 0, 0, 0, TranspMass.coefA[0]); //Проход по матрице происходит, пока не будут заполены все коэффициенты while (cA != tm.GetLength(0) || cB != tm.GetLength(1)) { for (int i = 0; i < tm.GetLength(0); i++) { for (int j = 0; j < tm.GetLength(1); j++) { if (tm[i, j]._basis != null) //Условие вычисления новых коэффициетов транспортной задачи { if (TranspMass.coefA[i] != null & TranspMass.coefB[j] == null) //Если известен только один коэффициент, то вычисляет второй { TranspMass.coefB[j] = tm[i, j]._price - TranspMass.coefA[i]; // Console.WriteLine("Коорд.[{0},{1}] coefB[{2}] = {3}", i, j, i, TranspMass.coefB[j]); cB++; } else if (TranspMass.coefB[j] != null & TranspMass.coefA[i] == null) { TranspMass.coefA[i] = tm[i, j]._price - TranspMass.coefB[j]; // Console.WriteLine("Коорд.[{0},{1}] coefA[{2}] = {3}", i, j, j, TranspMass.coefA[i]); cA++; } } } } } TranspMass.Gamma = null; Kords omega = new Kords(); //Расставляет потенциалы по плану for (int i = 0; i < tm.GetLength(0); i++) { for (int j = 0; j < tm.GetLength(1); j++) { if (tm[i, j]._basis == null) { tm[i, j]._potencial = TranspMass.coefA[i] + TranspMass.coefB[j]; //Console.WriteLine("Потенциал на коорд.[{0},{1}] = {2}", i, j, tm[i,j]._potencial); } else { tm[i, j]._potencial = tm[i, j]._price; } } } //Вычисляет первое значение разности потенциала и цены int i1 = tm.GetLength(0) - 1; int j1 = tm.GetLength(1) - 1; while (TranspMass.Gamma == null) { if (tm[i1, j1]._basis == null) { TranspMass.Gamma = tm[i1, j1]._price - tm[i1, j1]._potencial; //Console.WriteLine("max на коорд.[{0},{1}] = {2}", i1, j1, tm[i1, j1]._potencial); omega.i = i1; omega.j = j1; } j1--; } //Вычисляет минимальную разность цены и потенциала на плане //Ставит значение выходных координат в null при отсутствии отрицательной разности for (j1 = tm.GetLength(1) - 1; j1 >= 0; j1--) { //Организуется цикл с неимененным значением j1, чтобы не проходить уже пройденное расстояние дважды for (i1 = tm.GetLength(1) - 1; i1 >= 0; i1--) { if (tm[i1, j1]._price - tm[i1, j1]._potencial <= TranspMass.Gamma) { TranspMass.Gamma = tm[i1, j1]._price - tm[i1, j1]._potencial; omega.i = i1; omega.j = j1; } } } //Console.WriteLine("омега = {0}, на координатах [{1}, {2}]",TranspMass.Gamma, omega.i, omega.j); //Console.ReadKey(); if (TranspMass.Gamma < 0) { return(omega); } else { return(null); } }