1. Universidade do Vale do Rio dos Sinos (UNISINOS)
Disciplina de Pesquisa Operacional
Lindo 6.1®
Manual de apoio ao aluno
Professor Dr Luís Henrique Rodrigues
Mestrando Eduardo Rücker
2. 1. Sobre o Lindo e o Manual
O Lindo (Linear Interactive and Discrete Optimizer) é um programa que pode ser usado
para resolver problemas de programação linear, inteira e quadrática.
A versão demo do sistema, a qual será utilizada em sala de aula, possui algumas
limitações:
• Número máximo de restrições: 150.
• Número máximo de variáveis: 300.
• Número máximo de variáveis inteiras: 50.
Em caso de dúvidas sobre o funcionamento do sistema, é possível utilizar o menu Ajuda
sob duas formas de visualização:
• Menu Help, Contents.
• Menu Help, Search for help on...
Este manual tem como objetivo servir de apoio ao estudo da ferramenta, apresentando
questões básicas inerentes ao funcionamento e à modelagem de dados.
2. Sintaxe e regras de modelagem
Para se modelar problemas no Lindo, deve se obedecer à sintaxe padrão e respeitar
algumas regras.
A sintaxe padrão para um modelo desenvolvido no Lindo deve possuir os três elementos
abaixo, na ordem em que aparecem:
• Indicar se o problema é de maximização ou de minimização: toda modelagem no
Lindo deve iniciar por MAX ou MIN.
• ST: entre o final da modelagem da função objetivo e o início da modelagem das
restrições, deve-se digitar a expressão “ST” (subject to = sujeito a).
• Ao final do modelo, deve-se utilizar a expressão “END”.
Regras e dicas importantes para a modelagem:
• Uma mesma variável não pode ter dois ou mais nomes em um mesmo modelo.
Exemplo: se a variável para a quantidade de peças em um problema qualquer
aparecer na função objetivo como Xa, ela não poderá aparecer como Xab na
modelagem das restrições. O Lindo interpretará esta situação como duas variáveis
distintas, mesmo que tenha sido feito um pequeno erro de digitação.
• As variáveis devem possuir no máximo 8 caracteres e iniciar por uma letra. Caso seja
necessário utilizar um espaço no nome da variável, deve-se usar o underline.
• O Lindo não diferencia letras maiusculas e minúsculas.
• O Lindo não reconhece vírgula, e sim ponto. Logo, todo número decimal deve utilizar
ponto. Exemplos:
Errado: 2,5 xab + 3,33 xcd
3. Correto: 2.5 xab + 3.33 xcd
• Os coeficientes podem tanto estar separados quanto juntos das variáveis, não sendo
necessário digitar o sinal de multiplicação. Exemplos:
2 xab + 4 xbd >= 6
3xab + 5xbd >= 8
• Maior ou igual e menor ou igual devem ser escritos da seguinte maneira: >= e <=.
• A constante das restrições deve estar sempre isolada do lado direito da inequação. Já
as variáveis e os seus coeficientes devem estar no lado esquerdo. Exemplos:
O que NÃO pode ocorrer: 2 xab >= 6 – 4 xbd
O que deve ocorrer: 2 xab + 4 xbd >= 6
• Para se fazer comentários no modelo, basta utilizar um ponto de exclamação seguido
do comentário. Exemplos:
! exercício 1 do apêndice F
! Xi = quantidade de peças do tipo “i”
• Para se identificarem as restrições do modelo, é possível indicar o nome delas,
sempre na margem esquerda da tela, seguido de parênteses. Exemplos:
Maq1) 2Xac + 4Xbd <= 20
Demanda) Xac + Xbd >= 5
Obs.:
ü os nomes seguem a mesma regra das variáveis (máximo de 8 caracteres, etc).
ü a vantagem dessa identificação é o fato de ela aparecer nos relatórios que o
Lindo gera, facilitando a visualização e a interpretação dos resultados.
• Quando a modelagem for uma programação inteira de números reais, deve-se utilizar
a função GIN. Exemplos:
ü Se for modelada a produção de cadeiras, a solução ótima não poderá sugerir
quantidades decimais. Neste caso, a função GIN torna-se obrigatória.
ü Se for modelada a produção de ração animal, em toneladas, os números após a
vírgula talvez necessitem ser considerados. Neste caso, o uso da função GIN
pode não ser a melhor opção de modelagem.
Observações:
ü A utilização da função GIN acarreta na perda da análise de sensibilidade (ver
seção 4).
ü A modelagem da função GIN deve ser feita ao final do modelo, após a expressão
“END”, para cada variável. Exemplos:
END
GIN Xab
GIN Xbc
4. • Quando a modelagem for uma programação inteira de números binários (0 ou 1),
deve-se utilizar a função INT. Exemplos:
ü Fazer ou não fazer um produto.
ü Convidar ou não convidar um amigo para assistir ao jogo de futebol.
Observações:
ü A modelagem da função INT deve ser feita ao final do modelo, após a expressão
“END”, para cada variável. Exemplos:
END
INT Xab
INT Xbc
Com base em algumas das regras listadas acima, a figura abaixo apresenta um exemplo
de modelagem no Lindo que respeita essas regras:
! exercício 1 apêndice F
! xi = quantidade de peças do tipo “i”
MAX 0.03 xav + 0.05 xad + 0.02 xco
st
produtoA) 0.2 xav + 0.5 xad + 0.75 xco <= 10
produtoB) 0.3 xav + 0.3 xad + 0.05 xco <= 3
produtoC) 0.5 xav + 0.2 xad + 0.2 xco <= 7
demanda) xco >= 8
end
Figura 1 – Exemplo de modelagem no Lindo
3. Rodada
A rodada de um modelo no Lindo depende do respeito às regras detalhadas na seção 2.
Caso existam erros relacionados às regras ou à sintaxe, são geradas mensagens informando
sobre isso. Para que o modelo possa ser validado quanto a essas regras e à sintaxe, sugere-se
utilizar o comando Compile model. Já o processo de rodada é iniciado a partir do comando
Solve.
As funções e os botões para acesso rápido desses comandos estão listados no quadro
abaixo:
5. Menu Comando Função
Botão para
acesso rápido
Solve
Compile
model
Verifica erros no modelo
Solve Roda o modelo
4. Interpretação de resultados
Após rodar, o Lindo gera as soluções e ainda oferece a opção de visualizar a análise de
sensibilidade, a qual é gerada se for clicado em “Sim” na caixa de diálogo “DO RANGE
(SENSITIVITY) ANALYSIS?”.
A aparência dos resultados de uma rodada pode ser visualizada na figura 2:
Figura 2 – Exemplo dos resultados de um modelo rodado no Lindo
6. A seguir, descreve-se como se dá o processo de análise dos resultados gerados nos
relatórios de solução e de análise de sensibilidade.
Relatório de solução:
1. Valor da função objetivo (objective function value): apresenta a solução ótima do modelo, ou
seja, é o resultado da função objetivo. Este valor é obtido através da aplicação dos valores das
variáveis (ver item 2) na função objetivo.
No exemplo da figura 2, os valores das variáveis gerados na otimização foram: XAV = 1.1111;
XAD = 7.5555; e XCO = 8. Já a função objetivo do problema era 0.03 XAV + 0.05 XAD + 0.02
XCO. Com isso:
0.03 * 1.1111 + 0.05 * 7.5555 + 0.02 * 8 = 0.5711
2. Variáveis de decisão:
• Valor (Value): é o valor gerado para cada variável no processo de otimização.
• Custo reduzido (Reduced cost): somente válido quando a variável tem valor = 0. O reduced
cost pode ser interpretado de duas formas:
a) O quanto o coeficiente da variável na função objetivo teria que aumentar ou reduzir
para que a introdução da variável na solução ótima fosse rentável (viável).
Nos problemas de MINimização, é o valor que o coeficiente deveria reduzir.
Nos problemas de MAXimização, é o valor que o coeficiente deveria aumentar.
b) Qual seria a “penalidade” (redução da solução ótima) ao aumentar em uma unidade a
variável em questão para fazer com que ela fizesse parte da solução ótima. O termo
“unidade” aqui utilizado refere-se a um aumento qualquer, tanto de números inteiros
quanto decimais. Exemplos: de 10 para 11 ou de 10 para 10.1. Porém, se o aumento
for de 0.1, o custo reduzido resultante na solução ótima será igual a custo reduzido *
0.1.
3. Restrições:
• Linha (Row): indica em que posição (linha) do modelo estão cada uma das restrições. Como
no exemplo da figura 1 as restrições foram nomeadas, o que apareceu foi a própria
descrição da restrição, e não a identificação da linha do modelo.
• Folga ou excesso (slack or surplus): indica quão perto se está do limite do valor do lado
direito da inequação. No caso da figura 2, a restrição “PRODUTOC” possui folga. Se ela
fosse uma máquina, isso indicaria ociosidade do equipamento.
Para verificar se a restrição “PRODUTOC” realmente tem folga, basta substituir os valores
das variáveis na restrição.
Algumas observações:
a) Em inequações do tipo “menor ou igual a”, geralmente tem-se folga quando o número é
maior que zero.
b) Em inequações do tipo “maior ou igual a”, geralmente tem-se excesso quando o
número é maior que zero.
7. c) O valor pode ser negativo quando uma restrição é violada, situação em que a solução
ótima é inviável.
• Preço dual (Dual price): também chamado de preço sombra (shadow price), indica o quanto
a solução ótima melhoraria ou pioraria por meio da adição de uma unidade no lado direito
da restrição. Em outras palavras, o preço dual ajuda a responder à seguinte pergunta, por
exemplo: até que ponto se deve investir em mais recursos (máquinas, pessoas, etc)?
O termo “unidade” aqui utilizado refere-se a um aumento qualquer, tanto de números
inteiros quanto decimais. Exemplos: de 10 para 11 ou de 10 para 10.1. Porém, se o
aumento for de 0.1, o impacto sobre a solução ótima será igual a preço dual * 0.1.
No exemplo da figura 2, se a capacidade da restrição “PRODUTOA” fosse aumentada de 10
para 10.1, o aumento na solução ótima seria de $ 0.006667 (0.1 * 0.066667). No entanto, o
valor de $ 0.066667 para cada unidade acrescida nem sempre acontecerá, como mostrará a
análise de sensibilidade das restrições – por isso, o preço dual deve ser sempre analisado
conjutamente com o Relatório de Sensibilidade. No exemplo da figura 2, existem limites
mínimos e máximos para a variação do lado direito da restrição dentro dos quais o preço
dual ou a folga/sobra não se alteram. Isso está melhor detalhado na seção que versa sobre
o relatório de análise de sensibilidade.
Adiantando um pouco o tópico sobre análise de sensibilidade: ainda no exemplo da figura 2,
caso o aumento da capacidade da restrição “PRODUTOA” fosse de 0.4, e não 0.1, o
aumento da função objetivo não seria de 0.026667 (0,066667*0.4). A análise de
sensibilidade mostrará que aumentos superiores a 0.333333 na capacidade deste recurso
não garantem o mesmo aumento de 0.066667 na função objetivo para cada unidade do
recurso acrescida (dual price). Em outras palavras, se a capacidade da restrição
“PRODUTOA” fosse aumentada para um número maior ou igual a 10.34, o dual price
mudaria.
Obs.: em problemas de minimização, é preciso ter cuidado na análise. Caso um problema
de minimização de despesas com o escalonamento de mão-de-obra tenha uma restrição
para o domingo com preço dual -100, a inclusão deste dia na solução ótima acarretaria em
um aumento do custo de mão-de-obra. Logo, mesmo que o preço dual seja -100, neste
problema o objetivo seria minimizar as despesas de MO, as quais incluiriam um adicional de
$ 100 em função de disponibilizar-se 1 funcionário no domingo.
Relatório de análise de sensibilidade
A análise de sensibilidade apresenta as faixas de valores nas quais a solução ótima
(resultado das variáveis sugerido pelo Lindo) ou a folga/excesso e preço dual não são afetados.
Em outras palavras, trata-se de um auxílio para a análise do impacto dos coeficientes da função
objetivo e do valor da constante das restrições sobre a solução ótima e a folga/excesso e preço
dual, respectivamente.
1. Sensibilidade de variações nos coeficientes (Obj coefficient ranges):
• Coeficiente atual (Current coef): é o valor do coeficiente de cada variável na função objetivo.
• Aumento admissível (Allowable increase): indica até que ponto o coeficiente de cada
variável poderia, um de cada vez, ser aumentado sem que o valor da variável sofra
alterações.
No exemplo da figura 2, se o coeficiente da variável XAV fosse aumentado de 0.03 para
0.04475, o valor da variável manteria-se o mesmo em relação à solução inicial.
8. • Redução admissível (Allowable decrease): indica até que ponto o coeficiente de cada
variável poderia, um de cada vez, ser reduzido sem que o valor da variável sofra alterações.
2. Sensibilidade de variações no lado direito das inequações (Righthand side ranges):
• Valor atual (Current RHS): é o valor da constante (que deve estar sempre isolada no lado
direito da restrição).
• Aumento admissível (Allowable increase): indica até que ponto o valor da constante de cada
restrição poderia, um de cada vez, ser aumentado sem que a folga/sobra ou preço dual
sofram alterações.
No exemplo da figura 2, se a constante da constante “PRODUTOA” fosse aumentada de 10
para 10.3333, a folga/sobra e o preço dual manteriam-se os mesmos em relação à solução
inicial.
• Redução admissível (Allowable decrease): indica até que ponto o valor da constante de
cada restrição poderia, um de cada vez, ser reduzido sem que a folga/sobra ou preço dual
sofram alterações.
Obs.: uma análise pode ser feita comparando-se o preço dual com a sensibilidade das
restrições. Utilizando-se como exemplo a restrição “PRODUTOA”, verifica-se que o preço
dual indica aumento da solução ótima no caso de aumento de 1 unidade da restrição.
Porém, por meio da análise de sensibilidade verifica-se que aumentos maiores que
0.333333 nesta restrição alteram o preço dual, bem como aumentos menores que 0.333333
não influenciam o preço dual.
5. Referências
Lindo Systems Inc., Chicago. User´s help.