예제 #1
0
        private void buildMatriz(FObjetivo FuncaoObj)
        {
            //Linha da funcao objetivo
            Matriz[0, 0] = new Celula {
                ValorSuperior = FuncaoObj.TermoLivre
            };

            for (int i = 1; i <= FuncaoObj.Variaveis.Count; i++)
            {
                Matriz[0, i] = new Celula {
                    ValorSuperior = FuncaoObj.Variaveis.ToList()[i - 1].Value.Coeficiente
                };
            }

            int linha = 1;

            foreach (Restricao rest in FuncaoObj.Restricoes.OrderBy(m => m.Key).Select(m => m.Value))
            {
                // Coluna 0 sera o termo livre
                Matriz[linha, 0] = new Celula {
                    ValorSuperior = rest.TermoLivre
                };

                for (int col = 1; col < this.ColunaHeader.Length; col++)
                {
                    var nomeVariavel = this.ColunaHeader[col];
                    Matriz[linha, col] = new Celula
                    {
                        ValorSuperior = rest.Variaveis.ContainsKey(nomeVariavel) ? rest.Variaveis[nomeVariavel].Coeficiente : 0.0
                    };
                }

                linha += 1;
            }
        }
예제 #2
0
        private void buildHeaders(FObjetivo funcaoObj)
        {
            for (int i = 0; i <= ColunaHeader.Length - 1; i++)
            {
                if (i == 0)
                {
                    ColunaHeader[i] = "Bj";
                }
                else
                {
                    ColunaHeader[i] = funcaoObj.Variaveis.ToList()[i - 1].Key;
                }
            }

            for (int i = 0; i <= LinhaHeader.Length - 1; i++)
            {
                if (i == 0)
                {
                    LinhaHeader[i] = "F";
                }
                else
                {
                    LinhaHeader[i] = funcaoObj.VariaveisBasicas.ToList()[i - 1].Key;
                }
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        public GeradorLP(int qtdVariaveis, int qtdRestricoes, int densidadeMatriz)
        {
            _qtdRestricoes = qtdRestricoes;
              _qtdVariaveis = qtdVariaveis;
              _densidadeMatriz = densidadeMatriz;

              _rnd = new Random();
              _funcaoObj = new FObjetivo();
              _variaveis = new List<VariavelCusto>();
        }
예제 #5
0
        //Armazena a celula do elemento permissivel encontrado no decorrer do algoritmo.
        //public Point PermElementoPos { get; set; }
        //Variavel para guardar a posição do elemento permissível quando encontrado.
        public Quadro(FObjetivo FuncaoObj)
        {
            Matriz = new Celula[FuncaoObj.VariaveisBasicas.Count + 1, FuncaoObj.Variaveis.Count + 1];
              ColunaHeader = new string[FuncaoObj.Variaveis.Count + 1];
              //+1 para o Bj
              LinhaHeader = new string[FuncaoObj.VariaveisBasicas.Count + 1];
              //+1 para funcao obj

              buildHeaders(FuncaoObj);

              buildMatriz(FuncaoObj);
        }
예제 #6
0
        //Armazena a celula do elemento permissivel encontrado no decorrer do algoritmo.
        //public Point PermElementoPos { get; set; }
        //Variavel para guardar a posição do elemento permissível quando encontrado.


        public Quadro(FObjetivo FuncaoObj)
        {
            Matriz       = new Celula[FuncaoObj.VariaveisBasicas.Count + 1, FuncaoObj.Variaveis.Count + 1];
            ColunaHeader = new string[FuncaoObj.Variaveis.Count + 1];
            //+1 para o Bj
            LinhaHeader = new string[FuncaoObj.VariaveisBasicas.Count + 1];
            //+1 para funcao obj

            buildHeaders(FuncaoObj);

            buildMatriz(FuncaoObj);
        }
예제 #7
0
        public MPSLPReader(string path, MPSLPReaderConfig config = null)
        {
            if (string.IsNullOrEmpty(path))
            throw new ArgumentNullException("path");

              if (!File.Exists(path))
            throw new IOException("Arquivo nao existe.");

              _path = path;
              _mpsFile = new StreamReader(path, Encoding.UTF8);
              _funcao = new FObjetivo();

              _config = config ?? new MPSLPReaderConfig();
        }
예제 #8
0
        private void buildHeaders(FObjetivo funcaoObj)
        {
            for (int i = 0; i <= ColunaHeader.Length - 1; i++)
              {
            if (i == 0)
            {
              ColunaHeader[i] = "Bj";
            }
            else
            {
              ColunaHeader[i] = funcaoObj.Variaveis.ToList()[i - 1].Key;
            }
              }

              for (int i = 0; i <= LinhaHeader.Length - 1; i++)
              {
            if (i == 0)
            {
              LinhaHeader[i] = "F";
            }
            else
            {
              LinhaHeader[i] = funcaoObj.VariaveisBasicas.ToList()[i - 1].Key;
            }
              }
        }
예제 #9
0
        private void buildMatriz(FObjetivo FuncaoObj)
        {
            //Linha da funcao objetivo
              Matriz[0, 0] = new Celula { ValorSuperior = FuncaoObj.TermoLivre };

              for (int i = 1; i <= FuncaoObj.Variaveis.Count; i++)
              {
            Matriz[0, i] = new Celula { ValorSuperior = FuncaoObj.Variaveis.ToList()[i - 1].Value.Coeficiente };
              }

              int linha = 1;

              foreach (Restricao rest in FuncaoObj.Restricoes.OrderBy(m => m.Key).Select(m => m.Value))
              {
            // Coluna 0 sera o termo livre
            Matriz[linha, 0] = new Celula { ValorSuperior = rest.TermoLivre };

            for (int col = 1; col < this.ColunaHeader.Length; col++)
            {

              var nomeVariavel = this.ColunaHeader[col];
              Matriz[linha, col] = new Celula
              {
            ValorSuperior = rest.Variaveis.ContainsKey(nomeVariavel) ? rest.Variaveis[nomeVariavel].Coeficiente : 0.0
              };

            }

            linha += 1;
              }
        }