Revista Tocantinense de Matematica
Vol. 1, n. 1, 2026, p. 1–23
DOI: 10.20873/retmat.uft.v1n1.2026.23236
Recebido: 15 de junho de 2026
Aceito: 22 de junho de 2026
Programação linear utilizando Python na solução do método
simplex
Márcio Dias de Lima 11,*, Aline Mota de Mesquita Assis 21Ricardo da Silva Santos 31,
Iasmin Gabriele Sousa de Oliveira 41, Jair Alcindo Lobo de Melo 52
Resumo
Este estudo destaca a exploração de conceitos básicos de programação linear por meio da
abordagem de resolução de problemas pelo método simplex. Empregando uma metodologia
que combina pesquisa bibliográfica com aplicação prática, o método simplex foi utilizado
para resolver problemas de programação linear tendo como auxílio a linguagem de progra-
mação Python. O objetivo principal foi demonstrar a praticidade e eficiência do método
simplex quando implementado em linguagem de programação, como Python, além de
proporcionar uma compreensão básica da programação linear. Os resultados obtidos foram
satisfatórios, demonstrando que os problemas, quando resolvidos através de linguagem de
programação, foram solucionados de forma mais rápida e com menos cálculos, destacando
a importância da integração entre teoria e prática na resolução de problemas complexos.
Palavras-chave: Programação Linear; Álgebra Linear; Método Simplex; Python
MSC 2020: 90C05; 90C08; 68N19, 15A06
Abstract
This study highlights the exploration of fundamental concepts of linear programming
through the problem-solving approach using the simplex method. Employing a methodology
that combines a bibliographic review with practical application, the simplex method was
utilized to solve linear programming problems with the aid of the Python programming
language. The main objective was to demonstrate the practicality and efficiency of the
simplex method when implemented in a programming language such as Python, in addition
to providing a basic understanding of linear programming. The results obtained were
satisfactory, showing that problems solved using a programming language were resolved
more quickly and with fewer calculations, underscoring the importance of integrating
theory and practice in solving complex problems.
Keywords: Linear Programming; Linear Algebra; Simplex Method; Python
1
Instituto Federal de Educação, Ciência e Tecnologia, Goiânia, Goiás, Brasil. E-mail:
marcio.lima@ifg.edu.br
. ORCID: 0000-0003-2782-386X.
*
Autor correspondente.
1
Instituto Federal
de Educação, Ciência e Tecnologia, Goiânia, Goiás, Brasil. E-mail:
aline.mesquita@ifg.edu.br
. OR-
CID: 0000-0003-3445-5903.1Instituto Federal de Educação, Ciência e Tecnologia, Goiânia, Goiás, Brasil.
E-mail:
ricardo.santos@ifg.edu.br
. ORCID: 0000-0002-8671-0956.
1
Instituto Federal de Educação,
Ciência e Tecnologia, Goiânia, Goiás, Brasil. E-mail:
iasmingabriele46@gmail.com
. ORCID: 0009-
0008-9781-0056.
2
Instituto Federal de Educação, Ciência e Tecnologia, Belém, Pará, Brasil. E-mail:
jair.melo@ifpa.edu.br. ORCID: 0000-0002-7775-2599.
ReTMAT 2
Sumário
1 Introdução 2
2 Contexto histórico 3
3 Formato padrão da programação linear 4
4 O Método Simplex 6
5 Aplicação em Python 11
6 Análise da Eficiência e Rapidez Computacional dos Modelos 16
6.1 Rapidez de Convergência e Complexidade Algorítmica .............. 16
6.2 Eficiência Operacional e Análise de Sensibilidade ................. 16
7 Conclusão 17
A digos em Python 19
A.1 Resolução do Problema da Indústria (Calças e Bermudas) ............ 19
A.2 Resolução do Problema da Campanha Publicitária ................ 20
A.3 Resolução do Problema das Usinas de Energia ................... 21
1 Introdução
Ao longo de toda história é possível ver um grande avanço da matemática que, por sua vez,
coincide com a evolução dos povos, os quais usavam cálculos no comércio, viagens, expansões
territoriais, arquiteturas, navegações e em diversas outras áreas da vida. As sociedades
continuam avançando em suas descobertas e estudos, formando, atualmente, um mundo cada
vez mais tecnológico, tornando, assim, a resolução de problemas, através de softwares, uma
maneira mais rápida e menos suscetível a erros.
Esses avanços foram de grande importância para áreas de estudo como a pesquisa operacional
(PO), que surgiu durante a segunda guerra mundial (1939-1945), na Inglaterra, através de
um grupo de cientistas que tinham o objetivo de planejar estratégias e táticas mais eficientes
visando o aproveitamento máximo de materiais escassos, originando um modelo de solução
denominado método simplex, que, com o fim da guerra, viria a ser útil para facilitar a tomada
de decisões em muitos âmbitos sociais [
8
]. Hoje em dia, sua aplicação pode ser vista em
empresas que visam maximizar o lucro, diminuir os custos e utilizar os materiais de maneira
inteligente, sendo esse, um processo de otimização [
1
], e também pode ser encontrado em
problemas de transporte, fluxo máximo, caminho mínimo, teoria dos jogos [
8
], entre tantas
outras aplicações. Diante de diversas possibilidades, foram criados vários modelos e técnicas
de solução, variando de acordo com a necessidade do problema.
A programação linear é utilizada em problemas que envolvem apenas funções lineares,
uma vez que é um conjunto de técnicas que visa encontrar a solução ótima de um problema
dado [
18
]. Essa abordagem é especialmente útil quando se trata de otimização de recursos
em contextos como planejamento financeiro, logística e produção. Para resolver problemas de
programação linear de forma eficiente, uma das abordagens comuns é utilizar bibliotecas de
otimização, como a biblioteca pulp em Python, que oferece ferramentas para modelagem e
ReTMAT 3
resolução de problemas lineares de maneira simplificada. Essas bibliotecas podem implementar
métodos como o simplex, entre outros, para encontrar a solução ótima.
De acordo com [
7
], devem ser seguidos alguns passos para se resolver um problema de
programação linear, sendo eles, a formulação do problema, modelo matemático, obtenção de
uma solução, teste e a implementação, lembrando que às vezes é preciso fazer a reestruturação
do modelo após a fase de teste.
Durante a fase de obtenção de uma solução, são usados os métodos numéricos, tais como o
método simplex citado anteriormente, o algoritmo de Gauss-Jordan, algoritmo de Yamnitsky-
Levin, que podem ser vistos em [6] e o algoritmo de Pontos Interiores em [15], entre outros.
Desta forma, o objetivo central deste trabalho é apresentar uma aplicação do método
simplex utilizando a linguagem de programação Python, por ser uma linguagem de digo
aberto com sintaxe simples e objetiva, "Python é uma linguagem completa, contando com
bibliotecas para acessar bancos de dados, [...] podemos utilizar muitas funções existentes
escrevendo poucas linhas de digo"[
12
, p.22]. Por essas características, Python se torna um
facilitador no processo de otimização de alguns problemas.
2 Contexto histórico
Desde a antiguidade, o homem busca soluções ótimas para problemas cotidianos e até mesmo
aqueles mais teóricos que não representam fatos concretos da realidade, como Euclides que,
em seu terceiro livro, buscava a distância máxima e mínima de um ponto a uma circunferência.
Com o passar do tempo, veio o surgimento do cálculo e os conceitos de álgebra que puderam
ajudar na resolução de diversos problemas nesse âmbito [5]. Segundo [11, p.5],
A PL poderia ter sido iniciada em torno de 1758 quando os economistas co-
meçaram a descrever sistemas econômicos em termos matemáticos. Também,
Walras propôs em 1874 um sofisticado modelo matemático que tinha como
parte da sua estrutura coeficientes tecnológicos fixados. O famoso matemático
Fourier parece ter sido o primeiro a estudar desigualdades lineares para a
Mecânica e para a Teoria das Probabilidades. Ele estava interessado em
encontrar o ponto mínimo em um poliedro. Ele sugeriu uma solução por
uma descida de vértice em vértice para um mínimo, que é o princípio por
trás do método simplex desenvolvido por Dantzig. Este é provavelmente o
primeiro exemplo, datado de 1826, de um problema de PL. Mais tarde, em
1911, outro matemático famoso, Poussin, considerou o mesmo problema e
propôs uma solução similar.
Além desses matemáticos, teve o russo Leonid V. Kantorovich (1912-1986), um
economista que voltou seus estudos para a área de programação linear, em 1939 chegou
a escrever um livro intitulado Métodos Matemáticos de Organização e Planejamento da
Produção, onde resolve um problema de programação linear, contudo seu reconhecimento
se deu 20 anos após sua publicação [
16
]. O ápice de desenvolvimento da PL se
deu durante a segunda Guerra Mundial com o surgimento da Pesquisa Operacional na
Inglaterra, onde foi montado um grupo com cientistas, físicos e matemáticos, denominado
SCOOP (Scientific Computation of Optimum Programs), em que Dantzig fez seu nome
ao criar o método simplex em 1947 [5].
Em termos atuais, [
7
, p.1] define programação linear (PL) como sendo a “a optimização
(minimização ou maximização) de uma função linear, satisfazendo um conjunto de
equações e/ou inequações (restrições) igualmente lineares. E, para [
18
, p.11], “o termo
‘programação’ significa planejamento e ‘linear’ deixa antever que todas as expressões
matemáticas utilizadas são funções lineares”.
ReTMAT 4
Os problemas da programação linear que envolvem duas ou três variáveis podem ser
resolvidos manualmente pelo método gráfico, mas para resolver problemas de três até
centenas de variáveis, além das inúmeras restrições, são utilizados métodos computaci-
onais, como o método simplex de Dantzig [
3
]. E a eficiência de um método pode ser
avaliada pelo tempo que um algoritmo leva para chegar ao resultado, conforme explica:
Este cálculo é feito associando-se uma unidade de tempo para cada operação
básica que o procedimento executa. Se a dependência do tempo com relação
aos dados de entrada for polinomial, o programa é considerado rápido. Se,
entretanto, a dependência do tempo for exponencial o programa é considerado
lento [9, p.1].
Assim, pode-se dizer que um algoritmo polinomial é aquele que chega ao resultado
esperado em tempo hábil, de tal forma que, quanto menos comandos ou iterações um
algoritmo tem, mais rápido ele é. Logo, a praticidade de um algoritmo também se torna
um fator importante de eficiência. Isso foi importante durante a criação de algoritmos,
pois alguns eram exponenciais e, para tanto, foram criados novos métodos de forma a
encontrar um algoritmo polinomial e prático.
Em [
11
], é possível ver uma linha do tempo dos métodos: o primeiro algoritmo
foi o simplex, criado por Dantzig em 1947; em 1979 e 1980, Khachiyan fez uso do
método dos elipsóides em PL, que esse método havia sido utilizado até então
para programação convexa, em que as funções não são apenas lineares, entretanto, na
década de 70 houve um problema quanto ao uso destes métodos, pois, por um lado, o
simplex tinha complexidade exponencial, mas funcionava bem na prática e o método dos
elipsóides tinha complexidade polinomial, mas funcionava mal na prática. Foi então que,
em 1984, Karmarkar criou o algoritmo de pontos interiores, diminuindo a complexidade
em relação ao método de elipsóides. Em 1986, Renegar provou que o uso do método
de centros de Huard, escrito em termos da função barreira logarítmica, é polinomial
com complexidade igual ao método de Karmarkar e, desde então, foram sendo feitas
adaptações e, também, novos métodos para que o uso do algoritmo pudesse resolver
problemas com enormes quantidades de variáveis e restrições.
Um exemplo dessas adaptações é a forma híbrida do método simplex com algoritmos
de pontos interiores, aplicado em um problema de uma companhia aérea, envolvendo
837 restrições e 12.753.313 variáveis, em que foi utilizado um supercomputador que
solucionou o problema em até 5 minutos, conforme descreve [
2
], mostrando, dessa forma,
que com métodos computacionais é possível resolver problemas muito grandes.
3 Formato padrão da programação linear
De acordo com [
7
], a solução de um Problema de Programação Linear (PPL) segue
diversas etapas, sendo a primeira delas a modelagem do problema. Esta fase é marcada
pela aplicação da Modelagem Matemática, uma vez que a definição de programação
linear envolve a otimização de funções lineares e visa obter as variáveis, as restrições
e a função objetivo. Para uma compreensão mais clara, alguns exemplos podem ser
encontrados em [13].
Uma vez que a modelagem de um problema novo não é o foco deste estudo e a
correspondência entre o sistema real e o modelo formal está propensa a imprecisões,
simplificações e lacunas de comunicação, é importante destacar que não existem técnicas
precisas que garantam o estabelecimento do modelo de um problema. Para alcançar
essa meta, é fundamental empregar a habilidade de análise do problema, conforme é
ReTMAT 5
sugerido em [11].
Matematicamente, podemos definir um PPL conforme [5]:
max/min Z =c1x1+c2x2+···+cnxn,
sujeito a :
a11x1+a12x2+···+a1nxn(,=,)b1,
a21x1+a22x2+· · · +a2nxn(,=,)b2,
.
.
.
am1x1+am2x2+· · · +amnxn(,=,)bm,
x1, x2,· · · , xn0.
onde
Z
é a função objetivo,
c1, c2,· · · , cn
são os coeficientes de custo,
x1, x2,· · · , xn
são
as variáveis e todos os amn são os coeficientes das restrições.
Essa forma também pode ser escrita de maneira matricial, sendo representada na
forma:
max/min Z =cTx,
Sujeito a :
Ax(,=,)b,
x0.
onde Té a transposta da matriz,
c
=
c1
c2
.
.
.
cn
é o vetor coluna dos coeficientes da função objetivo, com dimensão
n×
1.
Consequentemente, cTé um vetor linha com dimensão 1×n;
x=
x1
x2
.
.
.
xn
é o vetor coluna das variáveis de decisão, com dimensão n×1colunas;
A=
a11 a12 · · · a1n
a21 a22 · · · a2n
.
.
..
.
.....
.
.
am1am2· · · amn
é a matriz constituída pelos coeficientes das restrição,
sendo
n
a quantidade de colunas, correspondendo à quantidade de variáveis, e
m
a
quantidade de linhas, correspondendo à quantidade de restrições;
b
=
b1
b2
.
.
.
bm
é o vetor coluna formado pelos termos independentes das restrições, com
dimensão m×1.
ReTMAT 6
As restrições do tipo
podem ser passadas para
por meio da multiplicação por
(1), ou seja,
am1x1+am2x2+· · · +amnxnbm am1x1am2x2 · · · amnxn bm.
Logo, observa-se que
min
(
Z
)
max
(
Z
), que podem ser escritas na forma matricial
e são chamadas de forma canônica da programação linear.
min Z=cTx,
sujeito a:
Ax b,
x0.ou
max Z=cTx,
sujeito a:
Ax b,
x0.
Por outro lado, ao transformar as desigualdades das restrições em igualdades, chega-se
no formato padrão da PL, ainda podendo ser tanto minimizar quanto maximizar.
min/max Z =cTx,
sujeito a :
Ax =b,
x0.
Essa é uma fase importante para se obter a resolução dos problemas em vários
métodos, inclusive o simplex. De maneira básica e prática, para se chegar na forma
padrão de uma PL, serão usadas
xm+n
0como variáveis de folga, que são variáveis
extras, que não estão na função objetivo, e são adicionadas de forma a tornar a função
em uma igualdade. Assim, para desigualdades do tipo
”, elas serão adicionadas,
conforme apresentado no sistema de Equações (1):
a11x1+a12x2+...+a1nxn+xm+1 =b1,
a21x2+a22x2+...+a1nxn+xm+2 =b2,
.
.
.
am1x1+am2x2+...+amnxn+xm+n=bm.
(1)
Entretanto, quando se tem desigualdades do tipo
”, a variável de folga é subtraída.
4 O Método Simplex
Um problema de programação linear busca a otimização de uma certa situação, ou
seja, a maximização ou minimização de uma função objetivo, e este resultado encontrado
é chamado de solução ótima. Entretanto, durante o processo, são encontradas algumas
outras soluções que serão definidas de acordo com a etapa em que cada uma é encontrada
e o método de resolução utilizado. Essas soluções alternativas podem ser relevantes para
entender o comportamento do problema e a eficácia dos métodos utilizados para sua
resolução. Desde sua concepção em 1947, o método simplex tem sido um dos algoritmos
mais amplamente empregados em programação linear, devido à sua capacidade de
simplificar o tratamento de múltiplas variáveis.
ReTMAT 7
Para compreender este método, será utilizado o Problema 1, que é uma adaptação do
Problema apresentado em [
13
, p. 73], cuja resolução será feita com o método simplex,
porém, inicialmente, o problema será resolvido de forma manual, visando descrever os
processos e, em seguida, aplicá-lo em uma linguagem de programação, evidenciando
como a forma computacional pode ser útil para a resolução de problemas de programação
linear, principalmente, através do método simplex.
Problema 1.Uma Indústria fabrica calças e bermudas com as seguintes margens de
contribuição por unidade:
- Margem de Contribuição da Calça: R$7,00;
- Margem de Contribuição da Bermuda: R$4,00.
Estes produtos passam respectivamente pelos departamentos de corte e costura, consu-
mindo, em cada um deles, as seguintes horas:
Tabela 1: Limite de horas na produção.
Departamento de corte Departamento de costura
Calças 5h 3h
Bermudas 3h 2h
Fonte: Elaborado pelos autores.
A capacidade de produção de cada departamento limita-se a 40 horas para o depar-
tamento de corte e 25 horas para o departamento de costura. Os diretores da indústria
desejam saber qual seria a quantidade ideal de calças e bermudas que deveriam ser
produzidas com o intuito de se obter melhor margem de contribuição para a empresa,
de acordo com as restrições existentes em cada um deles.
Para solucionar problemas utilizando o método simplex, é essencial seguir algumas
etapas até alcançar um ponto em que tais passos serão reiterados, visando encontrar a
solução ótima, conforme aponta [10] e [14], e detalha-se a seguir.
A resolução ocorre somente com o uso de tabelas, onde as informações necessárias
para a solução do problema são separadas e organizadas. Nelas são feitas operações
entre linhas, criando tabelas equivalentes até chegar à solução ótima. O primeiro passo,
então, será colocar o problema na forma padrão, em que são adicionadas as variáveis
de folgas a cada restrição (nesse caso:
x3
e
x4
), transformando todas as inequações em
equações. Logo, temos:
max Z = 7x1+ 4x2,
sujeito a :
5x1+ 3x2+x3= 40,
3x1+ 2x2+x4= 25,
xi0, i = 1,2,3,4.
A função objetivo será rearranjada para que todos os elementos estejam de um único
lado da equação, resultando em
Z
7
x1
4
x2
= 0 e, em seguida, ficará com as outras
equações formando o sistema (S) descrito a seguir:
ReTMAT 8
(S) :
Z7x14x2= 0,
5x1+ 3x2+x3= 40,
3x1+ 2x2+x4= 25,
xi0, i = 1,2,3,4.
O próximo passo é encontrar uma solução básica viável, em que serão selecionadas
variáveis para serem igualadas a zero, obtendo, assim, valores não nulos para as demais.
As variáveis que serão igualadas a zero são chamadas de não básicas, enquanto as que
sobrarem serão as variáveis básicas, ou seja, elas vão ter valores não nulos. Para uma
solução inicial, as variáveis originais do problema serão designadas como as não básicas.
Com base nisso, pode-se criar a Tabela 2:
Tabela 2: Valores iniciais do método simplex.
Linha Variáveis Básicas x1x2x3x4b
1x35 3 1 0 40
2x43 2 0 1 25
3 Z 74 0 0 0
Fonte: Elaborada pelos autores.
Como
x1
=
x2
= 0 por serem variáveis não básicas, teremos, então
x3
= 40 e
x4
= 25,
como pode ser observado na Tabela 2, e aplicando esses valores na função objetivo,
tem-se um lucro de
Z
= 0, que não é o máximo esperado, dessa forma, é preciso mudar
uma das variáveis básicas para que se possa encontrar novas soluções viáveis até chegar
à solução ótima. Isso acontecerá, no caso de maximizar, quando todos os coeficientes
da função objetivo forem maiores ou iguais a zero, e no caso de minimizar uma função,
quando todos os coeficientes da função objetivo forem menores ou iguais a zero.
Como o problema que está sendo resolvido é do tipo maximizar, então o objetivo
é tornar os coeficientes de
Z
0, para isso é preciso realizar um processo chamado
pivotamento, o qual realiza operações entre as linhas, levando a um sistema equivalente,
funcionando da seguinte forma:
a1j
a2j
.
.
.
aij
.
.
.
amj
=
0
0
.
.
.
1
.
.
.
0
Isso significa que um elemento
aij
é escolhido para ser o elemento pivô, esse será
transformado em 1, por meio de operações elementares, enquanto os demais elementos
na mesma linha são ajustados para zero, pelo mesmo processo de operações elementares
de linha. Faz-se um processo de busca para saber qual será a linha e coluna pivô e a
intersecção entre elas será chamado de elemento pivô. Este processo consiste em escolher
qual variável básica vai se tornar não básica e vice-versa. A escolha da coluna pode ser
feita de maneira aleatória, mas para chegar no resultado ótimo com mais rapidez, será
ReTMAT 9
analisado qual é o menor coeficiente de
Z
, que no caso é
7, logo, a coluna
x1
será a
coluna pivô escolhida. para a linha, será analisada qual o quociente mínimo entre
bi
aij
, sendo
aij
os coeficientes da coluna pivô, com exceção da função objetivo. Assim,
tem-se (
40
5,25
3
)e o mínimo entre eles é 8, logo, nossa linha pivô é a linha 1 e 5será o
elemento pivô. Na Tabela 3podemos ver como fica esse processo.
Tabela 3: Escolha da linha e coluna pivô.
Linha Variáveis Básicas x1x2x3x4b
1x35 3 1 0 40
2x43 2 0 1 25
3 Z 74 0 0 0
Fonte: Elaborada pelos autores.
Por meio do pivotamento, foi escolhida a variável
x1
para ser a nova variável básica e
x3
para ser variável não básica. Para criar uma nova tabela, a linha pivô será transformada
da seguinte forma: linha pivô atual dividida pelo número pivô. E as outras linhas
serão transformadas em: linha atual menos coeficiente da coluna pivô da linha atual
multiplicado pela nova linha pivô. Assim, a nova linha pivô vai ser igual a:
Tabela 4: Tabela com a nova linha pivô.
Linha Variáveis básicas x1x2x3x4b
1x113
5
1
50 8
2x43 2 0 1 25
3 Z 74 0 0 0
Fonte: Elaborado pelos autores.
E as linhas 2e3serão transformadas da seguinte forma:
x1x2x3x4b
Linha 2 3 2 0 1 25
3·nova linha pivô 3 9
5
3
50 24
Subtração 0 1
59
51 1
x1x2x3x4b
Linha 3 -7 -4 0 0 0
7·nova linha pivô -7 21
5
7
50 -56
Subtração 0 1
5
7
50 56
Assim, a nova Tabela fica:
ReTMAT 10
Tabela 5: Valores atualizados do método simplex.
Linha Variáveis Básicas x1x2x3x4b
1x113
5
1
50 8
2x401
59
51 1
3 Z 0 1
5
7
50 56
Fonte: Elaborado pelos autores.
Como não outro valor negativo na função objetivo, tem-se que a solução ótima foi
obtida, ou seja, quando
x1
= 8 e
x4
= 1 e
x2
=
x3
= 0 o lucro será de 56, que é o lucro
máximo. Caso a solução ótima não tivesse sido encontrada, seria preciso repetir todo o
processo a partir do pivotamento.
As etapas acima descritas pode ser sintetizadas conforme mostra a Figura 1.
Figura 1: Organograma do método simplex.
Fonte: Adaptado de [10].
ReTMAT 11
5 Aplicação em Python
É comum, em muitos trabalhos, o uso do Excel na aplicação do método simplex,
como pode ser visto em [
8
,
13
] e [
18
], entre outros. Isso ocorre devido ao fato de o
método simplex envolver muitas tabelas. No entanto, neste trabalho, optou-se por
utilizar a linguagem de programação Python, pois, dentre suas diversas bibliotecas,
uma específica para resolver problemas de programação linear, simplificando a resolução
e resultando em soluções mais rápidas, uma vez que [17, p.10]:
Python possui um conjunto de regras de escrita que definem como um
algoritmo é interpretado, possuindo um layout visual relativamente organizado
e utilizando, com frequência, palavras em Inglês. Python usa indentação
como delimitação de blocos.
Desta forma, pretende-se analisar a contribuição da linguagem de programação
Python na resolução de problemas de programação linear, o que é, particularmente,
relevante, uma vez que problemas em grande escala seriam muito complexos e inviáveis
de serem resolvidos manualmente.
A plataforma utilizada foi o Google Colaboratory e o digo que será descrito funciona
com a biblioteca pulp, a qual resolve problemas de maximização e minimização. Sendo
assim, é essencial realizar sua instalação antes de começar a escrita do digo.
Após a instalação da biblioteca, ela será importada diretamente no código. Em
seguida, é necessário criar uma instância que representará o problema a ser resolvido
(Problema 1). Por ser um problema de maximização, será usado “LpMaximize”, conforme
sugere [
4
]. Para o caso de minimização, no lugar de “LpMaximize” usa-se “LpMinimize”.
A próxima etapa será definir as variáveis do problema, usando “lowBound” para
colocar um limite inferior nas restrições, que, como pode ser visto no digo, o limite é
zero. A função objetivo e as restrições devem ser adicionadas na instância que foi criada
inicialmente. A aplicação com um problema mais abrangente pode ser exemplificada no
seguinte caso, retirado de [10, p.33].
Problema 2.Uma companhia de propaganda deseja planejar uma campanha em 03
diferentes meios: tv, rádio e revistas. Pretende-se alcançar o maior número de clientes
possível. Um estudo de mercado resultou nos dados da Tabela 6, sendo os valores válidos
para cada veiculação da propaganda. A companhia não quer gastar mais de $800.000 e
adicionalmente deseja:
a) No mínimo 2 milhões de mulheres sejam atingidas;
b) Gastar no máximo $500.000 com TV;
c) No mínimo 03 veiculações ocorram no horário normal na TV;
d) No mínimo 02 veiculações ocorram no horário nobre na TV;
e) Número de veiculações no rádio, e nas revistas, devem ficar entre 05 e 10, para
cada meio de divulgação.
ReTMAT 12
Tabela 6: Valores dos ganhos com cada veiculação de propaganda.
TV
horário
normal
TV
horário
nobre
Rádio Revistas
Custo 40.000 75.000 30.000 15.000
Clientes atingidos 400.000 900.000 500.000 200.000
Mulheres atingidas 300.000 400.000 200.000 100.000
Fonte: [10, p. 30].
O objetivo inicial para resolver o problema é formular um modelo de PL adequado
à situação, determinando o número de veiculações a serem feitas em cada meio de
comunicação, de modo a atingir o máximo possível de clientes. As variáveis de decisão
são:
x1=Número de exposições em horário normal na TV.
x2=Número de exposições em horário nobre na TV.
x3=Número de exposições feitas utilizando rádio.
x4=Número de exposições feitas utilizando revistas.
Com as informações dadas, chega-se ao seguinte modelo:
max Z = 400.000x1+ 900.000x2+ 500.000x3+ 200.000x4,
sujeito a :
40.000x1+ 75.000x2+ 30.000x3+ 15.000x4800.000,
300.000x1+ 400.000x2+ 200.000x3+ 100.000x42.000.000,
40.000x1+ 75.000x2500.000,
x13, x22,5x310,5x410,
x1, x2, x3, x40.
Ao aplicar a linguagem de programação Python tem-se o Algoritmo 1:
ReTMAT 13
Algoritmo 1 Resolução do Problema 2utilizando Programação Linear
1: Início: Inicia o programa.
2:
Importar biblioteca: A biblioteca pulp é importada para resolver problemas de progra-
mação linear.
3:
Problema: Criar um problema de programação linear chamado “propaganda” para
maximização.
4:
Variáveis: Definir as variáveis de decisão
x1, x2, x3
e
x4
, todas com limite mínimo de zero.
5:
Função objetivo: Adicionar a função objetivo (400
.
000
×x1
+ 900
.
000
×x2
+ 500
.
000
×
x3+ 200.000 ×x4)ao problema de maximização.
6: Restrições: Adicionar as seguintes restrições ao problema:
40.000 ×x1+ 75.000 ×x2+ 30.000 ×x3+ 15.000 ×x4800.000.
300.000 ×x1+ 400000 ×x2+ 200.000 ×x3+ 100.000 ×x42.000.000.
40000 ×x1+ 75000 ×x2500.000.
x13.
x22.
x35.
x310.
x45.
x410.
7: Resolver: Resolver o problema de programação linear.
8: Apresentar a solução: Exibir o status da solução (ótimo, inviável, não resolvido, etc.)
9:
Apresentar os variáveis Exibir os valores das variáveis de decisão
x1, x2, x3
e
x4
encon-
trados na solução.
10: Solução viável: Exibir o valor da função objetivo no ponto ótimo.
11: Fim.
Para utilizar o algoritmo em Python, não é necessário passar para a forma canônica
nem para a forma padrão, detalhe que é de suma importância na forma manual. Além
disso, ao programar em Python, não é necessário passar por tantos processos e cálculos,
de forma que se chega mais rápido ao resultado e sem erros.
A seguir apresenta-se mais uma aplicação (Problema
??
) com um exemplo hipotético.
Problema 3.Uma empresa de energia elétrica opera cinco usinas, identificadas por A, B,
C, D e E. As usinas utilizam diferentes fontes de energia e possuem custos operacionais
e capacidades máximas de geração distintos, conforme apresentado na Tabela a seguir:
Usina Fonte Custo (US$/MWh) Capacidade (MWh)
A Hidrelétrica 32 300
B Solar 38 250
C Gás natural 24 400
D Carvão 20 300
E Biomassa 35 200
A empresa deve atender a uma demanda de 1000 MWh. Além disso, por exigência
ambiental, pelo menos 40% da energia fornecida deve ser proveniente de fontes renováveis.
Neste problema, são consideradas renováveis as fontes utilizadas pelas usinas A, B e E.
O objetivo é determinar quanto cada usina deve produzir para minimizar o custo
operacional total, atendendo à demanda, ao percentual mínimo de energia renovável e
ReTMAT 14
aos limites de capacidade.
Variáveis de decisão.
Sejam
xi=quantidade de energia produzida pela usina i, em MWh, i {A, B, C, D, E}.
Função objetivo.
O custo operacional total é dado por:
min Z= 32xA+ 38xB+ 24xC+ 20xD+ 35xE.(2)
Restrições.
A produção total deve ser igual à demanda:
xA+xB+xC+xD+xE= 1000.(3)
Como 40% de 1000 MWh correspondem a 400 MWh, a exigência de participação
mínima de fontes renováveis é representada por:
xA+xB+xE400.(4)
Os limites de capacidade são:
xA300, xB250, xC400,(5)
xD300, xE200.(6)
As condições de não negatividade são:
xA, xB, xC, xD, xE0.(7)
Esta formulação representa um problema de programação linear que minimiza os
custos operacionais, sujeito às restrições de demanda e disponibilidade de cada usina,ver
Algoritmo 2. Todos os digos em linguagem de programação Python estão no Apêndice
Adesse trabalho.
ReTMAT 15
Algoritmo 2 Resolução do Problema 3 utilizando Programação Linear
1: Início: Iniciar o programa.
2: Importar biblioteca: Importar a biblioteca pulp para resolver o problema de PL.
3: Definir usinas: Definir o conjunto de usinas como
usinas = [A, B, C, D, E].
4: Definir fontes renováveis: Definir as usinas que utilizam fontes renováveis como
renovaveis = [A, B, E].
5: Definir custos: Definir os custos de geração, em dólares por MWh, como
custos = [32,38,24,20,35].
6: Definir capacidades: Definir as capacidades máximas das usinas, em MWh, como
capacidades = [300,250,400,300,200].
7: Definir demanda: Definir a demanda total de energia como
demanda = 1000.
8:
Definir geração renovável mínima: Calcular a quantidade mínima de energia renovável:
minimo_renovavel = 0,40 ×1000 = 400.
9:
Problema: Criar um problema de programação linear denominado
problema_energia
,
com objetivo de minimização.
10: Variáveis: Definir as variáveis contínuas xA, . . . , xE, com limite inferior igual a zero.
11: Função objetivo: Adicionar ao problema a função
min Z= 32xA+ 38xB+ 24xC+ 20xD+ 35xE.
12: Restrição de demanda: Adicionar a restrição
xA+xB+xC+xD+xE= 1000.
13: Restrição de fontes renováveis: Adicionar a restrição
xA+xB+xE400.
14: Restrições de capacidade: Adicionar as restrições
xA300, xB250, xC400, xD300, xE200.
15: Resolver: Resolver o problema utilizando o solver CBC utilizando a biblioteca PuLP.
16: Exibir solução: Apresentar o status da solução obtida.
17: for cada usina i {A, B, C, D, E}do
18: Exibir a quantidade de energia produzida pela usina i.
19: end for
20: Geração renovável: Calcular e exibir
xA+xB+xE.
21: Custo total: Calcular e exibir o valor ótimo da função objetivo.
22: Fim: Encerrar o programa.
ReTMAT 16
6
Análise da Eficiência e Rapidez Computacional dos Modelos
A validação dos modelos matemáticos implementados via biblioteca PuLP em ambi-
ente Google Colaboratory demonstrou que a abordagem por Programação Linear (PL) e
Programação Linear Inteira Mista (PLIM) é altamente robusta, tanto sob a ótica da
eficiência operacional quanto da rapidez computacional.
Para fundamentar a viabilidade técnica das soluções apresentadas nos Problemas 1, 2
e 3, a análise dos resultados obtidos deve considerar a mecânica do algoritmo Simplex e
do método Branch-and-Bound operados pelo solver padrão COIN-OR Branch-and-Cut
(CBC).
6.1 Rapidez de Convergência e Complexidade Algorítmica
Embora o método Simplex possua uma complexidade de pior caso exponencial, a
sua aplicação prática na literatura científica consagra-se por apresentar um tempo de
execução que cresce, em média, de forma linear ou polinomial em relação ao número de
restrições [
10
]. Nos três cenários testados, o tempo de CPU requerido para a convergência
e obtenção da solução ótima global foi inferior a 0,1segundos.
Essa rapidez se justifica porque o algoritmo não realiza uma busca exaustiva (força
bruta) no espaço de soluções, o que seria computacionalmente inviável em problemas
de grande escala. Em vez disso, o Simplex adota uma estratégia geométrica iterativa,
avaliando exclusivamente os pontos extremos (vértices) do poliedro convexo definido
pelas restrições lineares. A transição de uma base factível para outra ocorre apenas
se houver melhoria no valor da função objetivo, reduzindo drasticamente o esforço
computacional e garantindo a convergência imediata para problemas de pequeno e médio
porte.
6.2 Eficiência Operacional e Análise de Sensibilidade
A eficiência da implementação não se limita à velocidade de processamento, mas
estende-se à qualidade e utilidade das respostas geradas para a tomada de decisão
gerencial:
Alocação Ótima de Recursos (Problema 1): O modelo de planejamento da
produção de vestuário demonstrou eficiência máxima ao esgotar completamente
as 40 horas do departamento de corte e as 25 horas do departamento de costura.
O algoritmo identificou matematicamente o ponto de tangência exato entre as
restrições, eliminando qualquer ociosidade oculta no processo fabril.
Modularidade e Escalabilidade (Problemas 2 e 3): A modelagem utilizada
para a campanha publicitária (Problema 2) e para o despacho das usinas de energia
(Problema 3) mostrou-se altamente escalável. No Problema 3, além dos custos e das
capacidades de geração, o modelo incorpora uma exigência mínima de participação
de fontes renováveis. A expansão do número de usinas demanda principalmente a
atualização dos dicionários de dados e da classificação das fontes de energia, sem
alterar a estrutura geral do modelo de programação linear.
Adicionalmente, a obtenção da solução via PuLP fornece variáveis duais associadas
às restrições (os chamados “preços-sombra”). Essa propriedade matemática enriquece a
ReTMAT 17
discussão econômica, pois permite que os gestores compreendam o impacto marginal de
uma unidade adicional de recurso (como um dólar adicional no orçamento publicitário,
uma hora adicional disponível na produção ou o aumento da participação mínima
exigida de fontes renováveis) sobre o valor global da função objetivo, consolidando a
Programação Linear como uma ferramenta indispensável de otimização de sistemas.
7 Conclusão
Em um mundo, onde diariamente aparecem novos problemas que podem ser resol-
vidos matematicamente, é preciso buscar a melhor forma para calculá-los. Para lidar
com problemas grandes, que envolvem várias variáveis, faz-se necessário o auxílio de
tecnologias digitais que viabilizem o encontro de soluções de forma eficiente e eficaz.
Por isso, este artigo propôs o estudo do método simplex, que possui uma aplicabilidade
mais ampla, com a linguagem de programação Python.
Dentre os modos de resolução pelo método simplex, a forma manual envolve muitos
cálculos, com a álgebra intrínseca desde a formulação do problema até o resultado ótimo,
um exemplo disso é a definição de um problema de programação linear que se trata de
um conjunto convexo e as restrições são hiperplanos que delimitam essa forma. Assim,
a álgebra desempenha um papel significativo na programação linear e estudos futuros
podem destacar a sua importância no contexto do método simplex.
Por meio da utilização da linguagem de programação Python, foi possível resolver
computacionalmente os problemas propostos, na qual todos os cálculos são automatizados
com o auxílio de uma biblioteca específica para problemas de programação linear. Isso
significa que tarefas que antes exigiam muita atenção e cálculos, podem agora ser
resolvidas com apenas algumas linhas de digo. Além disso, a simplicidade foi um
critério de escolha para a linguagem de programação, o que torna as linhas de digo
compreensíveis e facilita as adaptações necessárias para cada problema. Dessa forma,
percebe-se que, com o algoritmo utilizado, tornou-se mais rápida a solução de problemas
de programação linear, apresentando o resultado quase que instantaneamente.
Em suma, a aplicação do método simplex, utilizando a linguagem de programação
Python, demonstrou-se uma ferramenta valiosa para resolver problemas de programação
linear de maneira eficiente. A abordagem manual ressaltou a importância da álgebra
linear na formulação e resolução desses problemas, enquanto a abordagem computacional
destaca a rapidez e praticidade proporcionadas pela automação dos cálculos. Ao
combinar os conhecimentos teóricos da álgebra linear com as facilidades oferecidas pela
programação, é possível obter soluções precisas e otimizadas para uma ampla gama de
problemas do mundo real. Essa integração entre teoria e prática abre caminho para
novas aplicações e avanços na área da otimização, contribuindo para a resolução de
desafios complexos em diversas áreas, desde a logística até o planejamento financeiro.
Assim, o estudo e aplicação do método simplex e sua implementação computacional
representam um importante passo em direção à busca por soluções eficazes e inovadoras
para problemas do cotidiano.
ReTMAT 18
Referências
[1]
Luara Almeida, Glêndara Martins, and Warley Silva. Otimização de processos
utilizando a programação linear. Enciclopédia Biosfera, 9(16), 2013.
[2]
Robert E Bixby, John W Gregory, Irvin J Lustig, Roy E Marsten, and David F
Shanno. Very large-scale linear programming: A case study in combining interior
point and simplex methods. Operations Research, 40(5):885–897, 1992.
[3]
José Luiz Boldrini, Sueli IR Costa, VL Figueredo, and Henry G Wetzler. Álgebra
linear. Harper & Row, 1980.
[4]
Giovanni Castilho Brogiato. Programação linear, linear inteira e os algoritmos
simplex e branch and bound: Problemas e aplicações em otimização. Trabalho de
conclusão de curso, Universidade Federal de São Carlos, São Carlos, Brazil, 2021.
[5]
Emílio Capamba Evaristo. Programação linear: um manual para o professor. PhD
thesis, Universidade da Beira Interior (Portugal), 2020. Acessado em 20/08/2024.
[6]
Paulo Feofiloff. Algoritmos de Programação Linear Programação Linear Concreto.
Universidade de São Paulo, 2005.
[7]
J Júdice, P Martins, M Pascoal, and J Santos. Programação linear. Coimbra,
Portugal: Departamento de Matemática-Universidade de Coimbra, 2006.
[8]
Erico Fagundes Anicet Lisboa. Pesquisa operacional. Apostila da disciplina. Rio de
Janeiro–RJ, 2002.
[9] Pedro Luiz Aparecido Malagutti and Hipertexto Pitágoras. P versus np, 2002.
[10]
Fernando Augusto Silva Marins. Introdução à pesquisa operacional. São Paulo:
Cultura Acadêmica: Universidade Estadual Paulista, 2011.
[11]
Marco Antonio Figueiredo Menezes. Programação linear. Goiânia: Universidade
Católica de Goiás, Departamento de Computação, 2006.
[12]
Nilo Ney Coutinho Menezes. Introdução à Programação com Python: Algoritmos e
Lógica de Programação para Iniciantes. Novatec, São Paulo, 2010.
[13]
Elias Dib Caddah Neto. A importância da programação linear no processo decisóri-
o/programming the importance of linear in decision making. Revista FSA (Centro
Universitário Santo Agostinho), 1(1):69–80, 2015.
[14]
Agnaldo dos Santos Pereira. Método simplex e sua aplicação na resolução de
problemas de programação linear em um curso técnico de administração. Dissertação
de mestrado profissional em matemática, Universidade Estadual do Maranhão
(UEMA), São Luís, Brazil, 2020.
[15]
Leizer de Lima Pinto and Marco Antonio Figueiredo Menezes. Implementação de
algoritmos simplex e pontos interiores para programação linear. Revista EVS-Revista
de Ciências Ambientais e Saúde, 35(2):225–246, 2008.
[16]
Adília Oliveira Das Neves Rafael. Programação linear e algumas extensões. Facul-
dade de Ciências universidade do Porto, Departamento de Matemática, 2014.
ReTMAT 19
[17]
Ana Luisa Soubhia, Elias Teixeira Costa, Flavio Luan Müller Freitas, Laís Brum
Menezes, Marcos Alves dos Santos, and Vinícius Maran. Python 101. Universidade
Federal de Santa Maria (UFSM), Cachoeira do Sul, RS, versão 1.0-2019/2 edition,
2019.
[18]
Orisvaldo Gustavo de Sousa. Aspectos práticos da programação linear. Universidade
Federal de Santa Catarina, 2009.
A digos em Python
A.1 Resolução do Problema da Indústria (Calças e Bermudas)
1# Insta l a a biblioteca de Programa çã o Linear no Colab
2! pip instal l pulp
3
4import pulp
5
6# 1. Cria ção do Problema ( Objetivo : Maximizar )
7problema_1 = pulp . LpProblem ( "Maximizacao_Margem_Contribuicao", pulp .
LpMaximize )
8
9# 2. Def ini ç ão das Vari á veis de Decis ão
10 x1 = pulp . LpVariable ( "Calcas", lowBound =0 , c at = Integer)
11 x2 = pulp . LpVariable ( " Bermudas " , l ow Bo und =0 , cat = Integer)
12
13 # 3. Fun ção Objetivo : Maximizar a Margem de Contribui çã o
14 problema_1 += 7 * x1 + 4 * x2 , "Z_Margem_Total"
15
16 # 4. Res tr i ç õ es de C ap acid ad e dos D epa rt am en to s
17 problema_1 += 5 * x1 + 3 * x2 <= 40 , "Capacidade_Corte"
18 problema_1 += 3 * x1 + 2 * x2 <= 25 , " Ca paci dade _ Cos t ura "
19
20 # 5. Resolu ç ão do Problema
21 problema_1 . solve ()
22
23 # 6. Exibi çã o dos Resul tados
24 print(f" S tatus da Solu ç ão: { pulp . LpStatus [ proble ma_1 . status ]}\ n ")
25
26 if problem a _1 . status == pulp . LpStat usOpt imal :
27 print (" === P LANO DE PRODUCAO === " )
28 print (f" Quan ti da de de Calc as ( x1 ) : { int ( x1 . va rV alue ) }
unidades")
29 print (f" Quanti d ade de Bermudas ( x2 ): {int ( x2 . varValue )}
unidades")
30 print (" -" * 35)
31
32 # Valor da margem de co n t ribui ção má xima alcan ç ada
33 margem _ma xima = pulp . value ( probl ema_1 . objective )
34 print (f" Ma rg em de Cont ri bu ica o T ot al Maxim a ( Z) : R$ {
mar ge m_ ma xi ma :.2 f }")
35
36 # Uso real dos recursos para con f erencia das restrico e s
37 horas_co r te = 5 * x1 . varValue + 3 * x2 . varValue
38 horas_ costur a = 3 * x1 . varValue + 2 * x2 . var V al u e
ReTMAT 20
39 print (" \n === USO DOS R ECURSOS === ")
40 print (f" Horas u tiliza das no Corte : { horas_cort e }h ( Limite :
40h)")
41 print (f" Horas u tiliza das na Cost ura : { horas_c ost ura } h( Limite :
25 h )" )
42 else:
43 print (" Nao foi possivel encontra r uma solucao o tima . ")
Algoritmo em linguagem Python 1: Algoritmo Simplex para Fábrica de Calças
A.2 Resolução do Problema da Campanha Publicitária
1# Insta l a a b iblioteca de Programa çã o Linear no Colab
2! pip instal l pulp
3
4import pulp
5
6# 1. Cria ç ão do Problema ( Objetivo : Maxim i z ar )
7problema = pulp . LpProblem ( "Campanha_Publicitaria", pulp . LpMaxi m i ze )
8
9# 2. Def ini ç ão das Vari á veis de Decis ã o
10 x1 = pulp . LpVariable ( " TV_Normal " , lowBound =3 , cat = Integer)
11 x2 = pulp . LpVariable ( " TV_Nobre " , l ow Bo und =2 , cat = Integer)
12 x3 = pulp . LpVariable ( " Radio " , lowBound =5 , u pB ou nd =10 , cat = Integer)
13 x4 = pulp . LpVariable ( " Revistas " , l ow Bo und =5 , u pB ou nd =10 , c at = Integer
)
14
15 # 3. Fun ç ão Objetivo : M axi mizar T otal de Clientes A ti ng idos
16 problema += 400000 * x1 + 900000 * x2 + 500000 * x3 + 200000 * x4 , "
Z_Total_Clientes"
17
18 # 4. Res tr i ç õ es
19 problema += 40000 * x1 + 75000 * x2 + 30000 * x3 + 15000 * x4 <=
800000 , " O r came n to_T o tal "
20 problema += 300000 * x1 + 400000 * x2 + 200000 * x3 + 100000 * x4 >=
2000000, " M inim o _Mul h eres "
21 problema += 40000 * x1 + 75000 * x2 <= 500000 , "Teto_Gastos_TV"
22
23 # 5. Resolu ç ão do Problema
24 problema . solve ()
25
26 # 6. Exibi çã o dos Resul tados
27 print(f" Status da Solu ç ão : { pulp . LpStatus [ problema . status ]}\ n")
28
29 if problema . status == pulp . LpSta t usOp t imal :
30 print (" === PLANO DE VEICU LACAO IDEAL === " )
31 print (f" TV Hor á rio No rm al ( x1 ) : { in t ( x1 . v ar Value ) } ins er ç õ es " )
32 print (f" TV Hor á rio No br e ( x2 ) : { int ( x2 . v ar Val ue ) } ins er ç õ es " )
33 print (f" Rá dio ( x3 ) : { int ( x3 . varVal ue ) } in se r ç õ es " )
34 print (f" Rev istas ( x4 ) : { int ( x4 . varValue ) } inse r ç õ es " )
35 print (" -" * 35)
36
37 # C á lculo e exibi ç ão do valor m á ximo alcan ç ado
38 lucro_to tal = pulp . value ( p roblema . ob jective )
ReTMAT 21
39 print (f" Total de clientes a ting idos ( Z): { int ( l uc ro _t ot al ) :.0 f
}␣pessoas")
40
41 # Verifica çã o de Custos
42 custo_to t al = (40000 * x1 . varValue ) + (75000 * x2 . varValue ) +
(30000 * x3 . varValue ) + (15000 * x4 . varValue )
43 print (f" Custo total da campanha : ${ custo _total : ,.2 f} ")
44 else:
45 print (" Nã o foi poss í vel encontra r uma solu ç ão ó tima para as
restri çõ es forneci d as ." )
Algoritmo em linguagem Python 2: Algoritmo Simplex para Campanha Publicitária
A.3 Resolução do Problema das Usinas de Energia
1# ! pip i nstall pulp
2
3import pulp
4
5# Dados do p r o b l e m a
6usinas = ["A","B","C","D","E"]
7renovaveis = [ "A","B","E"]
8
9fontes = {
10 "A":"Hidreletrica",
11 "B":" Solar " ,
12 "C":" Gas n atural " ,
13 "D":"Carvao",
14 "E":" Biomassa "
15 }
16
17 custos = {
18 "A": 32 ,
19 "B": 38 ,
20 "C": 24 ,
21 "D": 20 ,
22 "E": 35
23 }
24
25 capacidades = {
26 "A": 300 ,
27 "B": 250 ,
28 "C": 400 ,
29 "D": 300 ,
30 "E": 200
31 }
32
33 deman d a = 1000
34 percentual_minimo_renovavel = 0.40
35 geracao_minima_renovavel = (
36 demanda * percentual_minimo_renovavel
37 )
38
39 # Criacao do problema : minimizar o custo o p eracion a l
40 prob l ema_ e ner g ia = pulp . LpProblem (
ReTMAT 22
41 "Despacho_Energia_Com_Renovaveis",
42 pulp . LpM inimiz e
43 )
44
45 # Variaveis de decisao : produc ao de cada usina em MWh
46 producao = pulp . LpVaria ble . dicts (
47 " Producao " ,
48 usinas ,
49 lowBound =0 ,
50 cat =" Cont i nuous "
51 )
52
53 # Funcao objetivo
54 prob lem a_e ner gia += pulp . lpSum (
55 custos [ i] * producao [i ]
56 for iin usinas
57 ) , "Custo_Total"
58
59 # Restrica o de atendime n to da demanda
60 prob lem a_e ner gia += pulp . lpSum (
61 producao [i ]
62 for iin usinas
63 ) == demanda , " Demanda _ Total "
64
65 # Res t r i cao de p artici p acao minima de fontes re novaveis
66 prob lem a_e ner gia += pulp . lpSum (
67 producao [i ]
68 for iin renovav e is
69 ) >= geracao_minima_renovavel , "Minimo_Renovavel"
70
71 # Restricoes de cap a c idade das usinas
72 for iin usinas:
73 problema_energia += (
74 producao [i ] <= capaci d ades [ i ],
75 f" Capacida d e_ {i }"
76 )
77
78 # Resolucao pelo solver CBC
79 status = p rob lem a_e ner gia . solve (
80 pulp . PULP _CBC _CMD ( msg = False )
81 )
82
83 # Exibicao dos resulta d o s
84 print(f" Status : {pulp . L p S tatus [ status ]} ")
85
86 if pulp . L pStatus [ status ] == "Optimal":
87 print(" \n === PLANO OTIMO DE GERACAO === " )
88
89 for iin usinas:
90 print(
91 f" Usina { i} ({ fontes [i ]}) : "
92 f"{ p ro ducao [ i ]. v alue () :.2 f } MWh "
93 )
94
95 geraca o_tot a l = sum (
ReTMAT 23
96 producao [i ]. valu e ()
97 for iin usinas
98 )
99
100 geracao_renovavel = sum (
101 producao [i ]. valu e ()
102 for iin renovav e is
103 )
104
105 percentual_renovavel = (
106 100 * g erac a o_r e nova vel / g eraca o _tota l
107 )
108
109 custo_to tal = pulp . value (
110 prob l ema_ e ner g ia . obje c t ive
111 )
112
113 print (" -" * 45)
114 print (f" G eracao to tal : { g er ac ao _t ot al :.2 f } MWh " )
115 print (
116 f" Geracao reno v a vel : "
117 f"{ ge ra ca o_ renov av el :.2 f } MWh "
118 )
119 print (
120 f" Partic i pacao re n o vavel : "
121 f"{percentual_renovavel:.2f}%"
122 )
123 print (f" Custo total : US$ { c usto _tota l : ,.2 f} ")
124 else:
125 print (" Nao foi encont rad a uma solucao o tima . ")
Algoritmo em linguagem Python 3: Algoritmo para o despacho das usinas com participação
mínima de fontes renováveis.