Ejemplo n.º 1
0
        /*  Конструктор  на  основе  задачи,  */
        public SimplexMethodM1(Task a1, Zadacha f1)
        {
            SimplexTableM table;
            double        s = 0;

            a  = new List <List <double> >();
            b  = new List <double>();
            c  = new List <double>();
            m  = a1.b.Count;
            n  = a1.c.Count;
            n1 = n + m;
            List <double> u = new List <double>();

            for (int i = 0; i < m; i++)
            {
                u = new List <double>();
                b.Add(a1.b[i]);
                for (int j = 0; j < n; j++)
                {
                    u.Add(a1.a[i][j]);
                }
                a.Add(u);
            }
            for (int i = 0; i < n; i++)
            {
                c.Add(a1.c[i]);
                c1.Add(0);
            }
            f  = f1;
            z  = 0;
            z1 = 0;
            for (int i = 0; i < m; i++)
            {
                z1 = z1 + b[i];
            }
            z1 = z1 * ((f == Zadacha.Max) ? -1 : 1);
            for (int i = 0; i < m; i++)
            {
                c.Add(0);
                c1.Add(f == Zadacha.Max ? -1 : 1);
                Cb.Add(0);
                Cb1.Add(f == Zadacha.Max ? -1 : 1);
                basis.Add(n + i);
                for (int j = 0; j < m; j++)
                {
                    a[i].Add((i == j) ? 1 : 0);
                }
            }
            for (int i = 0; i < n1; i++)
            {
                x.Add(0);
                delta.Add(-1 * c[i]);
            }
            for (int i = 0; i < n; i++)
            {
                s = 0;
                for (int j = 0; j < m; j++)
                {
                    s = s + a[j][i];
                }
                delta1.Add((f == Zadacha.Max?-1:1) * s);
            }
            for (int i = 0; i < m; i++)
            {
                delta1.Add(0);
            }
            for (int i = 0; i < n; i++)
            {
                name.Add(string.Format("x{0}", i + 1));
            }
            for (int i = 0; i < m; i++)
            {
                name.Add(string.Format("y{0}", i + 1));
            }
            table = new SimplexTableM(
                a, b, Cb, Cb1, name, basis, m1, delta, delta1, z, z1);
            steps.Add(table);
            CreateSolution();
        }
Ejemplo n.º 2
0
        /* Решение задачи, */
        private void CreateSolution()
        {
            int           i1 = 0;
            int           j1 = 0;
            int           k  = 0;
            SimplexTableM table;

            while (!IsOptimal() && IsExists() == Solution.Exists)
            {
                j1 = ResolvingColumn();
                i1 = ResolvingRow(j1);
                k  = steps.Count;
                steps[k - 1].ResolvingRowColumn(i1, j1);
                NewSimplexTable(i1, j1);
                information1.Add(string.Format(
                                     "Из базиса выводится переменная {0} и " +
                                     "в базис вводится переменная {1}, ",
                                     name[basis[i1]], name[j1]));
                basis[i1] = j1;
                Cb[i1]    = c[j1];
                Cb1[i1]   = c1[j1];
                if (m1 == 2)
                {
                    m1 = 1;
                    for (int i = 0; i < n1; i++)
                    {
                        if (f == Zadacha.Max && delta1[i] < 0 ||
                            f == Zadacha.Min && delta1[i] > 0)
                        {
                            m1 = 2;
                            break;
                        }
                    }
                }
                table = new SimplexTableM(
                    a, b, Cb, Cb1, name, basis, m1, delta, delta1, z, z1);
                steps.Add(table);
            }
            solution = IsExists();
            if (solution == Solution.Exists)
            {
                information = string.Format(
                    "Z{0}={1}, \r\nколичество шагов решения {2}, ",
                    (f == Zadacha.Max) ? "max" : "min",
                    z, steps.Count);
                information1.Add("Получено оптимальное решение,");
                for (int i = 0; i < m; i++)
                {
                    x[basis[i]] = b[i];
                }
            }
            else
            {
                information = "Задача не имеет решения, так как " +
                              " функция не ограничена на многограннике решений, ";
                information1.Add(
                    "В столбце, который может быть  разрешающим, " +
                    " все элементы  неположительны, " +
                    " то есть отрицательны или равны 0, " +
                    "задача не имеет решения,");
            }
        }