





Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Funcionamento do PLI
Tipologia: Notas de estudo
1 / 9
Esta página não é visível na pré-visualização
Não perca as partes importantes!






Carlos Lázaro Menco, UFSM
Resumo: O problema geral de programação linear inteira consiste na alocação de recursos limitados a atividades em competição, de forma ótima; através de variáveis que só possam assumir valores inteiros. O método Branch-and- Bound tem aplicação em diversas áreas, tais como economia, planejamento, otimizar investimentos, etc. Com este artigo busca-se que o engenheiro eletricista tenha uma familiaridade maior com a formulação geral do problema e tenha condições de modelar problemas utilizando esta importante técnica de otimização.
Palavras chaves: Programação linear inteira, método Branch-and-Bound, maximização, técnica de otimização.
A programação inteira surge devido a necessidade da modelagem dos problemas através de variáveis inteiras (discretas), não contínuas.
O problema geral da programação linear inteira é utilizado para otimizar (maximizar ou minimizar) uma função linear de variáveis, chamada de "função objetivo", sujeita a uma série de equações ou inequações lineares, chamadas restrições.
A formulação do problema a ser resolvido por programação linear segue alguns passos básicos:
C. A. Lázaro Menco, é estudante de Pós-graduação em Engenharia Elétrica na Universidade Federal de Santa Maria, UFSM/RS.
Todas essas expressões, entre tanto, devem estar de acordo com a hipótese principal da programação linear, ou seja, todas as relações entre as variáveis devem ser lineares. Isto implica proporcionalidade das quantidades envolvidas. Esta característica de linearidade pode ser interessante no tocante à simplificação da estrutura matemática envolvida, mas prejudicial na representação de fenômenos não lineares (por exemplo, funções tipicamente quadráticas).
O problema de programação linear inteira é formado por uma função objetivo e um conjunto de restrições que são funções das variáveis de decisão do problema. O conjunto de variáveis pode ser dividido em dois subconjuntos:
A formulação do problema é dada por:
Max/min ↅ∆ ㎗ ↆ∇ s.a. ⅗∆ ㎗ Ⅰ∇ 㐉 ↄ
Onde: ∆ 㐐 ❷ ∇ 㐐 ❷ ∇ inteiro
Na modelagem de um problema de programação linear, algumas situações específicas podem ocorrer, o que pode levar a casos em uma forma matemática diferente da apresentada até o momento.
Entretanto, alguns artifícios matemáticos ajudam a reduzir o modelo obtido à forma padrão estudada.
Estes artifícios são mostrados a seguir:
A minimização de uma função z(x) é matematicamente análoga à maximização da negativa desta função (-z(x)).
Exemplo: Minimizarᡒ 㐄 ᡕ⡩ᡶ⡩ ㎗ ᡕ⡰ᡶ⡰ ㎗ ⋯ ㎗ ᡕぁ ᡶぁ
É equivalente a:
Maximizarᡒ䖓^ 㐄 ㎘ ᡕ⡩ᡶ⡩ ㎘ ᡕ⡰ᡶ⡰ ㎘ ⋯ ㎘ ᡕぁ ᡶぁ
Comᡒ′ 㐄 ㎘ ᡒ
Essa é uma das formas de se resolver os problemas de minimização utilizando o mesmo algoritmo. Caso queira resolver diretamente, devemos alterar o critério de entrada das variáveis na base. A variável que entra na base passa a ser aquela que tem o maior valor positivo na linha z-transformada. Caso todas tenham coeficientes negativos ou nulos, a solução obtida é ótima.
Uma desigualdade em uma direção (≤ ou ≥) pode ser mudada para uma desigualdade na direção oposta, pela multiplicação de ambos os lados da desigualdade por (-1).
Exemplo: ᡓ⡩ᡶ⡩ ㎗ ᡓ⡰ᡶ⡰ 㐐 ᡔ
É equivalente a: ㎘ ᡓ⡩ᡶ⡩ ㎘ ᡓ⡰ᡶ⡰ 㐉 ㎘ ᡔ
Uma equação pode ser substituída por duas desigualdades de direções opostas.
Exemplo: ᡓ⡩ᡶ⡩ ㎗ ᡓ⡰ᡶ⡰ 㐄 ᡔ
É equivalente a duas desigualdades simultâneas: ᡓ⡩ᡶ⡩ ㎗ ᡓ⡰ᡶ⡰ 㐐 ᡔ ᡓ⡩ᡶ⡩ ㎗ ᡓ⡰ᡶ⡰ 㐉 ᡔ
IV. CARACTERISTICAS DOS MODELOS PLI. Um problema de programação linear inteira pode apresentar as seguintes situações:
O método Branch-and-Bound (em português, ramificar e limitar) é um algoritmo que apresenta a qualidade de examinar só uma pequena parte das soluções possíveis. Como os problemas de PLI são “relativamente grandes”, para resolvê-los diretamente deve-se dividi-lo em sub-problemas cada vez menores, até que estes possam ser solucionados. Sendo assim, a ideia é desenvolver uma enumeração inteligente dos pontos candidatos “nós” em busca da solução ótima inteira do problema, por meio da partição do espaço e avaliação progressiva das soluções.
A forma de divisão em problemas menores parte do princípio da separação de uma das variáveis de decisão inteiras, em um problema relaxado, utilizando-a em restrições contraditórias, criando uma espécie de ramificação (a partir de um nó), como em uma árvore.
Uma das formas de relaxação consiste em, temporariamente, ignorar as restrições de
Passo 6→ Examine ambos os ramos novamente e adote como limite superior o valor máximo da função objetivo para todos os nós finais. Se o limite inferior é igual ao limite superior, pare. Se não, volte ao passo 3.
EXERCÍCIO 1: Aplicação do método Branch-and- Bound para variáveis de decisão binárias (PLIB).
Maximizar ᡒ 㐄 9ᡶ⡩ ㎗ 5ᡶ⡰ ㎗ 6ᡶ⡱ ㎗ 4ᡶ⡲ s.a. 6ᡶ⡩ ㎗ 3ᡶ⡰ ㎗ 5ᡶ⡱ ㎗ 2ᡶ⡲ 㐉 10 ᡶ⡱ ㎗ ᡶ⡲ 㐉 1 ㎘ᡶ⡩ ㎗ ᡶ⡱ 㐉 0 ㎘ᡶ⡰ ㎗ ᡶ⡲ 㐉 0
ᡶ〷 é binário para j= 1, 2, 3, 4.
Resolvendo pelo método Branch-and-Bound, usando o software MATLAB chega-se ao seguinte resultado:
% Algoritmo PLIB em MATLAB. f = [-9; -5; -6; -4];
A = [6 3 5 2; 0 0 1 1; -1 0 1 0; 0 -1 0 1];
b = [10; 1; 0; 0];
[x,fval,exitflag,output] = bintprog(f,A,b)
x =1 → ᡶ⡩ 1 → ᡶ⡰ 0 → ᡶ⡱ 0 → ᡶ⡲ fval = -
output = iterations: 12 nodes: 5 time: 1. algorithm: 'LP-based branch-and-bound'
Foi usado SIMPLEX em MATLAB para achar a forma relaxada do problema de PL. Agora de forma manual nós temos o seguinte:
%Algoritmo PL ‘Simplex’ em MATLAB. f=[ -9; -5; -6; -4]; A=[6 3 5 2;0 0 1 1;-1 0 1 0;0 -1 0 1], b=[10;1;0;0]; Aeq=[1 0 0 0;0 1 0 0;0 0 1 0;0 0 0 1], beq=[1; 1; 0; 0]; lb=zeros(4,1),ub=ones(4,1); options=optimset('LargeScale','off','Simplex','on'); [x,fval,exitflag,output,lambda]=linprog(f,A,b,… Aeq,beq,lb,ub,[],options);
fval = -16.
---info---
output = iterations: 5 algorithm: 'medium scale: simplex' message: 'Optimization terminated.'
Este é o resultado relaxado, agora tomamos o maior valor decimal e ramificamos. Neste caso é ᡶ⡩.
---Objetive function--- fval = -
---info--- output = iterations: 2 algorithm: 'medium scale: simplex' message: 'Optimization terminated.'
---Objetive function--- fval = -16.
---info--- output = iterations: 3 algorithm: 'medium scale: simplex' message: 'Optimization terminated.'
De acordo com o passo 5, limitamos ao seguinte ramo:
---Objetive function--- fval = -13.
---info--- output = iterations: 1 algorithm: 'medium scale: simplex message: 'Optimization terminated.
---Objetive function--- fval = -
---info--- output =iterations: 2 algorithm: 'medium scale: simplex' message: 'Optimization terminated.
De acordo com o passo 5, limitamos ao seguinte ramo:
---Objetive function--- fval = -
---info--- output = iterations: 1 algorithm: 'medium scale: simplex' message: 'Optimization terminated.'
Exiting: The constraints are overly stringent; no feasible point exists. ---Variable--- x = []
---Objetive function--- fval = []
---info--- output =iterations: 0 algorithm: 'medium scale: simplex'
Este é o resultado relaxado, agora tomamos o maior valor decimal e ramificamos. Neste caso é ᡶ⡰.
---Objetive function--- fval = -
---info--- output = iterations: 2 algorithm: 'medium scale: simplex'
---Objetive function--- fval = -
---info--- output = iterations: 2 algorithm: 'medium scale: simplex'
De acordo com o passo 5, limitamos ao seguinte ramo:
---Objetive function--- fval = -40.
---info--- output = iterations: 2 algorithm: 'medium scale: simplex'
De acordo com o passo 5, limitamos ao seguinte ramo:
---Objetive function--- fval = -
---info--- output =iterations: 2 algorithm: 'medium scale: simplex'
---Objetive function--- fval = -
---info--- output =iterations: 1 algorithm: 'medium scale: simplex'
De acordo com o passo 5, limitamos ao seguinte ramo:
Então como solução ótima em PLI temos: fval= 40, com ᡶ⡩ 㐄 0, ᡶ⡰ 㐄 5; onde têm um valor menor q o valor da fval relaxada e o valor das variáveis de decisões são inteiros.
VII. CASO DE APLICAÇÃO. Para um dado conjunto de obras, devem-se selecionar aquelas a serem priorizadas de tal forma se maximizar o benefício global, respeitando-se uma determinada restrição orçamentária assim como relações de exclusão ou de obrigatoriedade entre obras.
Definição das obras, com custos e benefícios correspondentes: ITEM OBRA CUSTO BENEFÍCIO 1 Poda 5000 500 2 Recondutoramento 20000 1000 3 Circuito novo 40000 1500 4 Expansão SE 50000 1000 5 SE nova 80000 1000
Definição de obras excludentes: ITEM OBRA OBRA EXCLUDENTE
1 Recondutoramento Circuito novo
2 Expansão SE SE nova
1 Recondutoramento Poda
Então o problema pode ser formulado da seguinte forma:
Maximizar 㔳 ᠨ〶 ᡷ〶
ぁ
〶⢀⡩ s.a.
㔳 ᠩ〶 ᡷ〶
ぁ
〶⢀⡩
ᡦ: número total de obras. ᠨ〶: benefício da obra i, em R$. ᡷ〶: variável de decisão referente à obra i. ᠵᡀᡈ〨け: orçamento total disponível, em R$
% Algoritmo PLIB no Matlab Max Z = 500x_1+1000x_2+1500x_3+ 1000x_4+... ...+1000x_ % s.a % --restrições do orçamento-- 5000x_1+20000x_2+40000x_3+50000x_4+... ...+80000x_5 =< 100000 % --restrições de obras excludentes-- x_2+x_3 =< 1 x_3+x_4 =< 1 % --restrições de obras interdependentes-- x_2+x_1 >= 0 % Onde: x_j é binário para j= 1, 2, 3, 4.
f = [-500; -1000; -1500; -1000; -1000]; A = [5000 20000 40000 50000 80000; 0 1 1 0 0;... ...0 0 0 1 1; -1 1 0 0 0]; b = [100000; 1; 1; 0];
[x,fval,exitflag,output] = bintprog(f,A,b)
Optimization terminated.
x = [1 0 1 1 0]
fval = -
algorithm: 'LP-based branch-and-bound'