public void Otimizar(FObjetivo funcao, Extremo extremo = Extremo.Minimizar)
        {
            Console.WriteLine();
              Console.WriteLine("Quantidade variaveis: {0} Quantidade restricoes: {1}", funcao.Variaveis.Count, funcao.Restricoes.Count);
              Console.WriteLine();
              funcao.Extremo = extremo;

              if (!funcao.Normalizado)
              {
            _swNormalizacao = Stopwatch.StartNew();
            funcao.normalizar();
            _quadro = new Quadro(funcao);
            _swNormalizacao.Stop();
              }

              _qtdIteracoes = 1;
              _historico.Clear();

              //mostrar quadro apos a troca
              //Console.WriteLine(_quadro.ToString());

              _statusSimplex = StatusSimplex.PrimeiraEtapa;

              _swOtimizacao = Stopwatch.StartNew();
              _swtempoIteracao = Stopwatch.StartNew();

              while (_statusSimplex != StatusSimplex.SolucaoIlimitada &&
            _statusSimplex != StatusSimplex.SolucaoOtima &&
            _statusSimplex != StatusSimplex.SolucaoImpossivel)
              {

            _historico.Push(_statusSimplex);

            switch (_statusSimplex)
            {
              case StatusSimplex.PrimeiraEtapa:
            _statusSimplex = this.AlgoritmoPrimeiraEtapa();
            break;

              case StatusSimplex.SegundaEtapa:
            _statusSimplex = this.AlgoritmoSegundaEtapa();
            break;

              case StatusSimplex.AlgoritmoTroca:
            _swtempoIteracao.Stop();
            //if (_qtdIteracoes % 100 == 0)
              Console.WriteLine(string.Format("Linha: {0}\tColuna: {1}\tIteracoes: {2}\tTempo: {3}s", _linhaPerm, _colunaPerm, _qtdIteracoes, _swtempoIteracao.Elapsed.TotalSeconds));
            _swtempoIteracao = Stopwatch.StartNew();
            _statusSimplex = this.AlgoritmoTroca();
            _qtdIteracoes++;
            break;
            }
              }
              //fim otimizacao
              _swOtimizacao.Stop();

              _historico.Push(_statusSimplex);
        }