Você está na página 1de 23

Tutorial IBM ILOG CPLEX

Rian Gabriel S. Pinheiro

5 de Dezembro de 2018

1 / 23
História do CPLEX

– O CPLEX Optimizer foi nomeado pelo método simplex, implementado na


linguagem de programação C.
– Ele foi originalmente desenvolvido por Robert E. Bixby.
– Esta foi adquirida pela ILOG em 1997 e ILOG foi posteriormente adquirida
pela IBM em janeiro de 2009.
– O CPLEX continua a ser desenvolvido ativamente pela IBM.

2 / 23
Por que usar o ILOG CPLEX ?

– Eficiência
– Rapidez
– Solver padrão da indústria
– Bibliotecas: C, C++, Java, C#, Matlab e Python

3 / 23
Problema de Programação Matemática resolvidos pelo
CPLEX

– Lida com a otimização de uma função objetivo sujeita a um conjunto de


restrições.
– Tipos de problemas de programação matemática:
– Programação Linear (todas as variáveis estão em R) com o método simples ou pontos
interiores.
– Programação Linear Inteira Mista (algumas variáveis estão em Z) com o método
branch-and-cut.
– Programação Quadrática Convexa e Não–Convexa e problemas restritos quadraticamente
convexos.

4 / 23
Características da Programação Linear (Inteira)

– Função objetivo (min ou max) é uma função linear.


– Restrições são lineares e do tipo: =, ≤ ou ≥.

5 / 23
Soluções

– Variáveis que satisfazem todas as restrições do problema são chamadas


soluções viáveis.
– Uma solução viável que maximiza (ou minimiza) a função objetivo é chamada
solução ótima, e o valor correspondente da função objetivo é chamado valor
ótimo.
– Note que a solução ótima não necessariamente é única.

6 / 23
Usando o CPLEX

O ILOG CPLEX pode ser usado de três formas:

– ILOG CPLEX Interactive Optimizer:


– lê os problemas interativamente ou através de arquivos em certos formatos;
– resolve o problema interativamente ou através de arquivos de texto.

– ILOG Concert
– conjunto de bibliotecas em alto nível.

– ILOG CPLEX Callable Library


– conjunto de bibliotecas em baixo nível (opera diretamente na matriz).

7 / 23
Exemplo

max x1 + 2x2 + 3x3


sujeito a − x1 + x2 + x3 ≤ 20
x1 − 3x2 + x3 ≤ 30
0 ≤ x1 ≤ 40
0 ≤ x2
0 ≤ x3
xi ∈ R ∀i ∈ {1, 2, 3}

8 / 23
ILOG CPLEX Interactive Optimizer

nome@maquina:~$ cplex

> cplex

CPLEX> enter
Enter name for problem: myProblem
Enter new problem [’end’ on a separate line terminates]:

maximize
x1 + 2x2 + 3 x3
subject to
-x1 + x2 + x3 <= 20
x1 - 3x2 + x3 <=30
bounds
0 <= x1 <= 40
0 <= x2
0 <= x3
end
9 / 23
ILOG CPLEX Interactive Optimizer (cont)
CPLEX> opt
Tried aggregator 1 time.
No LP presolve or aggregator reductions.
Presolve time = 0.00 sec.

Iteration log . . .
Iteration: 1 Dual infeasibility = 0.000000
Iteration: 2 Dual objective = 202.500000

Dual simplex - Optimal:


Objective = 2.0250000000e+02

Solution time = 0.00 sec. Iterations = 2 (1)

CPLEX> dis sol var -


Variable Name Solution Value
x1 40.000000
x2 17.500000
x3 42.500000 10 / 23
Alguns comandos

– Enter: inicializa um novo problema


– Read: lê um problema de um arquivo
– Optimize: resolve o problema
– Display: imprime: problema, solução, etc.
– Ex: display solution variables -

11 / 23
CPLEX Concert

Vamos utilizar a biblioteca de alto nível CPLEX Concert em C++.

12 / 23
CPLEX Concert

Dois tipos de objetos (classes):

– Objetos de Modelagem para definir o problema de otimização (restrições,


função objetivo, etc.). Eles são agrupados em um objeto IloModel
representando o problema da otimização completo (lembre-se: aqui, modelo
= problema).
– Objetos de Resolução para resolver problemas representados por objetos de
modelagem. O IloCplex lê um modelo, extrai seus dados, resolve o problema
e responde a consultas sobre a solução.

13 / 23
Criando o ambiente

A classe IloEnv constrói um ambiente do CPLEX. O ambiente é o primeiro objeto


criado em uma aplicação. Para criar um ambiente chamado env, faça o seguinte:

