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]}"); }
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 ###"); }
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(); }
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(); }