Criei esse projeto para fornecer uma implementação em C# do algoritmo Simplex, amplamente utilizado em programação linear para resolver problemas de otimização.
Observações:
- Simplex é um dos vários Solvers.
- Já existe em C#, encontrei este: Learn Microsoft - SimplexSolverClass
- Ele não tem pacotes instalados, exceto xUnit para testes.
Referência principal foi do livro: Pesquisa Operacional para os cursos de Economia, Administração e Ciência Contábeis por Ermes Medeiros da Silva.
Explicação resumida de como funciona:
- Formula o problema.
- Define um modelo matemático.
- Variáveis de decisão.
- Função objetivo.
- Restrições.
O algoritmo Simplex:
- Transforma as inequações em equações, adicionando variáveis de folga ou excesso.
- Constrói a tabela Simplex inicial.
- Faz Teste de Otimalidade.
- Repetindo alguns passos até ter uma solução ótima.
- Identifica a variável que entrará na base (variável de entrada).
- Identifica a variável que sairá da base (variável de saída).
- Atualiza a tabela Simplex.
Crie o modelo:
var model = new Model("nome_modelo");
// Adiciona variáveis de decisão
model.AddVariable("x1");Depois atribua numa variável os coeficientes de cada variável de decisão.
var objectiveCoefficients = new Dictionary<string, double>
{
{ "x1", 3 },
{ "x2", 2 }
};
// Adicione a função objetivo junto com os coeficientes das variáveis de decisão
model.SetObjective(objectiveCoefficients, ObjectiveType.Maximize);Adicione as restrições:
var restrictionsCoefficients = new Dictionary<string, double>
{
{ "x1", 1.0 },
{ "x2", 1.0 }
};
// Adicione a restrição no modelo
model.AddRestriction("nome_restricao", restrictionsCoefficients, RestrictionType.LessThanOrEqual, 100.0);Depois de criar o modelo, você pode usar o solver para encontrar a solução ótima:
model.Solve();Esse é o básico, cada objeto possui mais métodos e propriedades para manipular o modelo conforme necessário.
- Quero criar um arquivo de configuração, ou algo do tipo que seja mais friendly para inserir o modelo matemático.
- Estou pensando se vale a pena criar uma interface gráfica simples para facilitar o uso do solver.
- Talvez criar outros solvers, mas não acho que farei isso.