Implementação do Método Simplex usando tableau, com versão Duas Fases (Fase 1 com artificiais e pré-ajuste ortodoxo) e geração/validação de certificados de otimalidade, inviabilidade e ilimitabilidade.
Simplex/
├─ src/
│ ├─ Simplex.jl # Solver CLI (lê entrada, resolve e escreve saída)
│ └─ Certificador.jl # Verifica, no terminal, os certificados (provas)
└─ examples/
├─ entrada/ # Arquivos de entrada (example01.txt … example12.txt)
├─ gabaritos/ # Saídas de referência do enunciado
└─ saida/ # Saídas geradas pelo solver (sol_exampleXX.txt)
Arquivos em examples/entrada/ seguem:
n m
c1 c2 … cm
a1,1 a1,2 … a1,m b1
a2,1 a2,2 … a2,m b2
…
an,1 an,2 … an,m bn
Interpretação: maximizar c^T x, sujeito a A x = b e x ≥ 0. A e b podem conter valores negativos (o solver usa Duas Fases quando necessário).
Executar um arquivo de entrada e gravar a respectiva saída:
julia .\src\Simplex.jl .\examples\entrada\example01.txt .\examples\saida\sol_example01.txtExecutar em lote todos os arquivos de examples/entrada:
$inDir = '.\examples\entrada'
$outDir = '.\examples\saida'
Get-ChildItem $inDir -Filter 'example*.txt' | Sort-Object Name | ForEach-Object {
$name = $_.BaseName
$in = $_.FullName
$out = Join-Path $outDir ("sol_" + $name + ".txt")
julia '.\src\Simplex.jl' $in $out
}Pré-requisito: ter o Julia instalado e disponível no PATH.
Executar um arquivo de entrada e gravar a respectiva saída:
julia ./src/Simplex.jl ./examples/entrada/example01.txt ./examples/saida/sol_example01.txtExecutar em lote todos os arquivos de examples/entrada:
for f in ./examples/entrada/example*.txt; do
name=$(basename "$f" .txt)
out="./examples/saida/sol_${name}.txt"
julia ./src/Simplex.jl "$f" "$out"
doneO solver escreve um arquivo de texto com uma linha de status e, quando aplicável, o valor de z:
- Ótimo: primeira linha
otimae segunda linha comz(3 casas decimais) - Inviável: primeira linha
inviavel - Ilimitado: primeira linha
ilimitada - Erro: primeira linha
erro
Observação: Para conferir certificados detalhados (y ou direção d) e checagens numéricas (Ax≈b, A' y≈c, etc.), utilize o Certificador abaixo.
O script src/Certificador.jl lê a entrada, resolve o problema e imprime no terminal a verificação do certificado correspondente:
- Ótimo: verifica primal (Ax=b, x≥0), dual (A' y ≥ c) e dualidade forte (|c·x − b·y|≃0)
- Inviável: aceita A' y ≥ 0 e b·y < 0 ou A' y ≤ 0 e b·y > 0
- Ilimitado: verifica A d = 0, d ≥ 0 e c·d > 0
Exemplos de uso:
# Ótimo
julia .\src\Certificador.jl .\examples\entrada\example01.txt
# Inviável
julia .\src\Certificador.jl .\examples\entrada\example05.txt
# Ilimitado
julia .\src\Certificador.jl .\examples\entrada\example12.txtNo Linux/Ubuntu 20.04:
# Ótimo
julia ./src/Certificador.jl ./examples/entrada/example01.txt
# Inviável
julia ./src/Certificador.jl ./examples/entrada/example05.txt
# Ilimitado
julia ./src/Certificador.jl ./examples/entrada/example12.txt- O solver utiliza Duas Fases automaticamente quando não há base identidade evidente ou quando b possui componentes negativas.
- As operações de álgebra linear (transpor, produto, resolução de sistemas) são implementadas em
src/Simplex.jl(Gauss-Jordan com pivotamento parcial). - As saídas em
examples/saida/podem ser comparadas comexamples/gabaritos/(status/valores). Para uma checagem completa dos certificados, use o Certificador.
Davi Oliveira Sad — Pesquisa Operacional (TP2)