Exemple #1
0
        private void ImprimirSolucao()
        {
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("");

            int linhas  = Problema.GetLength(0);
            int colunas = Problema.GetLength(1);

            ColocarEspacamento("");

            for (int i = 1; i <= TamanhoFuncaoObjetiva; i++)
            {
                var caracter = $"x{i}";
                Console.Write(caracter);
                ColocarEspacamento(caracter);
            }

            for (int i = 0; i < LetrasNaBase.GetLength(0); i++)
            {
                var caracter = LetrasNaBase[i, 0];
                Console.Write(caracter);
                ColocarEspacamento(caracter);
            }
            Console.Write("L");
            Console.WriteLine("");

            for (int linha = 0; linha < linhas; linha++)
            {
                var letra = linha + 1 > TamanhoFuncaoObjetiva ? "Z" : $"{LetrasNaBase[linha, 0]}";
                Console.Write(letra);
                ColocarEspacamento(letra);

                for (int coluna = 0; coluna < colunas; coluna++)
                {
                    var caracter = Problema[linha, coluna];
                    Console.Write(caracter);
                    ColocarEspacamento(caracter);
                }
                Console.WriteLine("");
            }

            Console.WriteLine($"\n\n### VARIÁVEIS BÁSICAS:");

            for (int i = 0; i < QuantidaDeRestricoes; i++)
            {
                Console.WriteLine($"\t\t{LetrasNaBase[i, 0]} = {Problema[i, QuantidaDeRestricoes + TamanhoFuncaoObjetiva]}");
            }

            Console.WriteLine($"\n### SOLUÇÃO ÓTIMA: Z = {Problema[QuantidaDeRestricoes, QuantidaDeRestricoes + TamanhoFuncaoObjetiva]}");
        }
Exemple #2
0
        private void ImprimirTabela()
        {
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("");

            int linhas  = Problema.GetLength(0);
            int colunas = Problema.GetLength(1);

            ColocarEspacamento("");

            for (int i = 1; i <= TamanhoFuncaoObjetiva; i++)
            {
                var caracter = $"x{i}";
                Console.Write(caracter);
                ColocarEspacamento(caracter);
            }

            for (int i = 0; i < LetrasNaBase.GetLength(0); i++)
            {
                var caracter = LetrasNaBase[i, 0];
                Console.Write(caracter);
                ColocarEspacamento(caracter);
            }
            Console.Write("L");
            Console.WriteLine("");

            for (int linha = 0; linha < linhas; linha++)
            {
                var letra = linha + 1 > TamanhoFuncaoObjetiva ? "Z" : $"{LetrasNaBase[linha, 0]}";
                Console.Write(letra);
                ColocarEspacamento(letra);

                for (int coluna = 0; coluna < colunas; coluna++)
                {
                    var caracter = Problema[linha, coluna];
                    Console.Write(caracter);
                    ColocarEspacamento(caracter);
                }
                Console.WriteLine("");
            }


            Console.WriteLine("\n\n\t### PRÓXIMA ITERAÇÃO ###");
        }
Exemple #3
0
        private void ResolverComMinimizacao()
        {
            double menorNegativo         = 0;
            int    linhaMenorNegativoEmL = -1;

            //procurando o menor valor negativo na coluna L
            for (int i = 0; i < Problema.GetLength(0) - 1; i++)
            {
                double valor = Problema[i, QuantidaDeRestricoes + TamanhoFuncaoObjetiva];
                if (valor < menorNegativo)
                {
                    menorNegativo         = valor;
                    linhaMenorNegativoEmL = i;
                }
            }

            //se a posicao for -1, não achou número negativo e está pronto
            if (linhaMenorNegativoEmL == -1)
            {
                ImprimirSolucao();
                return;
            }

            //  Identificando a linha que conterá o pivô, dividindo os elementos em Z pelos elementos do termo independente (coluna L)
            //  na coluna que teve o menor valor negativo
            double menorValorEmZDivididoPeloElementoNaLinhaSelecionada = Double.MaxValue;
            int    colunaQueContemOPivo = -1;
            double pivo = -1;

            for (int i = 0; i < QuantidaDeRestricoes; i++)
            {
                double valor     = Problema[linhaMenorNegativoEmL, i];
                double elementoZ = Problema[QuantidaDeRestricoes, i];
                double resultado = Math.Abs(elementoZ / valor);

                if (resultado < menorValorEmZDivididoPeloElementoNaLinhaSelecionada)
                {
                    menorValorEmZDivididoPeloElementoNaLinhaSelecionada = resultado;
                    colunaQueContemOPivo = i;
                    pivo = valor;
                }
            }

            ImprimirTabela();

            //armazenando a letra ou variavel que está entrando na base
            if (colunaQueContemOPivo - TamanhoFuncaoObjetiva >= 0)
            {
                LetrasNaBase[linhaMenorNegativoEmL, 0] = Alfabeto.Letras[colunaQueContemOPivo - TamanhoFuncaoObjetiva];
            }
            else
            {
                LetrasNaBase[linhaMenorNegativoEmL, 0] = $"x{colunaQueContemOPivo + 1}";
            }

            // dividindo a linha que contém o pivo, para que ele fique igual a 1.
            for (int i = 0; i < Problema.GetLength(1); i++)
            {
                double aux = Problema[linhaMenorNegativoEmL, i];
                Problema[linhaMenorNegativoEmL, i] = Math.Round(aux / pivo, 3);
            }

            // Aplicando o Gauss para as outras linhas
            for (int i = 0; i <= QuantidaDeRestricoes; i++)
            {
                if (i != linhaMenorNegativoEmL)
                {
                    //valor que será utilizado para zerar o elemento da mesma coluna do pivô
                    double aux = Problema[i, colunaQueContemOPivo] * -1;
                    for (int j = 0; j < Problema.GetLength(1); j++)
                    {
                        double elementoDaLinhaDoPivo = Problema[linhaMenorNegativoEmL, j];

                        Problema[i, j] += aux * elementoDaLinhaDoPivo;
                    }
                }
            }

            ResolverComMinimizacao();
        }