IloEnv env;

O objeto do ambiente precisa estar disponível para o construtor de todas as outras


classes da Concert.
Antes de terminar, destruir o objeto com

env.end();

já que só pode existir um IloEnv.

14 / 23
Criando um modelo

Objetos da classe IloModel definem um modelo completo que pode ser passado
para um objeto IloCplex. Para construir um objeto de modelagem chamado
modelo, dentro um ambiente existente chamado env, use:

IloModel modelo(env);

O ambiente de um determinado modelo de otimização pode ser recuperado


chamando:

IloEnv env = modelo.getEnv();

15 / 23
Adicionando variáveis ao modelo

As variáveis de modelagem são construídas como objetos da classe IloNumVar,


por exemplo:

IloNumVar x (env, 0, 40);

Essa definição cria a variável de modelagem com limite inferior 0, limite superior
40 e tipo float;
Tipos de variáveis:

– IloFloat: variável contínua;


– IloInt: variável inteira;
– IloBool: variável booleana;

16 / 23
Vetor de variáveis

Pode-se criar um vetor de variáveis com o comando IloTIPOVarArray em que


TIPO pode ser Nun, Int ou Bool. Ex:

IloIntVarArray x(env, n, 0, 1);

Para criar uma matriz n × n de variáveis inteiras entre 0 e 10 use:

IloArray <IloIntVarArray> x(env, n);

for(unsigned i=0; i<n; ++i)


x = IloIntVarArray(env, n, 0, 10);

17 / 23
Criando um modelo:

– Depois que todas as variáveis de modelagem foram construídas, elas podem


ser usadas para criar expressões, que são usadas para definir objetos de
classes como por exemplo a IloObjective.
– Para criar um objeto do tipo IloObjective representando uma função
objetivo (e direção da otimização) use:

IloObjective obj = IloMinimize(env, x + 2 * y);

– Criando restrições e adicionando-as ao modelo com:

model.add(-x + 2 * y + z <= 20);

18 / 23
Crinando um modelo

Na verdade, em

model.add (-x + 2 * y + z <= 20);

um objeto da classe IloExpr é implicitamente criado.

– Objetos da classe IloExpr podem ser criados explicitamente também.


– Por exemplo, quando as expressões não podem ser explicadas no
código-fonte, mas precisam ser construídas dinamicamente.
– Operadores como += fornecem uma maneira eficiente de fazer isso. Ex:
mostrar que a soma do vetor x deve ser um.

IloExpr somatorio(end);
for(unsigned i=0; i<n; ++i)
somatorio += x[i];
model.add(somatorio == 1);

19 / 23
Resolvendo o modelo

A classe IloCplex resolve um modelo.


Após o problema de otimização ter sido armazenado em um objeto IloModel, é
hora de criar um objeto IloCplex para resolver o problema:

IloCplex cplex(model);

Para resolver o modelo, chame:

cplex.solve();

Este método retorna um IloBoolvalue, onde: - IloTrue indica que o CPLEX


encontrou com sucesso uma solução viável (mas não necessariamente ótima)

– IloFalse indica que nenhuma solução foi encontrada

20 / 23
Restrições o modelo

Informações sobre o resultado do algoritmo podem ser obtidos com:

cplex.getStatus();

Valor retornado informa o que o CPLEX:

– encontrou a solução ótima ou apenas viável; ou


– provou que o modelo é ilimitado ou inviável; ou
– nada foi provado neste momento.

21 / 23
Obtendo os Resultados

Métodos de consulta acessam informações sobre a solução obtida.

– Se a variável x é do tipo IloNum (= double), para consultar o valor da solução


use:

IloNum v = cplex.getValue (x);

– Atenção! Às vezes, para variáveis inteiras, o valor não é um número inteiro


apenas “quase” inteiro (por exemplo, 1e-9 em vez de 0).
– O arredondamento explícito pode ser necessário.

Para consultar o valor da solução para um vetor de variáveis:

IloNumVarArray x(env);
...
IloNumArray v(env);
cplex.getValues(v, x);

22 / 23
Modelos de escrita/leitura

– O CPLEX oferece suporte à leitura de modelos de arquivos e a gravação de


modelos em arquivos em vários idiomas
– Para gravar o modelo em um arquivo:

cplex.exportModel ("model.lp");

– O IloCplex decide qual formato de arquivo será gravado com base na


extensão do nome do arquivo (por exemplo, .lp é para o formato LP)
– Isso pode ser útil, por exemplo, para depuração
– Para facilitar ainda mais a depuração, pode-se definir nomes para variáveis e
restrições:

x.setName ("x");
c.setName ("c");

23 / 23

Você também pode gostar