Pós-graduação → Personalização → Otimização Combinatória ↓
Programação inteira
Programação inteira é um ramo da otimização matemática ou programação matemática. Neste contexto, "otimização" significa selecionar o melhor elemento de um conjunto dado de alternativas disponíveis, com respeito a algum critério. A programação inteira lida especificamente com problemas de otimização onde algumas ou todas as variáveis são restritas a serem inteiros.
Tipos de programação inteira
- Programação inteira pura (PIP): Todas as variáveis de decisão são obrigadas a assumir valores inteiros.
- Programação inteira mista (PIM): Apenas algumas das variáveis são obrigadas a serem inteiros, enquanto outras podem ser não inteiros.
- Programação inteira binária: Caso especial de programação inteira onde as variáveis são limitadas a 0 ou 1. É frequentemente usada para decisões de sim/não.
Importância na otimização combinatória
Muitos problemas em otimização combinatória podem ser formulados como problemas de programação inteira. A otimização combinatória foca em objetos que são discretos ou que podem ser contados. Já que valores inteiros são discretos, a programação inteira é a melhor maneira de resolver tais problemas e torna-se importante em solucioná-los.
Formulação de problema de programação inteira
O problema de programação inteira é geralmente formulado da seguinte forma:
Maximizar (ou Minimizar): c 1 x 1 + c 2 x 2 + ... + c n x n
Sujeito a:
a 11 x 1 + a 12 x 2 + ... + a 1n x n ≤ b 1
a 21 x 1 + a 22 x 2 + ... + a 2n x n ≤ b 2
...
a m1 x 1 + a m2 x 2 + ... + a mn x n ≤ b m
Onde: x 1 , x 2 , ..., x n são inteiros
Aqui, c i
denota os coeficientes da função objetivo que você quer maximizar ou minimizar, a ij
denota os coeficientes das restrições, e b i
denota os limites das restrições.
Exemplo: o problema da mochila
Consideremos um exemplo clássico de programação inteira: o problema da mochila. O objetivo é maximizar o valor total dos itens colocados na mochila, sem exceder sua capacidade de carga.
Exemplo de um problema de mochila:
- Itens: 4 itens com pesos
w = [2, 3, 4, 5]
e valoresv = [3, 4, 5, 6]
- Capacidade: Esta bolsa pode carregar o peso de no máximo 5 pessoas.
Formular o problema da mochila usando programação inteira:
Maximizar: 3x 1 + 4x 2 + 5x 3 + 6x 4
Sujeito a: 2x 1 + 3x 2 + 4x 3 + 5x 4 ≤ 5
Onde: x 1 , x 2 , x 3 , x 4 ∈ {0, 1}
A restrição x i ∈ {0, 1}
assegura que cada item possa ser incluído na bolsa ou não.
Representação visual
Esta visualização mostra um modelo simplificado de uma bolsa com o peso embalado em ordem decrescente.
Resolvendo problemas de programação inteira
Problemas de programação inteira são geralmente NP-difíceis, o que significa que não há algoritmos conhecidos capazes de resolver todos esses problemas de forma eficiente (em tempo polinomial). No entanto, várias abordagens podem ser adotadas para resolver problemas específicos.
1. Método de branch and bound
Este é um método amplamente utilizado para resolver problemas de programação inteira. A ideia básica é dividir o problema em subproblemas menores (ramos) e encontrar a solução ótima avaliando os limites desses subproblemas enquanto os subproblemas devem ser sistematicamente eliminados se seus limites indicarem que não podem conter uma solução melhor (limite).
2. Método do plano de corte
Este método melhora o relaxamento linear do problema de programação inteira inserindo iterativamente restrições lineares (planos de corte) no problema, com o objetivo de filtrar regiões do espaço da solução que não possuem soluções inteiras.
Aplicações práticas da programação inteira
- Alocação de recursos: alocação de recursos limitados entre atividades concorrentes.
- Programação: Alocação de períodos de tempo para tarefas, tais como cronogramas de trabalho, cronogramas de transporte, etc.
- Design de rede: design de caminhos de rede, especificação de largura de banda, etc.
- Planejamento da produção: Planejamento de atividades de produção, como a quantidade de produtos a serem produzidos.
Problema exemplo: programação de tarefas
Considere um conjunto de algumas tarefas, cada uma das quais possui um tempo de processamento específico e uma data limite. O objetivo é programar as tarefas de forma que a latência total seja minimizada, o que é a quantidade pela qual as tarefas são atrasadas para completar e demorar mais do que a data limite.
Exemplo:
- Jobs: Trabalho 1, Trabalho 2, Trabalho 3, tempos de processamento 2, 4, 3 e prazos 2, 6, 5 respectivamente.
Formular este problema de programação usando programação inteira:
Minimizar: T 1 + T 2 + T 3
Sujeito a:
x 1,1 + x 1,2 + x 1,3 = 1
x 2,1 + x 2,2 + x 2,3 = 1
x 3,1 + x 3,2 + x 3,3 = 1
Restrições de Conclusão:
C 1 = 2x 1,1 + 4x 2,1 + 3x 3,1
C 2 = C 1 + 2x 1,2 + 4x 2,2 + 3x 3,2
C 3 = C 2 + 2x 1,3 + 4x 2,3 + 3x 3,3
Onde:
T i = max(0, C i - prazo i )
x i,j ∈ {0, 1}
Vantagens da programação inteira
A programação inteira fornece uma estrutura poderosa para resolver muitos problemas complexos de tomada de decisão, devido à sua capacidade de modelar requisitos lógicos dentro de problemas de otimização. Isto é particularmente benéfico quando:
- As decisões podem ser naturalmente representadas em termos de ligado/desligado (por exemplo, investir ou não).
- Sua solução deve aderir a restrições lógicas rigorosas.
- Você terá que resolver problemas onde algumas das variáveis requerem valores diferentes.
Conclusão
A programação inteira desempenha um papel vital não apenas no amplo campo da otimização, mas também em muitas aplicações práticas em diversas indústrias. Apesar de sua complexidade e intensidade computacional, existem estratégias e heurísticas eficazes que podem ser usadas para obter soluções viáveis para problemas do mundo real. À medida que o poder computacional continua a aumentar, a programação inteira está se tornando mais útil e difundida no gerenciamento de desafios complexos de tomada de decisão.