Programación Entera - José Luis de la Fuente O`Connor

Universidad Politécnica de Madrid–Escuela Técnica Superior de Ingenieros Industriales
Grado en Ingeniería en Tecnologías Industriales. Curso 2015-2016-3º
Matemáticas de Especialidad–Ingeniería Eléctrica
Programación Entera
José Luis de la Fuente O’Connor
[email protected]
[email protected]
Clase_Entera_2017.pdf
1/65
2/65
Índice
Introducción, formulación y ejemplos
Resolución gráfica del problema
Relajaciones en la formulación
El algoritmo de los cortes de Gomory
Algoritmos Branch and Bound
Programación no lineal en variables enteras
Introducción
3/65
La programación entera se ocupa de los problemas de optimizar una función de
diversas variables sujeta a condiciones de igualdad y/o desigualdad,
restringiéndose todas o alguna de esas variables a tomar valores enteros.
Sus orígenes se remontan a los años 50 del siglo XX. El pionero fue Ralph
Gomory, EE.UU. 1929.
Las áreas de aplicación práctica son muchas donde hay que asignar recursos sólo
disponibles en cantidades discretas: distribución de mercancías, programación de
la producción en factorías, secuenciación de maquinaria en procesos industriales
y productivos, asignación de grupos generadores de energía eléctrica, cadenas de
suministro, logística, programación de rutas de vuelos, etc.
4/65
La formulación general del problema lineal de Programación Entera es
T
T
maximizar
c
x
C
h
y
x 2Zn y 2Rp
sujeta a
Ax C G y b
x; y 0:
Este problema es un programa entero mixto.
Al conjunto S D fx 2 Zn; y 2 Rp W Ax C G y b; x 0; y 0g se le
denomina región factible.
Un punto Œx T ; y T T 2 S se denomina factible. Al punto Œx T ; y T T 2 S, tal
que
c T x C bT y c T x C hT y; para todo Œx T ; y T T 2 S ;
se le denomina solución óptima del problema.
Al problema en el que todas las variable son enteras,
5/65
max.n c T x
x 2Z
s. a Ax b
x 0;
se le conoce como programa entero puro, programa lineal en variables enteras o,
simplemente, programa entero. Un caso particular de programa entero es aquel
en el que las variables sólo pueden tomar valores 0 ó 1.
En programación entera no existe un método universal, como el simplex de
programación lineal, que obtiene la solución sirviéndose de las propiedades de
convexidad del problema a resolver.
Esto es así porque en programación entera la convexidad desaparece, no
pudiéndose utilizar por tanto la noción de gradiente para caracterizar y buscar el
óptimo de un problema, haciéndose necesario emplear métodos de resolución
específicos del aspecto combinatorio de las variables enteras.
In all these cases, the decision variable must be an integer, since we cannot stop 1.3 times or
build 2.7 distillation columns, or in the latter existence/non-existence example, the variable
will be a binary decision variable. Constrained optimisation problems where the decision
variables are integers are known as integer programming, or a binary linear program if the
variables are constrained to be either zero or one, or finally if only some are required to be
integers, then it is known as a mixed-integer linear programming or MILP problem.
6/65
Es más, los programas enteros,
como muestran los dos primeros ejemplos de la
Surprisingly binary or integer programming problems are much harder to solve than optimisation problems with real number solutions. The reason for this is that being discrete, we
figura, si se quiere minimizar
y, no tienen por qué tener el CHAPTER
óptimo
cerca
del
of possible 8.
solutions
406cannot use gradients or search directions, and therefore the number
OPTIMISATION
combinatorially. Explicit enumeration therefore is quickly out of the question. One
óptimo del programa congrows
variables
ni first
siquiera
óptimo
es un
may
be tempted incontinuas,
this instance to simply
solve the LPel
problem
in the normal
man- entero
ner, andvariables,
then subsequently
this optimum
nearest
integers.
decision
(circlesround
in Fig.
8.57), weresult
see tointhe
fact
there
is no However,
feasible as
region at all,
8.10. próximo
OPTIMISATION
405
a WITH
ese INTEGER
óptimoCONSTRAINTS
continuo
segunda
figura).
illustrated
in(la
Fig.
8.56
thatrelaxed
solutionlinear
may not
be reasonable,
or even
feasible. feasible region.
despite
the fact
that
the
problem
did have
a non-zero
Figure 8.55: A linear programming
problem where we restrict our attenFigure 8.57: Depending on the spaction to integer values of the decision
ing,
a perfectly well-formed linear provector x meaning that the allowable
gram
may
notfallhave
feasiblegrid.
integer
values
of x
on aa regular
solution
at
all.
Note
in
this
example,
Here the optimum of the linear prothere
the feagramare
andno
theintegers,
optimum◦,ofinside
the integer
sible
region.
linear
program are not the same.
Figure 8.56: Note that integer optimum is not simply the truncated or
rounded version of the real-valued
optimum, but could in fact be ‘arbitrarily’ far away.
be other
complications
as well. problems
Consider the
Fig. 8.57 which
ToThere
solvecan
integer
linear
programming
weexample
could shown
do an in
exhaustive
search over all
a perfectly
linear
optimisation
problem
a convex feasiblelarge,
region.soClearly
and worth to place in our small suitcase to maximise
value,
(the valid
’knapsack’
problem),
and
theshows
feasible
integers.
For
large
problems,
this iswith
combinatorially
a better solution
somewhere
in two
that storage
will
be an
optimum, irrespective of what our particular
whether we should or should not install a newstrategy,
pump
between
tanks,
(you
can’t
in fact
oneregion
of thethere
only
known
practical
solution strategies, is to use what is known
objective function happens to be. However when we restrict our attention to just integer
install half a pump!).
as a branch and bound technique, [45, p411–415]. Here we start by solving a relaxed ver-
También puede que la región
factible no registre ni un sólo entero factible,
sion of the original problem, namely we simply ignore the integer constraints, and solve
existiendo dicho espacio en el sentido tradicional.
In all these cases, the decision variable must be an integer, since we cannot stop 1.3 times or
the linear program asexample,
usual. The
term ‘relaxed’ means that we have deliberately relaxed
build 2.7 distillation columns, or in the latter existence/non-existence
the variable
some
of
the
constraints
in
order
to
achieve a solution, albeit perhaps an infeasible one. If
will be a binary decision variable. Constrained optimisation problems where the decision
we happen or
fortuitously
to stumble
variables are integers are known as integer programming,
a binary linear
program across
if the an integer solution, we are done. However in
mostorcases,
will some
not get
integertosolution,
but we do have an under-estimator of the
variables are constrained to be either zero or one,
finallywe
if only
arean
required
be
minimum
cost function.
In the case of Fig. 8.56, we can see that the real-valued optimum
integers, then it is known as a mixed-integer linear
programming
or MILP problem.
7/65
Ejemplos
Gestión de un servicio hospitalario
En un determinado servicio de asistencia hospitalaria hay i enfermos a la espera
de una operación. Cada enfermo necesita una operación de duración Di .
Dada una disponibilidad de cirujanos, la suma de las duraciones de las
operaciones que pueden hacerse cada día j del período de estudio es igual a Tj .
Se trata de minimizar una función económica que refleja la suma de las
penalizaciones por esperas de los diferentes enfermos (esta penalización es una
función lineal creciente de la espera).
8/65
El problema se formula de la siguiente manera:
XX
max.
cij xij
i
s. a
j
X
i
Di xij Tj
X
xij D 1
para todo j
para todo i
j
xij D 0 ó 1
para todo i y j .
La variable de decisión xij es 1 si el enfermo i se le opera el día j y 0 en el
caso contrario.
9/65
El problema de la mochila
Este problema es el más clásico de la programación entera.
Trata de un transportista que dispone de un vehículo con capacidad volumétrica
de transporte b, en el que se pueden alojar diferentes objetos j de volúmenes
aj y valores económicos cj , y que quiere maximizar el valor de lo transportado
en cada viaje.
Su formulación es:
max.
X
s. a
X
cj xj
j
aj xj b
j
xj D 0 ó 1:
Resolución gráfica del problema
10/65
Recordemos de programación lineal que las condiciones de
T
T
maximizar
c
x
C
h
y
x 2Zn y 2Rp
sujeta a Ax C G y b
x; y 0
en el caso en que x 2 Rn y y 2 Rp , definen un politopo (poliedro si es
acotado) en uno de cuyos puntos extremos la función objetivo c T x C hT y
alcanza el máximo.
En general, desafortunadamente, las variables xj es ese punto extremo no
tienen por qué ser enteras.
El politopo contiene todas las soluciones en las que x es entero. Gráficamente
se puede determinar la solución mediante el punto extremo óptimo considerando
las variables como continuas y luego, desplazando c T x C hT y hacia dentro del
politopo, encontrando el primer punto Œx T ; y T T en el que x sea entero.
11/65
Ejemplo Consideremos el problema de programación entera
x 1 + x 2 ≤ 10
x2
−x 1 + 4x 2 ≤ 16
B
max. 23 x1 C x2
s. a
x1 C 4x2 16
x1 C x2 10
5x1 C x2 36
x1 ; x2 0
x1 y x2 enteras.
A
x∗
C
5x 1 + x 2 ≤ 36
f. O.
D
0
x1
Sin tener en cuenta la condición de que las variables han de ser enteras, la
región factible es el poliedro convexo que generan los vértices 0; A; B; C y D
de la figura.
El valor máximo de la función objetivo en este poliedro se alcanza en C .
Como la auténtica región factible la constituyen los puntos interiores enteros de
u
ese poliedro, el máximo del problema se alcanza en el punto x D Œ6; 4T .
12/65
Índice
Introducción, formulación y ejemplos
Resolución gráfica del problema
Relajaciones en la formulación
El algoritmo de los cortes de Gomory
Algoritmos Branch and Bound
Programación no lineal en variables enteras
13/65
Relajaciones en la formulación
La idea es tratar de sustituir el programa entero original por otro más fácil de
resolver en el que se relajan algunas de las condiciones.
La solución de éste proporciona una cota de la función objetivo del problema
original.
Mediante un proceso iterativo que integre estas relajaciones y la resolución de
los subproblemas se puede acotar cada vez más la función objetivo hasta
obtener la solución final.
14/65
Una relajación del programa entero
˚
max. c T x W x 2 S
.PE/
la constituye cualquier subproblema de la forma
max. fzPR .x/ W x 2 SPR g
.PR/
con las propiedades siguientes:
SPR S
y c T x zPR .x/ para x 2 S:
Proposición Si el problema (PR) no es factible, tampoco lo es (PE). Si (PR) es
factible, los valores de las funciones objetivo cumplen que zPE zPR .
15/65
Relajación lineal
La relajación más inmediata resulta de omitir la condición de que las variables
han de ser enteras.
Si el conjunto o región factible del programa entero es S D P \ Zn, la
relajación lineal es
.PL/
max. c x W x 2 P ; P D fx 2 Rn W Ax b; x 0g
˚
T
Proposición Si (PL) es no acotado, el programa entero (PE) es no factible o no
acotado.
16/65
Algoritmo tipo
.1/
Paso 0 – Inicialización Hacer i D 1, w D 1 y z D 1. Escoger un SR S tal que
.1/
zR c T x para x 2 S .
Paso 1 – Relajación Resolver el problema PE relajado:
n
o
.i /
.i /
.i /
R
max. zR .x/ W x 2 SR :
Paso 2 – Comprobación de óptimo Sea x .i / la solución del problema anterior. Si x .i / 2 S:
PARAR ; ésta es la solución óptima de .PE/ con función objetivo w D c T x .i / D
z ; si no, seguir.
.i /
Paso 3 – Mejora de la solución Hacer w D zR , z D c T x .i / si x .i / 2 S y i
i C 1.
.i C1/
.i C1/
.i /
.i C1/
.iC1/
Escoger SR
tal que S SR
SR y zR .x/ tal que c T x zR .x/ .i /
.i C1/
.i /
.i C1/
.i /
zR .x/ para x 2 S con SR
¤ SR o zR .x/ ¤ zR .x/.
Ir al paso 1
17/65
Índice
Introducción, formulación y ejemplos
Resolución gráfica del problema
Relajaciones en la formulación
El algoritmo de los cortes de Gomory
Algoritmos Branch and Bound
Programación no lineal en variables enteras
Algoritmo de planos o cortes de Gomory
Este algoritmo, formulado por Gomory en 1960, es uno de los primeros que se
emplearon para resolver el problema general de programación entera.
Consideraremos que el problema que resuelve –notación original– es
˚
max. c T x W x 2 S .e/ ; donde S .e/ D fx 2 Zn W Ax D b; x 0g;
y está escrito de la siguiente forma:
n
o
T T
.0/
max. x0 W x0; x
2S
;
.PE/
donde
S
.0/
˚
D x0 2 Z; x 2 Zn W x0
T
c x D 0; Ax D b; x 0 :
Supondremos que se dispone de una solución y base óptimas de la relajación
lineal del programa entero.
18/65
19/65
El problema se puede escribir así:
maximizar x0
xBi C
s. a
X
aN ij xj D aN i 0
para i D 0; 1; : : : ; m
(1)
j 2H
xB0 2 Z; xBi 2 ZC ;
xj 2 ZC para j 2 H;
x0 D xB0 , xBi ; i D 1; : : : ; m,
no básicas (xB D B
1b
B
para i D 1; : : : ; m
son las variables básicas y xj ,
1N x
N
y z D cB B
1b
C .cN
cB B
j 2 H N D f1; : : : ; ng,
1 N /x
N.
las
).
Como esta base es factible en el programa primal y dual se cumple que aN i0 0
para i D 1; : : : ; m, y que aN 0j 0, para j 2 H .
Suponiendo existe un i tal que aN i0 … Z, se tiene el siguiente resultado.
Proposición
P
Corte Fraccionario de Gomory Si aN i 0 … Z, j 2H fij xj D fi 0 C xnC1 ; xnC1 2 ZC ,
es una desigualdad válida en S .0/ , donde fij D aN ij baN ij c para j 2 H y fi 0 D aN i 0 baN i 0 c.
20/65
Ejemplo Considérese el programa entero
maximizar 7x1 C 2x2
.PE/
s. a
x1 C 2x2 4
5x1 C x2 20
2x1 2x2 7
x 2 Z2C:
Introduzcamos las variables de holgura x3, x4 y x5. El programa1 queda:
maximizar 7x1 C 2x2
s. a
1
x1 C 2x2 C x3
D
5x1 C x2
C x4
D
2x1 2x2
C x5 D
x1; x2 2 ZCI x3; x4; x5 4
20
7
0:
Aunque las variables de holgura serán enteras, no hay ninguna necesidad de restringirlas a tomar valores
enteros.
Restringiendo las variables x3, x4 y x5 a tomar valores enteros el problema es:
maximizar x0
7x1 2x2
D 0
x1 C 2x2 C x3
D 4
5x1 C x2
C x4
D 20
2x1 2x2
C x5 D 7
x0 2 Z; xj 2 ZC para j D 1; : : : ; 5:
x0
s. a
La solución de la relajación lineal de este programa entero es
C
x0
x1
x2 C
3
x
11 3
1
x
11 3
5
x
11 3
8
x
11 3
C
C
C
C
16
x
11 4
2
x
11 4
1
x
11 4
6
x
11 4
D
D
D
C x5 D
332
11
36
11
40
11
75
:
11
El corte de Gomory que se puede obtener de la primera ecuación
3
5
2
x3 C x4 D
C x6 ;
11
11
11
x6 2 ZC:
21/65
22/65
Paso 0 – Inicialización Hacer
˚
SR.1/ D x0 2 R; x 2 Rn W x0
c T x D 0; Ax D b; x 0 ;
.1/
i D 1 y zR
D x0 .
Paso 1 – Resolución de la relajación lineal Resolver el programa entero relajado
n
o
max. x0 W Œx0 ; x T T 2 SR.i / :
.PR.i/ /
T
Si PR.i / es factible y tiene solución óptima, Œx0.i / ; x .i / T , continuar.
Paso 2 – Comprobación de óptimo Si x .i / 2 ZnC , ésta es la solución óptima del programa entero.
Paso 3 – Comprobación de no factibilidad Si PR.i / no es factible, el programa entero original no es factible.
P
.i /
Paso 4 – Adición de un corte de Gomory Escoger una fila xBi C j 2H .i / aN ij
xj D aN i.i0/ con aN i.i0/ … Z. Hacer
X
fkj xj
xnCi D fk0 ;
k D 1; : : : ; m; xnCi 2 ZC ;
j 2H .i/
el corte de Gomory de esa fila. Hacer
8
<
SR.i C1/ D SR.i / \ x0 2 R; x 2 RnCi W
:
Hacer i
X
j 2H .i /
fkj xj
xnCi
9
=
D fk0 ; x 0 :
;
i C 1 e ir al paso 1.
Algoritmo de los planos o cortes de Gomory
23/65
Cuando se añade un corte, la nueva base, que incluye xnCi como variable
básica, es factible del dual.
La factibilidad del primal se incumple sólo en que xnCi es negativa.
Para reoptimizar el problema lo más adecuado es usar el método dual del
simplex.
Si PR.i / es no acotado, el programa entero, PE, es no acotado o no factible.
Ejemplo, continuación. La última solución de PR.1/ a la que hacíamos
referencia era
16
332
3
C
x0
x1
x2 C
x
11 3
C
x
11 4
D
11
1
x
11 3
C
2
x
11 4
D
36
11
5
x
11 3
C
1
x
11 4
D
40
11
8
x
11 3
C
6
x
11 4
C x5 D
75
11
;
donde x3hD x4 D 0. i
T
.1/
.1/
.1/
.1/
D Œx0 ; x1 ; : : : ; x5  D 332
Es decir x0 ; x .1/
;
11
36 40
; ;
11 11
0; 0;
El corte de Gomory respecto de la tercera ecuación es 115 x3 C 111 x4 D
x6 2 ZC. Añadiéndolo a PR.1/ se obtiene PR.2/ cuya solución es
C 75 x4
x0
C
C 15 x4
x1
C
x2
x3 C
2
x
5 4
1
x
5 4
C x5 C
3
x
5 6
1
x
5 6
D
D
149
5
17
5
x6 D 3
8
x
5 6
11
x
5 6
D
D
29
5
7
5
:
75
11
7
11
.
C x6 ,
24/65
25/65
El corte de Gomory correspondiente a la primera de estas ecuaciones es
2
x C 35 x6 D 45 C x7 , x7 2 ZC . Añadiéndolo a PR.2/ se obtiene PR.3/ , de solución:
5 4
C x4
x0
C 13 x4
x1
x2
x3
C
2
x
3 4
5
x
3 4
2
x
3 4
2
x
3 4
C
C x5
El siguiente corte se elige de la fila x2
C
C x6
2
x
3 4
2
2
1
x4 C x7 D C x8;
3
3
3
x7 D 29
1
x
3 7
5
x
3 7
11
x
3 7
8
x
3 7
5
x
3 7
D
D
D
D
D
11
3
5
3
13
3
11
3
4
:
3
C 53 x7 D 53 . Es2
x8 2 ZC:
La solución óptima de PR.4/ –también del problema original–, es
h
i
.4/
.4/
.4/
.4/
.4/
x0 ; x1 ; : : : ; x6 ; x7 ; x8 D Œ28; 4; 0; 8; 0; 1; 3; 1; 0:
2
Recordemos
2
3
˘
D
2
3
.
3
/
3
D 13 .
26/65
En términos de las variables originales, los tres cortes añadidos al problema son
x2 3, 2x1 C x2 9 y 3x1 C x2 12.
x2
x (1)
x (2)
3
Corte 1
2
x (3)
Corte 2
Corte 3
1
x (4)
1
2
3
4
x1
27/65
Índice
Introducción, formulación y ejemplos
Resolución gráfica del problema
Relajaciones en la formulación
El algoritmo de los cortes de Gomory
Algoritmos Branch and Bound
Programación no lineal en variables enteras
28/65
Algoritmos de ramificación y acotamiento
o Branch and Bound
La idea que los anima es dividir la región factible, S, como si las variables que la
definen fuesen las ramas de un árbol e ir acotando la solución del estudio de
esas ramas.
El conjunto fS .i/ W i D 1; : : : ; kg se denomina división de la región factible, S,
de un programa entero, si [kiD1S .i / D S.
Una división se denomina partición si S .i/ \ S .j / D ; para i; j D 1; : : : ; k,
i ¤ j.
29/65
La división se suele hacer de forma recursiva así:
S = S (0)
S (1)
S (11)
S (12)
S (121)
S (2)
S (13)
S (21)
S (122)
S (22)
30/65
Cuando S Zn y las variables han de ser 0 ó 1, la forma más simple de hacer
la división recursiva apuntada es la indicada en la figura.
S
x1 = 0
x1 = 1
S (0)
x2 = 0
S (1)
x2 = 1
S (00)
x3 = 0
S (000)
x2 = 0
S (01)
x3 = 1
S (001)
x3 = 0
S (010)
x3 = 1
S (011)
x2 = 1
S (11)
S (10)
x3 = 0
S (100)
x3 = 1
S (101)
x3 = 0
S (110)
x3 = 1
S (111)
En la práctica estos métodos necesitan algún procedimiento para eliminar ramas
del árbol de búsqueda que se forma –podarlo–.
31/65
Proposición El árbol de búsqueda se puede podar a partir del nudo correspondiente
a S .i/ si se cumplen cualquiera de las siguientes condiciones:
1. No factibilidad: S .i / D ;.
2. Optimalidad: se ha llegado al óptimo de PE .i / .
.i /
3. Existencia de un valor dominante zPE zPE .
Para no tener que resolver PE .i/ se resuelve su relajación lineal; esto es PL.i/
.i /
.i/
con S .i / SPL y zPL.x/ c T x para x 2 S .i/.
Proposición El árbol de búsqueda puede podarse a partir del nudo correspondiente a
S .i/ si se cumple cualquiera de las condiciones siguientes:
1. El programa PL.i / no es factible.
.i /
.i /
.i /
.i /
2. El óptimo xPL de PL.i / cumple que xPL 2 S .i / y que zPL D c T xPL .
.i /
3. zPL zPE , donde zPE es alguna solución factible de PE.
Ejemplo Considérese el programa entero
32/65
S
x1 = 0
.ZPE /
maximizar
100x1 C 72x2 C 36x3
s. a
2x1 C x2
4x1
C
x1 C x2 C
x 2 Z3 .0; 1/:
0
x3 0
x3 0
x1 = 1
S (0)
S (1)
x2 = 0
x2 = 1
S (10)
S (11)
x3 = 0
x3 = 1
S (110)
La división de este ejemplo y su árbol de búsqueda son los de la figura.
La solución de la relajación lineal es Œ1=2; 1; 1T ; la f.o. 58.
Usando la última proposición para podar el árbol de búsqueda,
S .0/ D fx 0 W x1 D 0; x2 0; x3 0; x2 C x3 1g D ;;
por lo que el nudo S .0/ se desecha.
S (111)
33/65
La condición de óptimo de los nudos S .110/ y S .111/ se cumple pues estos
conjuntos contienen las soluciones Œ1; 1; 0T y Œ1; 1; 1T , respectivamente.
Como, zPE < zPE D 8, se tendrá que zPE D zPE D 8.
Aplicando la tercera condición de la mencionada proposición al nudo S .10/ se ve
.10/
que zPL D 64 < zPE , por lo que se desecha.
Como resultado final se obtiene que x D Œ1; 1; 1T es la solución óptima del
programa entero.
El valor de su función objetivo es ZPE D 8.
.110/
.111/
.111/
u
34/65
Paso 0 – Inicialización Hacer L D fPEg, S .0/ D S , z .0/ D 1 y zPE D 1.
Paso 1 – Comprobación de final Si L D ;, la solución x que daba la función objetivo zPE D c T x es la
óptima.
Paso 2 – Selección de problema, relajación lineal y resolución Seleccionar y borrar de L un problema PE .i / .
.i /
Resolver su relajación lineal PL.i/ . Sea zPL el valor óptimo de la función objetivo de este problema
.i/
y xPL su solución óptima (si existe).
.i/
Paso 3 – Poda Si zPL zPE ir al paso 1 (nótese que si la relajación se resuelve por un algoritmo dual, este
paso es aplicable tan pronto como el valor de la función objetivo del programa dual se hace
inferior a zPE ).
.i/
Si xPL … S .i/ ir al paso 4.
.i/
.i/
.i /
Si xPL 2 S .i/ y c T xPL > zPE , hacer zPE D c T xPL . Borrar de L todos los problemas tales
.i/
.i /
que z .i/ zPE . Si c T xPL D zPL ir al paso 1; si no, al paso 4.
Paso 4 – División Sea fS .ij / gjkD1 una división de S . Añadir los problemas fPE .ij / gjkD1 a L, donde z .ij / D
.i/
zPL para j D 1; : : : ; k .
Ir al paso 1.
Algoritmo Branch and Bound
L designa una colección de programas enteros, PE .i/, cada uno tiene la forma
.i /
zPE D max. fc T x W x 2 S .i/g, donde S .i/ S .
35/65
Branch-and-bound con relajación lineal
Consideraremos los programas enteros generales
˚
.PE/
max. c T x W x 2 S ; con S D fx 2 Zn W Ax b; x 0g ;
y la forma de resolverlos
Mediante esta relajación, el conjunto factible, S, se reemplaza por
.0/
SPL D fx 2 Rn W x 0; Ax bg,
haciéndose en cada relajación zPL.x/
D c T x.
a i = 1, 2, zP L = max. {cT x : x ∈ SP L } < zP L .
EnDivisión
la práctica sólo
usan vectores [dT , d0 ]T muy concretos:
de seramas
36/65
• Dicotomı́as de variables. En este caso d = ej para algún j ∈ N . El punto x(0) será n
(0)
factible
en
las
relajaciones
resultantes
si
x
∈
/ Z y d0 = xj (ver figura 13.5). Nótes
j
Como se usa relajación lineal, la división se debe hacer
con condiciones lineales.
que si xj ∈ B la rama izquierda hace xj = 0 y la derecha xj = 1.
La forma más conveniente de hacerlo es como indica la figura.
xj ≤ xj xj ≥ xj + 1
Es decir, desde el nudo que define
la solución
Figura
13.5 correspondiente, si esta no tiene
algunoDivisión,
de sus elementos,
j , que
havariable
de ser entero,
entero,
hace partir dos
por dicotomı́a
de la
xj , en un
árbol se
enumerativo
ramas: una en la que ese xj se acote superiormente por su entero inmediato
Una
importante
ventaja
práctica
de esta división
es que superior.
las condiciones que se añade
inferior;
otra que
se acote
inferiormente
por su entero
a la relajación lineal correspondiente son simples cotas inferiores o superiores. Sólo ser
Usaremos indistintamente estos términos.
Los dos nuevos programas se pueden resolver mediante el método dual del
simplex; el tamaño de la base seguirá igual.
37/65
Selección del nudo a estudiar
Proposición Si P D fx 2 Rn W Ax b; x 0g es acotado, el árbol de búsqueda
desarrollado a partir de dicotomías de las variables es finito. En particular, si
P!j D dmKaxfxj W
x 2 P ge, ningún camino del árbol de búsqueda puede contener más de j 2N !j ramas.
Proposición Si el nudo t del árbol de búsqueda con conjunto de condiciones S .t / es
.t /
tal que max. fc T x W x 2 SPL g > zPE , ese nudo no se puede podar o rechazar.
Dada una lista L de subárboles del árbol de búsqueda con nudos no rechazados,
qué nudo elegir como el próximo a examinar.
Dos opciones:
8
ˆ
< Analizar uno siguiendo unas reglas preestablecidas; o
ˆ
: Escogerlo según la información disponible en ese punto sobre
cotas de las variables, número de nudos activos, etc.
Existen varias reglas preestablecidas que se pueden utilizar. La más extendida es
la denominada LIFO (del inglés Last In First Out).
LIFO: Primero analizar todos los nudos “hijos"de uno determinado y luego
volver hacia atrás y escoger otro del mismo nivel del nudo “padre” que no haya
sido analizado.
38/65
1
2
3
5
4
6
7
9
8
Los nudos subrayados son los podados o rechazados.
Ventajas:
8 La relajación lineal de un nudo hijo se obtiene de la lineal del nudo padre sin más que
ˆ
ˆ
ˆ
< añadir una cota en una variable. El método dual del simplex, sin reinvertir la base ni
modificar las estructuras de datos sustancialmente, obtiene muy rápidamente la solución
que define el nudo hijo.
ˆ
ˆ
ˆ
: La experiencia dice que las soluciones factibles se encuentran más bien en puntos profundos del árbol de búsqueda.
Otra regla: Búsqueda en amplitud o anchura. Analizar todos los nudos de un
determinado nivel antes de pasar a otro más profundo. En códigos
especializados en variables binarias.
39/65
Un código “sencillo” recursivo de Matlab para resolver un Programa Entero:
function [xstar,Jmin] = ilp_bb_1(c,A,b,xlb,xub,xstar,Jmin)
% Integer linear programming by (recursive) branch & bound
% This algorithm uses linprog.m from the optimisation toolbox
tol = 1e-5;
% anything less is considered zero
if ~exist(’xlb’,’var’), xlb = 0*c; end % canonical form (for the moment)
if ~exist(’xub’,’var’), xub = Inf*ones(size(c)); end
% Upper bound defaults
if ~exist(’xstar’,’var’), xstar = []; end
if ~exist(’Jmin’,’var’), Jmin = Inf; end
% Try to minimise this
% Use the following two line if you prefer OPTI Optimization toolbox
% LPrelax = opti(’f’,c,’ineq’,A,b, ’bounds’, xlb, xub);
% [x,j,exitflag] = solve(LPrelax);
optns = optimset(’display’,’off’);
% turn off diagnostics in Linprog
[x,j,exitflag] = linprog(c,A,b,[],[],xlb,xub,[],optns);
if exitflag~=1, return, end
% if infeasible, branch ended
if j>Jmin, return, end
% if current cost J=cT x is worse, drop
idx = find(abs(x-round(x)) > tol);
% which are non-integers ?
if isempty(idx)
% All integer solutions
if j<Jmin, xstar=round(x); Jmin=j; end % New integer optimum
return
% problem solved
end
% Depth first recursion
xnlb = xlb; xnlb(idx(1)) = ceil(x(idx(1)));
% Take x<--int. greater than x
[xstar,Jmin] = ilp_bb_1(c,A,b,xnlb,xub,xstar,Jmin);
xnub = xub; xnub(idx(1)) = floor(x(idx(1)));
% Take x<--int. less than x
[xstar,Jmin] = ilp_bb_1(c,A,b,xlb,xnub,xstar,Jmin);
end
40/65
Ejemplo Resolvamos este problema de programación entera
minimizar
s. a
x1 C 10x2
66x1 C 14x2 1430
82x1 C 28x2 1306
x1 ; x2 enteras; 0:
Con el programa presentado
>> c3=[1;10]
>> A3=[-66 -14;82 -28]
>> b3=[-1430;-1306]
>> [xreal,jreal]=linprog(c3,A3,b3)
Optimization terminated.
xreal =
7.261682243025319
67.909212283785493
jreal =
6.863538050808803e+002
>> [xint,j]=ilp_bb_1(c3,A3,b3)
xint =
7
70
j =
707
41/65
Con la herramienta OPTI Toolbox
>> f1=[1 10]’;
>> A1=[-66 -14; 82 -28];
>> b1=[-1430 -1306]’;
>> lb = [0;0]; ub = [];
>> xtype = ’II’;
>> Opt=opti(’f’,f1,’ineq’,A1,b1,’lb’,lb,’xtype’,xtype)
-----------------------------------------------------Mixed Integer Linear Program (MILP) Optimization
min f’x
s.t. rl <= Ax <= ru
lb <= x <= ub
xi = Integer / Binary
-----------------------------------------------------Problem Properties:
# Decision Variables:
2
# Constraints:
6
# Linear Inequality:
2
# Bounds:
2
# Integer Variables:
2
-----------------------------------------------------Solver Parameters:
Solver:
CBC
----------------------------------------------------->> [xi,fval]=solve(Opt)
xi =
7
70
fval =
707
>> plot(Opt)
75
MILP Optimization Contours + Constraints - Min: [7; 70] Fval: 707
760
750
750
74
740
740
73
730
730
72
720
720
71
x2
710
710
70
700
700
69
690
690
68
680
680
67
670
670
66
660
65
2
3
4
5
6
7
x1
8
660
9
10
11
12
42/65
Resolvámoslo ahora con el software BBMI de programación entera y lineal. El
fichero de datos que requeriría este problema es el que sigue
PROCESO ITERATIVO
NAME
Ej12.2.3
ROWS
N OBJ
G FILA1
G FILA2
COLUMNS
INT
X1
OBJ
X1
FILA2
X2
OBJ
X2
FILA2
RHS
RHS
FILA1
RHS
FILA2
ENDATA
1
-82
10
28
1430
1306
FILA1
66
FILA1
14
665
Ejercicios
La gráfica de cómo opera BBMI es esta:
43/65
66x1 + 14x2 ≥ 1430
x2 = 74
−82x1 + 28x2 ≥ 1306
x2 = 73
c
x2 = 72
4
x2 = 71
x2 ≥ 68
∗
8
x2 = 70
1
x2 ≤ 67
3
2
11
x2 = 69
x2 = 68
6=7
2
1
x2 ≥ 71
x1 ≥ 8
x1 ≤ 7
3
6
x2 ≤ 70
x1 ≤ 6
4
x2 = 67
x1 = 7
x1 = 8
x1 = 9
x2 ≥ 70
7
x2 ≤ 69
8
5
x1 = 6
x1 = 7
10
9
El resultado impreso de BBMI se lista a continuación.
Problema Ej12.2.3
*** Estadísticas del Problema
3 Fila(s)
2 Restricción(es)
2 Variable(s) de decisión
2 Variable(s) de holgura/artificiales
6 Elementos no cero
2 Variable(s) entera(s)
Densidad de la matriz de coeficientes A: 100.000%
*** Estadísticas de INVERT
3 elementos no cero en la base
0 columnas estructurales en la base
0 vectores columna antes del "bump"
3 vectores columna después del "bump"
L:
0 elementos no cero;
0 vectores ETA
U:
2 elementos no cero;
2 vectores ETA
Total:
0 elementos no en la diagonal;
2 vectores ETA
Máximo de transformaciones ETA:
2; máximo número de elementos ETA:
Error relativo en x:
.000000D+00
Ite. Inf. Nopt. Sum.Inf/F.Obj Entra de-a Cost.Red Sale de-a
Paso
Pivote El.Eta
1
2
1
.2736000D+04
2 L->B -.42D+02
3 B->L
2
0
1
.6863538D+03
1 L->B -.46D+02
4 B->L
9
.10D+03 -.14D+02
.73D+01 .21D+03
2
5
--- SOLUCIÓN INICIAL PROGRAMA LINEAL ---------------------------------Nombre del problema: Ej12.2.3
No. de iteraciones:
3
Valor de la función objetivo:
686.353805073431
*** FILAS
No. ..Fila.. en ....Valor.... ...Holgura... .Lí.Inferior. .Lí.Superior. Val.Dual.
1 OBJ
2 FILA1
3 FILA2
BS 686.35381
LI 1430.0000
LI 1306.0000
-686.35381
.00000000
.00000000
Ninguno
1430.0000
1306.0000
Ninguno
Ninguno
Ninguno
1.000
.2830
.2156
*** COLUMNAS
No. .Columna en ....Valor.... Coste en F.O. .Lí.Inferior. .Lí.Superior. Cos.Red.
1 X1
2 X2
BS 7.2616822
BS 67.909212
1.0000000
10.000000
.00000000
.00000000
Ninguno
Ninguno
.000
.000
44/65
45/65
Variable
Separación
Iteración
2
1
2
Nivel
Dirección
Func. Obj.
1
X> 68
2
X>
8
3
X> 71
Nudos
en Lista
1
2
3
* Nueva solución entera; z(PE)=
Variables
Ent. No Ent.
2
1
1
Valor
4 D
6 D
7 D
718.00000; Tiempo desde última:
6.8724242D+02
7.0871429D+02
7.1800000D+02
.0001 seg.
--- SOLUCIÓN ENTERA ----------------Tiempo desde última:
.0001 seg.
Nombre del problema: Ej12.2.3
No. de iteraciones:
7
Valor de la función objetivo:
718.000000000000
*** FILAS
No. ..Fila.. en ....Valor.... ...Holgura... .Lí.Inferior. .Lí.Superior. Val.Dual.
1 OBJ
2 FILA1
3 FILA2
BS 718.00000
BS 1522.0000
BS 1332.0000
-718.00000
92.000000
26.000000
Ninguno
1430.0000
1306.0000
Ninguno
Ninguno
Ninguno
1.000
.1269E-15
.1349E-16
*** COLUMNAS
No. .Columna en ....Valor.... Coste en F.O. .Lí.Inferior. .Lí.Superior. Cos.Red.
1 X1
2 X2
Variable
Separación
Iteración
2
1
2FIJ
LIB 8.0000000
LIB 71.000000
1.0000000
10.000000
Nivel
Dirección
Func. Obj.
3
X< 70
2
X<
7
1
3
X> 70
Nudos
en Lista
2
1
3
* Nueva solución entera; z(PE)=
8.0000000
71.000000
Variables
Ent. No Ent.
707.00000; Tiempo desde última:
Tiempo desde última:
.0001 seg.
Nombre del problema: Ej12.2.3
No. de iteraciones:
10
Valor de la función objetivo:
1.00
10.0
Valor
-Nudo desechado en BKTRAK- 1.0000000D+20
0
9 P
6.9842857D+02
1
10 D
7.0700000D+02
--- SOLUCIÓN ENTERA -----------------
*** FILAS
Ninguno
Ninguno
707.000000000000
.0001 seg.
No. ..Fila.. en ....Valor.... ...Holgura... .Lí.Inferior. .Lí.Superior. Val.Dual.
1 OBJ
2 FILA1
3 FILA2
BS 707.00000
BS 1442.0000
BS 1386.0000
-707.00000
12.000000
80.000000
Ninguno
1430.0000
1306.0000
Ninguno
Ninguno
Ninguno
1.000
.1269E-15
.1349E-16
*** COLUMNAS
No. .Columna en ....Valor.... Coste en F.O. .Lí.Inferior. .Lí.Superior. Cos.Red.
1 X1
2 X2
Variable
Separación
Iteración
2
1
2
EQB 7.0000000
LIB 70.000000
1.0000000
10.000000
Nivel
Dirección
Func. Obj.
3
X< 69
3
X<
6
1
X< 67
7.0000000
70.000000
Nudos
en Lista
2
1
0
Ninguno
Ninguno
Variables
Ent. No Ent.
1.00
10.0
Valor
-Nudo desechado en BKTRAK- 1.0000000D+20
-Nudo desechado en BKTRAK- 7.4457143D+02
-Nudo desechado en BKTRAK- 1.0000000D+20
--- SOLUCIÓN ENTERA OPTIMA -----------------------Nombre del problema: Ej12.2.3
No. de iteraciones:
10
Valor de la función objetivo:
707.000000000000
*** FILAS
No. ..Fila.. en ....Valor.... ...Holgura... .Lí.Inferior. .Lí.Superior. Val.Dual.
1 OBJ
2 FILA1
3 FILA2
BS 707.00000
BS 1442.0000
BS 1386.0000
-707.00000
12.000000
80.000000
Ninguno
1430.0000
1306.0000
Ninguno
Ninguno
Ninguno
1.000
.1269E-15
.1349E-16
*** COLUMNAS
No. .Columna en ....Valor.... Coste en F.O. .Lí.Inferior. .Lí.Superior. Cos.Red.
1 X1
2 X2
EQB 7.0000000
LIB 70.000000
1.0000000
10.000000
Tiempo total de CPU en cálculos:
7.0000000
70.000000
.0603 segundos
Ninguno
Ninguno
.000
10.0
46/65
47/65
Para darnos una idea de las prestaciones de estos algoritmos, resolvamos un
problema relativamente difícil de Programación Entera con 50 variables, todas
enteras, y cuya matriz de condiciones tiene este esquema:
0
5
10
15
20
25
30
35
40
0
10
20
30
40
50
nz = 221
Lo vamos a resolver con el solver de PE de OPTI Toolbox y con ilp_bb_1
Con OPTI Toolbox:
>> prob_1 = coinRead(’DEMOS5_noint.mps’);
>> spy(prob_1.A);
>> Opt_1 = opti(’f’,-prob_1.f,’ineq’,prob_1.A,prob_1.ru,’bounds’,prob_1.lb,prob_1.ub,’xtype’,xtype)
-----------------------------------------------------Mixed Integer Linear Program (MILP) Optimization
min f’x
s.t. rl <= Ax <= ru
lb <= x <= ub
xi = Integer / Binary
-----------------------------------------------------Problem Properties:
# Decision Variables:
50
# Constraints:
191
# Linear Inequality:
41
# Bounds:
100
# Integer Variables:
50
-----------------------------------------------------Solver Parameters:
Solver:
CBC
----------------------------------------------------->> tic,[x,fval,exitflag,info] = solve(Opt_1),toc
x =
1.0000
1.0000
1.0000
1.0000
0
1.0000
1.0000
0
1.0000
0
0
1.0000
1.0000
1.0000
1.0000
0
1.0000
1.0000
1.0000
0
0
1.0000
1.0000
0
1.0000
1.0000
0
48/65
1.0000
1.0000
1.0000
1.0000
1.0000
0
1.0000
0
0
0
0
0
1.0000
0
0
1.0000
0
0
0
1.0000
0
1.0000
1.0000
fval =
-1046
exitflag =
1
info =
Nodes:
AbsGap:
RelGap:
Time:
Algorithm:
Status:
2
24.9233
0.0238
0.0581
’CBC: Branch and Cut using CLP’
’Integer Optimal’
Elapsed time is 0.060537 seconds.
>>
Con ilp_bb_1:
>> tic,[xint,j]=ilp_bb_1(-prob.f,A,prob_1.ru,prob_1.lb,prob_1.ub),toc
xint =
1
1
1
1
0
1
1
0
1
0
0
1
1
1
1
0
1
1
1
0
0
1
1
0
1
1
0
1
1
1
1
1
0
1
0
0
0
0
0
1
0
0
1
0
0
0
1
0
1
1
j =
-1.0460e+03
Elapsed time is 7295.551641 seconds.
>>
49/65
El tiempo empleado es inaceptable.
La estrategia es mala al no considerar ninguna forma de ahorrarse visitar todos los nudos del árbol de
búsqueda.
Selección de la variable de ramificación
50/65
Es evidente que para mejorar las prestaciones de un algoritmo Branch and
Bound es necesario hacer algo que evite visitar todos los nudos del árbol de
búsqueda de soluciones enteras. Veamos lo que hace BBMI.
Supongamos que se ha elegido i como el nudo que se va a analizar. Asociado a
ese nudo habrá un programa lineal de solución x .i/,
n
X
xBi D aN i0 C
aN ij . xj /
para i D 1; : : : ; mI
j DmC1
P
la función objetivo es x0 D aN 00 C jnDmC1 aN 0j . xj /: Los aN 0j ,
j D m C 1; : : : ; n, son los costes reducidos de las variables no básicas.
El paso siguiente de escoger la variable que va a definir la ramificación o división
que parta de i es crítico para las prestaciones del procedimiento. Apuntemos
alguna estrategia de mejora.
51/65
Penalizaciones de variables básicas
Supongamos que en el nudo i alguna variable básica xp no es entera debiendo
serlo, es decir
n
X
xp D aNp0 C
aNpj . xj / D np0 C fp0;
j DmC1
donde np0 designa la parte entera de xp , bxp c, y fp0 la parte fraccionaria.3
La división que definirá la variable xp es
xp np0 C 1 y xp np0:
3
Recordemos b3; 22c D 3; b 4; 12c D
5.
52/65
Del algoritmo dual del simplex podemos deducir que la imposición de la nueva
cota xp np0 C 1 a la variable xp implicará un empeoramiento (reducción) del
valor de la función objetivo.
Como la variable básica xp , realizando una iteración del método dual del
simplex, pasaría como mínimo a ser no básica, otra variable no básica, xj ,
que estuviese en uno de sus límites, se incrementaría o decrementaría según
estuviese en el inferior o superior.
Es decir, se reduciría el valor de la función objetivo en una cantidad o
penalización que vendría dada por la expresión
PU D
8
ˆ
< mKınj;aNpj <0 .1
fp0/
aN 0j
;
aNpj
si xj D lj ; o por
ˆ
: mKınj;aNpj >0 .1
fp0/
aN 0j
;
aNpj
si xj D uj :
Razonando de manera similar, la imposición de la nueva cota xp np0 a la
variable xp implicará un empeoramiento (reducción) del valor de la función
objetivo que vendrá dado por la expresión
PD D
8
< mKınj;aNpj >0 fp0 aN 0j ;
aNpj
aN 0j
: mKın
j;aNpj <0 fp0 aNpj ;
si xj D uj :
Cualquier solución entera que se pudiese obtener partiendo del nudo i estaría
por consiguiente acotada superiormente por
mKaxfx0
si xj D lj ;
PU ; x0
PD g:
Se podrá conseguir una mejor solución desde el nudo i si y sólo si
mKınfPU ; PD g < x0
zPE
para cada variable básica que no sea entera debiendo serlo.
Si esta condición no se cumple se abandona el nudo i .
53/65
54/65
Si todas las variables xp cumplen esa condición, la cuestión siguiente a solventar
es qué variable de ramificación se elige.
Se puede elegir aquella con la penalización asociada más pequeña.
O escoger aquella variable con una penalización asociada más grande y
comenzar imponiendo el límite opuesto al que determina esa penalización.
Si, por ejemplo, la penalización más grande asociada a una variable xp es PU ,
comenzar analizando el problema que resulte de imponer a esa variable la nueva
cota np0 e incluir en la lista de nudos a analizar más adelante el que resulte de
imponer la cota np0 C 1.
Si se almacenan las peores soluciones, una vez que se encuentre una buena, se
rechazarán rápidamente buena parte de los nudos que queden en la lista.
Penalizaciones de variables no básicas
55/65
Posibles cambios en variables no básicas que impondrían nuevas cotas en el
nudo i . Cualquier solución entera estaría acotada por
mKaxfx0
PU ; x0
PD g;
donde ahora
PU
D
(
8
aN 0j .1 fp0 /=. aNpj /;
ˆ
ˆ
ˆ
mK
ı
n
ˆ
j;
a
N
<0
pj
<
mKaxfaN 0j ; aN 0j .1 fp0 /=. aNpj /g;
(
ˆ
aN 0j .1 fp0 /=. aNpj /;
ˆ
ˆ
ˆ
: mKınj; aNpj >0
mKaxfaN 0j ; aN 0j .1 fp0 /=. aNpj /g;
j 2M
)
j 2J
)
j 2M
j 2J
si xj D lj
si xj D uj
y
PD
D
(
8
aN 0j fp0 =aNpj ;
ˆ
ˆ
ˆ
ˆ
< mKınj; aNpj >0 mKaxfaN ; aN f =aN g;
0j
0j p0
pj
(
ˆ
aN 0j fp0 =aNpj ;
ˆ
ˆ
ˆ
: mKınj; aNpj <0
mKaxfaN 0j ; aN 0j fp0 =aNpj g;
j 2M
)
j 2J
)
j 2M
j 2J
si xj D lj
si xj D uj :
J es el conjunto de índices de las variables no básicas que han de ser enteras y
M el de las no básicas que no han de ser enteras.
56/65
El nudo i se podrá desechar si, para cualquier xp a la que se introducen nuevas
cotas,
mKınfPU ; PD g x0 zPE :
Este criterio no es el único; recordemos el corte de Gomory asociado a xp ,
fp0 C
n
X
fpj xj 0;
j DmC1
que se habría de satisfacer en cualquier solución que se obtuviese partiendo del
problema actual.
Asociado a ese corte de Gomory se puede derivar la penalización
8
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
mKınj
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
<
PG D ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
mKınj
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
ˆ
:
8
ˆ
fp0 aN 0j =aNpj
ˆ
ˆ
ˆ
ˆ
< .1 fp0 /aN 0j =. aNpj /
ˆ
fp0 aN 0j =fpj
ˆ
ˆ
ˆ
ˆ
: .1 f /aN =.1 f /
p0 0j
pj
8
ˆ
fp0 aN 0j =aNpj
ˆ
ˆ
ˆ
ˆ
< .1 fp0 /aN 0j =. aNpj /
ˆ
fp0 . aN 0j /=fpj
ˆ
ˆ
ˆ
ˆ
: .1 f /. aN /=.1
p0
0j
9
j 2M>
>
>
>
>
j 2M=
si aNpj 0
si aNpj < 0
si fpj fp0 j 2 J >
>
>
>
>
si f > f j 2 J ;
pj
si xj D lj I
p0
si aNpj 0
j
si aNpj > 0
j
si fpj fp0 j
fpj / si fpj > fp0 j
9
2M>
>
>
>
>
2M=
2J >
>
>
>
>
2J ;
si xj D uj :
Se puede comprobar que
PG mKın.PU ; PD /;
lo que trae como consecuencia que el nudo i se podrá desechar si, para
cualquier xp a la que se introducen nuevas cotas,
PG x0
zPE :
57/65
Ejemplo Volvamos al ejemplo: maximizar 7x1 C 2x2
x1 C 2x2 4
5x1 C x2 20
2x1 2x2 7
x 2 Z2C :
s. a
58/65
Con las variables de holgura x3, x4 y x5, la relajación lineal da la solución
C
x0
x1
x2 C
3
x
11 3
1
x
11 3
5
x
11 3
8
x
11 3
C
C
C
C
16
x
11 4
2
x
11 4
1
x
11 4
6
x
11 4
D
D
D
C x5 D
332
11
36
11
40
11
75
;
11
donde x3 D x4 D 0.
.0/
De aquí que zPL D x0 D 332=11 y x .0/ D Œ36=11; 40=11; 0; 0; 75=11T .
Trabajemos con las penalizaciones que incluye BBMI. Las variables básicas son
x1, x2 y x5. Esta última no se requiere que sea entera. Las variables no básicas
de la solución obtenida están todas en su límite inferior.
59/65
Para empezar, como todavía no tenemos ninguna solución factible de zPE ,
determinemos las penalizaciones por bifurcar a:
x1 3 W
0
P1D
x1 4 W
0C
P1U
x2 3 W
0
P2D
D mKınj; aNpj >0 faN 0j fp0 =aNpj ; j 2 M g D
mKın
D mKınj; aNpj <0 faN 0j .1
fp0 /=. aNpj /; j 2 M g D mKın
D mKınj; aNpj >0 faN 0j fp0 =aNpj ; j 2 M g D
mKın
16
11
3
11
.1
16
11
7
11
3
11
2
11
3
/
11
D 24
I
11
1
; 3
11 11
1
11
7
11
24
D 11
I
5
11
D
21
:
55
0C
La penalización P2D
la podemos considerar 1 pues de la solución del programa
lineal anterior se observa que al incrementar la variable x2, x3 y x4 decrecen.
De las penalizaciones calculadas, la mejor (menos mala) se obtiene al hacer
5
1
40
x2 3. Añadamos esa condición, es decir, x2 D 11
x
x 3.
3
11
11 4
60/65
La relajación lineal resultante anterior más esta condición queda:
C
x0
x1
x2 C
3
x
11 3
1
x
11 3
5
x
11 3
8
x
11 3
5
x
11 3
C
C
C
C
16
x
11 4
2
x
11 4
1
x
11 4
6
x
11 4
1
x
11 4
D
D
D
C x5
D
C x6 D
332
11
36
11
40
11
75
11
7
:
11
Después de una iteración del método dual del simplex se llega a la solución
óptima siguiente:
x0
.1/
C 75 x4
C 15 x4
C 35 x6
1
x
x1
5 6
x2
C x6
2
x C x5 C 85 x6
5 4
11
x3 C 15 x4
x
5 6
D 149
5
17
D 5
D 3
D 29
5
D 75 :
De aquí que zPL D x0 D 149=5 y x .1/ D Œ17=5; 3; 7=5; 0; 29=5T , con x6 D 0.
La única variable que debe ser entera en esta solución y no lo es x1.
61/65
Calculemos ahora las penalizaciones por bifurcar a:
x1 3 W
1
P1D
x1 4 W
1C
P1U
D mKınj; aNpj >0 faN 0j fp0 =aNpj ; j 2 M g D
mKın
D mKınj; aNpj <0 faN 0j .1
fp0 /=. aNpj /; j 2 M g D mKın
2
5
7
5
3
5
.1
1
5
D 14
5
2
/ 15 D 95 :
5
De estas penalizaciones la mejor se obtiene al hacer x1 4. Añadamos la
1
condición x1 D 17
x C 15 x6 4.
5
5 4
La relajación lineal resultante anterior más esta condición queda:
C 75 x4
C 15 x4
x0
x1
x2
C
3
x
5 6
1
x
5 6
C
2
x C x5 C
5 4
x3 C 15 x4
1
x
C
5 4
x6
8
x
5 6
11
x
5 6
1
x
5 6
D 149
5
17
D 5
D 3
D 29
5
D 57
x7 D 35 :
Otra iteración del dual del simplex obtiene la primera solución factible entera
x .2/ D Œ4; 0; 8; 0; 1T , con zPE D 28.
62/65
Después se analizaría el nudo 3, rechazándose inmediatamente pues del cálculo
anterior de penalizaciones se vería que la función objetivo obtenible sería
1
149=5 P1D
D 135=5 D 27 < 28. Posteriormente también se rechazaría el
nudo 4.
0
x2 ≤ 3
x2 ≥ 4
1
4
x1 ≤ 3
x1 ≥ 4
3
2
Solución entera.
x(2) = [4, 0, 8, 0, 1]T
(2)
zP L = z P E = zP E = 28
Programación No lineal en variables Enteras
63/65
La dificultad de estos problemas aumenta considerablemente, pero nada impide
utilizar la estrategia Branch and Bound utilizando un solver no lineal –fmincon
por ejemplo– en vez del lineal que hemos presentado. El código de antes
adaptado para resolver un Programa Entero no lineal es éste:
function [xstar,Jmin] = inlp_bb(fun,x0,A,b,xlb,xub,NLCon,xstar,Jmin)
% [xstar,Jmin] = ilp_bb(fun,x0,A,b,xlb,xub,NLCon,xstar,Jmin)
% Integer Non-linear programming by (recursive) branch & bound
% Uses fmincon.m from the optimisation toolbox to solve the relaxed problem
optns = optimset(’display’,’off’); tol = 1e-3; % anything less is zero
if ~exist(’xlb’,’var’),
xlb = 0*x0; end
if ~exist(’xub’,’var’),
xub = Inf*ones(size(x0)); end
if ~exist(’xstar’,’var’), xstar = []; end
if ~exist(’Jmin’,’var’), Jmin = Inf; end
% Now solve relaxed NL constrained problem
[x,j,exitflag] = fmincon(fun,x0,A,b,[],[],xlb,xub,NLCon,optns);
if exitflag <1; return, end
% disp(exitflag) if infeasible or not OK
if j>Jmin + tol; return, end
% for robustness; truncate
idx = find(abs(x-round(x)) > tol);
% which are non-integers?
if isempty(idx)
% All integer solutions
if j<Jmin, xstar=round(x); Jmin=j; end
% New integer optimum
return
% problem solved
end
% Depth first recursion
xnlb = xlb; xnlb(idx(1)) = ceil(x(idx(1)));
% new lower bound
[xstar,Jmin] = inlp_bb(fun,x,A,b,xnlb,xub,NLCon,xstar,Jmin);
xnub = xub; xnub(idx(1)) = floor(x(idx(1)));
[xstar,Jmin] = inlp_bb(fun,x,A,b,xlb,xnub,NLCon,xstar,Jmin);
end
Resolviendo
64/65
minimizar .x1
sujeta a
5/2 C .x2
0;4 .x1
7/2
x1 x2 .x2 C 1/
5;7/3 4;2 C x2 0
0;53x1 C x2 10
1;1x1 C x2 5:
Partiremos del punto x 0 D Œ2;5; 1;5T .
MINLP Optimization Contours + Constraints - Min: [3; 8] Fval: -211
-8
00
0
11
-80
10
0
00
200
9
0
-60
-4
-2
0
8
00
3
8
00
>> A=[0.53 1; -1.1 1]; b=[10,5]’;
>> lb=[0;0]; ub=[10;10];
>> x0=[2.5,1.5]’;
>> fun1=@(x) (x(1)-5).^2+(x(2)-7).^2-x(1)*x(2)*(x(2)+1);
>> [xstar,Jmin]=inlp_bb(fun1,x0,A,b,lb,ub,@circlecon)
xstar =
-200
12
-1
20
0
-1
00
0
-6
-40
0
13
x2
-40
7
0
Jmin =
6
-20
0
-211
5
0
>> plot(Opt)
4
3
-2
-1
0
1
2
3
x1
La rutina con la condición no lineal es
function [c,ceq] = circlecon(x)
c = 0.4*(x(1)-5.7)^3+x(2)-4.2;
ceq = [];
end
4
5
6
7
8
65/65
Con la herramienta OPTI Toolbox
MINLP Optimization Contours + Constraints - Min: [3; 8] Fval: -211
-8
0
20
0
00
0
-80
0
-60
-4
200
00
0
-2
0
00
8
x =
-40
0
7
3
8
-1
-1
00
0
00
-6
-40
fun=@(x) (x(1)-5).^2+(x(2)-7).^2-x(1)*x(2)*(x(2)+1);
A=[0.53 1; -1.1 1]; b=[10,5]’;
13
lb=[0;0]; ub=[10;10];
nlcon=@(x) 0.4*(x(1)-5.7)^3+x(2);
12
nlrhs=4.2;
11
x0=[2.5,1.5]’;
xtype = ’II’;
10
Opt=opti(’fun’,fun,’ineq’,A,b,’bounds’,lb,ub,’nlcon’,nlcon,’nlrhs’,nlrhs,’xtype’,xtype)
9
[x,fval] = solve(Opt,x0)
-200
>>
>>
>>
>>
>>
>>
>>
>>
>>
x2
6
-20
0
5
0
fval =
-211
>> plot(Opt)
4
3
-2
-1
0
1
2
3
x1
4
5
6
7
8