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; } }
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; } } }
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); }
public GeradorLP(int qtdVariaveis, int qtdRestricoes, int densidadeMatriz) { _qtdRestricoes = qtdRestricoes; _qtdVariaveis = qtdVariaveis; _densidadeMatriz = densidadeMatriz; _rnd = new Random(); _funcaoObj = new FObjetivo(); _variaveis = new List<VariavelCusto>(); }
//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); }
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(); }