Exemple #4
0
        private void ResolverComMaximizacao()
        {
            double menorNegativo = 0;
            int    posicaoColunaDoMenorNegativoEmZ = -1;

            //procurando o menor valor negativo em Z
            for (int i = 0; i < Problema.GetLength(1); i++)
            {
                double valor = Problema[QuantidaDeRestricoes, i];
                if (valor < menorNegativo)
                {
                    menorNegativo = valor;
                    posicaoColunaDoMenorNegativoEmZ = i;
                }
            }

            //se a posicao for -1, não achou número negativo e está pronto
            if (posicaoColunaDoMenorNegativoEmZ == -1)
            {
                ImprimirSolucao();
                return;
            }

            //  Identificando a linha que conterá o pivô, dividindo os elementos do termo independente (coluna L) pelos
            //  elementos na mesma linha e na coluna que teve o menor valor negativo em Z
            double menorValorPositivoDaColunaLimiteDivididoPeloElementoNaColunaSelecionada = Double.MaxValue;
            int    linhaQueContemOPivo = -1;
            double pivo = -1;

            for (int i = 0; i < QuantidaDeRestricoes; i++)
            {
                double valor     = Problema[i, posicaoColunaDoMenorNegativoEmZ];
                double colunaL   = Problema[i, TamanhoFuncaoObjetiva + QuantidaDeRestricoes];
                double resultado = colunaL / valor;

                if (resultado > 0 && resultado < menorValorPositivoDaColunaLimiteDivididoPeloElementoNaColunaSelecionada)
                {
                    menorValorPositivoDaColunaLimiteDivididoPeloElementoNaColunaSelecionada = resultado;
                    linhaQueContemOPivo = i;
                    pivo = valor;
                }
            }

            ImprimirTabela();

            //armazenando a letra ou variavel que está entrando na base
            if (posicaoColunaDoMenorNegativoEmZ - TamanhoFuncaoObjetiva >= 0)
            {
                LetrasNaBase[linhaQueContemOPivo, 0] = Alfabeto.Letras[posicaoColunaDoMenorNegativoEmZ - TamanhoFuncaoObjetiva];
            }
            else
            {
                LetrasNaBase[linhaQueContemOPivo, 0] = $"x{posicaoColunaDoMenorNegativoEmZ + 1}";
            }

            // dividindo a linha que contém o pivo, para que ele fique igual a 1.
            for (int i = 0; i < Problema.GetLength(1); i++)
            {
                Problema[linhaQueContemOPivo, i] /= pivo;
            }

            // Aplicando o Gauss para as outras linhas
            for (int i = 0; i <= QuantidaDeRestricoes; i++)
            {
                if (i != linhaQueContemOPivo)
                {
                    //valor que será utilizado para zerar o elemento da mesma coluna do pivô
                    double aux = Problema[i, posicaoColunaDoMenorNegativoEmZ] * -1;
                    for (int j = 0; j < Problema.GetLength(1); j++)
                    {
                        double elementoDaLinhaDoPivo = Problema[linhaQueContemOPivo, j];
                        Problema[i, j] += aux * elementoDaLinhaDoPivo;
                    }
                }
            }

            ResolverComMaximizacao();
        }