Ejemplo n.º 1
0
        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)
            {
            }
        }
Ejemplo n.º 2
0
        //Работает. Вычисляет коэффициенты и потенциалы текущего плана.
        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);
            }
        }