Introducción a Métodos de Optimización
Introducción a Métodos de Optimización
Introducción a la programación
lineal y entera: métodos del
Sı́mplex y de B&B
Since Dantzig published the simplex method in 1949 for the solution of linear pro-
gramming problems (area of optimization) a great interest was sparked that allowed a
vast theoretical growth, opening the door to the development of new methods and algo-
rithms that are widely used today.
The main goal of this work is to address, at an introductory level, the simplex method
and the Branch and Bound method (or B&B). If x = (xB , xN ) is a basic feasible solution
of a linear programming problem min{f (x) | Ax = b, x ≥ 0} with no degenerate solutions,
throughout the iterative algorithm of the simplex it is determined through a finite quantity
of steps whether the problem is already within an optimal solution, whether a finite
optimal solution does not exist, or whether it determines the optimal solution.
The Branch and Bound method is used for solving linear programming problems in
which the solution (or part of it) must be an integer. The algorithm follows a binary tree
structure and under ideal conditions finishes in a finite quantity of steps.
Resumen
Desde que Dantzig publicó el método del sı́mplex en 1949 para la resolución de proble-
mas de programación lineal (área de la optimización) despertó un fuerte interés, y permitió
que se produjera un amplio crecimiento teórico dando pie al desarrollo de nuevos métodos
y algoritmos muy utilizados hoy en dı́a.
El objetivo principal del trabajo es abordar de manera introductoria el método del
sı́mplex y el método de Branch and Bound (o B&B). Si x = (xB , xN ) es una solución
básica factible de un problema de programación lineal mı́n{f (x) | Ax = b, x ≥ 0} sin
soluciones degeneradas, mediante el algoritmo iterativo del sı́mplex se determina en una
cantidad finita de pasos si el problema se encuentra ya en una solución óptima, si no
existe solución óptima finita o bien determina la solución óptima.
El método de Branch and Bound, se utiliza para resolver problemas de programación
lineal en donde la solución (o parte de esta), debe ser entera. El algoritmo sigue una
estructura de árbol binario y bajo condiciones ideales termina en una cantidad finita de
pasos.
i
Agradecimientos
ii
Índice
1. Introducción 1
2. Programación Lineal 3
2.1. Representaciones equivalentes . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.2. Soluciones básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3. Conjuntos convexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4. El método del sı́mplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.1. Formulación general del método del sı́mplex. . . . . . . . . . . . . 10
2.4.2. Esquema general del método del sı́mplex . . . . . . . . . . . . . . . 11
2.4.3. Convergencia del método del sı́mplex . . . . . . . . . . . . . . . . . 12
2.4.4. La tabla del método del sı́mplex . . . . . . . . . . . . . . . . . . . 13
2.4.5. Construcción de una solución básica factible inicial . . . . . . . . . 16
2.4.6. Reglas de prevención de ciclo . . . . . . . . . . . . . . . . . . . . . 18
2.5. Dualidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5.1. Dualidad débil y dualidad fuerte . . . . . . . . . . . . . . . . . . . 20
2.5.2. Holguras complementarias . . . . . . . . . . . . . . . . . . . . . . . 22
2.5.3. Análisis de sensibilidad . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5.4. Formulación del algoritmo primal-dual . . . . . . . . . . . . . . . . 25
2.5.5. Algoritmo primal-dual . . . . . . . . . . . . . . . . . . . . . . . . . 27
3. Programación Entera 29
3.1. El método de Branch and Bound . . . . . . . . . . . . . . . . . . . . . . . 29
3.1.1. Descripción del método Branch and Bound . . . . . . . . . . . . . 30
3.1.2. Esquema general del método Branch and Bound . . . . . . . . . . 31
3.1.3. Convergencia del método Branch and Bound . . . . . . . . . . . . 32
4. Problemas aplicados 36
4.1. Ejemplos de problemas de programación lineal . . . . . . . . . . . . . . . 36
4.1.1. Problema de la dieta . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2. Relaciones lógicas con variables binarias . . . . . . . . . . . . . . . . . . . 37
4.2.1. Producción acotada . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.2. Costes fijos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.3. Variables con una cantidad finita de valores . . . . . . . . . . . . . 38
4.2.4. Restricciones sustitutas . . . . . . . . . . . . . . . . . . . . . . . . 38
4.3. Ejemplos de problemas de programación Entera . . . . . . . . . . . . . . . 39
4.3.1. El problema de la mochila . . . . . . . . . . . . . . . . . . . . . . . 39
iii
4.3.2. Problemas de localización . . . . . . . . . . . . . . . . . . . . . . . 40
5. Conclusiones 41
iv
1. Introducción
Los inicios de la programación lineal entera datan de 1958 con el trabajo de Ralph
E. Gomory quien introdujo el método de los planos de corte. El algoritmo Branch and
Bound (o B&B) fue propuesto por primera vez por A. H. Land y A. G. Doig en 1960
para la programación entera.
1
Aunque la programación entera es NP-hard en general, algoritmos como el de Branch
and Bound han resultado ser de gran utilidad en la práctica. La investigación en esta área
es actualmente muy activa.
Estructura de la Memoria
Este trabajo recoge los principales resultados teóricos que ayudan a comprender y
desarrollar el método del sı́mplex desde un punto de vista tanto geométrico como alge-
braico.
En el capı́tulo 2 establecemos las bases de la programación lineal. Se define matemáti-
camente lo que es un programa lineal ası́ como sus representaciones equivalentes; se define
el conjunto de soluciones posibles que admite este tipo problema y que a su vez son solucio-
nes candidatas para optimizar el problema. Se darán condiciones necesarias y suficientes
para poder encontrar la solución óptima. Además se verán algunas relaciones importantes
entre las propiedades geométricas del conjunto de soluciones y el análisis convexo que nos
permitirá comprender la lógica usada en el método del sı́mplex. Completaremos la formu-
lación del método del sı́mplex con el uso de la tabla del método, que ayudará a organizar y
afrontar mejor un problema dado. Para finalizar el capı́tulo trataremos la dualidad, donde
podremos ver que todo programa lineal tiene asociado con otro programa lineal con el que
esta ampliamente relacionado y ofrecer ası́ una mayor perspectiva. Se tratará también el
algoritmo primal-dual, un método alternativo para resolver problemas de programación
lineal.
El capı́tulo 3 lo dedicaremos a la programación entera. Se analizará en detalle el método
de Branch and Bound. Para finalizar, en el capı́tulo 4 ejemplificaremos la formulación
de alguno de los problemas clásicos de la programación lineal y entera, y se establecen
algunas relaciones lógicas que ayudaran a comprender la modelización de problemas de
programación entera.
2
2. Programación Lineal
Las principales fuentes consultadas para este capı́tulo han sido, [1] y [2]. Se citaran
fuentes más concretas en alguno de los apartados.
minimizar c1 x1 + c2 x2 + · · · + cn xn
sujeto a a11 x1 + a12 x2 + · · · + a1n xn = b1
a21 x1 + a22 x2 + · · · + a2n xn = b2
.. ..
. .
am1 x1 + am2 x2 + · · · + amn xn = bm
y xi ≥ 0, i ∈ {1, · · · , n}.
donde las bi , ci y aij son constantes reales fijas, y las xi son valores reales a determinar.
minimizar cT x
sujeto a Ax = b (2.1)
x≥0
2
El uso de la palabra programación en este contexto se refiere a ”planifiación”.
3
f : Rn −→ R. Esta es la función que queremos minimizar o maximizar. Se suele expresar de la forma
c1 x1 + c2 x2 + · · · + cn xn donde los coeficientes c1 , c2 , . . . , cn son conocidos.
4
Si un vector es un vector fila (1 × n) o columna (n × 1) deberı́a quedar claro por contexto, pero para
evitar confusión, si x es un vector, se denotará:
x si representa un vector columna.
xT si representa un vector columna traspuesto, es decir un vector fila.
3
Forma Canónica. En caso de que el problema sea de minimización, todas las
restricciones son de la forma ” ≥ ” y, si es de maximización, son de la forma ”≤”.
En ambos casos las variables han de ser no negativas.
Forma Estándar. todas las restricciones son de igualdad y todas las variables son
no negativas. En general nos centraremos en esta última.
Vamos a ver distintas transformaciones que se pueden hacer en los elementos que
componen un problema de programación lineal, y que nos permitirán pasar el problema
a la forma estándar si fuera necesario.
Función objetivo. Todo problema de minimización puede transformarse en un pro-
blema de maximización, y viceversa, ya que se verifica la siguiente relación:
n
X n
X
máx cj xj = -mı́n −cj xj .
j=1 j=1
Si no queremos
Pn restricciones de igualdad, podemos reemplazar cada
Pn restricción de
la forma j=1 aij xj = bi por dos restricciones de desigualdad j=1 aij xj ≥ bi y
P n
j=1 aij xj ≤ bi .
4
Ahora, sea B ∈ Mm×m (R) la matriz determinada por estas m primeras columnas. Enton-
ces, B es una matriz invertible y xB ∈ Rm formado por las variables asociadas a B y xN
las demás, podemos escribir el sistema como
BxB + N xN = b.
Definición 2.3. Si una, o más variables básicas son nulas, entonces la solución se dice
solución básica degenerada.
Consideremos ahora
Ax = b
(2.2)
x ≥ 0,
que representa las restricciones de un programa lineal en forma estándar.
Definición 2.4. Un vector x que satisfaga (2.2), se dice que es factible. Una solución
factible para (2.2) que también sea básica, se denomina solución básica factible.
Definición 2.6. Una solución básica factible óptima és una solución básica factible que
optimiza el problema.
Observación 2.7. La solución básica factible óptima en caso de existir, puede ser única
o existir más de una.
Teorema 2.8. Dado un programa lineal en la forma estándar (2.1), donde A es una
matriz de m × n de rango m,
2. si existe una solución factible óptima, existe una solución básica factible óptima.
x1 a1 + x2 a2 + · · · + xn an = b.
Supongamos que exactamente p de las variables xi son mayores que cero, y por conve-
niencia, que sean las primeras p variables. Entonces,
x1 a1 + x2 a2 + · · · + xp ap = b. (2.3)
5
Separamos en dos casos, dependiendo si el conjunto a1 , a2 , . . . , ap es linealmente inde-
pendiente o no:
λ1 a1 + λ2 a2 + · · · + λp ap = 0. (2.4)
(x1 − αλ1 )a1 + (x2 − αλ2 )a2 + · · · + (xp − αλp )ap = b. (2.5)
como resultado de multiplicar (2.4) por α y restándola de (2.3). Observamos que para
todo α las componentes xi − αλi corresponden a una solución de las ecuaciones lineales,
pero la solución puede ser no factible (i.e, xj − αλj < 0 para algún j ∈ {1, . . . , p}).
Haciendo λT = (λ1 , λ2 , . . . , λp , 0, 0, . . . , 0), se observa que para cualquier α
x − αλ (2.6)
xj − ᾱλj (2.7)
Si λj ≤ 0, OK.
Acabamos de ver ası́ que la solución dada por (2.6) es factible y tiene a lo sumo p − 1
variables positivas.
Al repetir este proceso, en caso necesario, se podrı́an eliminar las variables positivas hasta
tener una solución factible con las columnas correspondientes que son linealmente inde-
pendientes. En este punto es aplicable el Caso 1.
6
2.) Sea xT = (x1 , x2 , . . . , xn ) una solución factible óptima. Como en 1.) suponemos
que hay exactamente p variables positivas x1 , x2 , . . . , xp . De nuevo hay dos casos; el caso
1, correspondiente a la independencia lineal, es exactamente igual que antes. El caso
2 también se desarrolla igual que el anterior, pero además debemos demostrar que la
solución (2.6) es óptima.
Para α suficientemente pequeña la solución dada por (2.6) es una solución factible para
valores positivos o negativos de α5 . Consideremos entonces el valor de la solución (2.6):
cT x − αcT λ.
Estarı́amos ası́ ante una contradicción por la hipótesis de optimalidad de x. Por tanto
necesariamente cT λ = 0.
Una vez establecido que la nueva solución factible con menos componentes positivos tam-
bién es óptima, el resto de la demostración se puede completar exactamente como en la
parte 1).
7
Proposición 2.13. (La intersección de conjuntos convexos es convexa). Dada una colec-
ción de conjuntos convexos {Ci }i∈I , entonces el conjunto C ∗ = i∈I Ci es un conjunto
T
convexo
Observación 2.16. Es fácil de demostrar que, dada una matriz A ∈ Mm×n (R), b ∈ Rm ,
la región factible F = {x | Ax = b, x ≥ 0} de un problema de programación lineal, es un
poliedro convexo.
Teorema 2.19. (Equivalencia de puntos extremos y soluciones básicas). Sea A una matriz
m × n de rango m, b ∈ Rm . Sea K el poliedro convexo formado por todos los vectores
x ∈ Rn que satisfacen
Ax = b
(2.8)
x ≥ 0.
Un vector x es un punto extremo de K si, y sólo si, x es una solución básica factible de
(2.8).
x1 a1 + x2 a2 + · · · + xm am = b,
y1 a1 + y2 a2 + · · · + ym am = b
y
z1 a1 + z2 a2 + · · · + zm am = b.
Sin embargo, como los vectores a1 , a2 , . . . , am son linealmente independientes, se deduce
que x = y = z y, en consecuencia, x es un punto extremo de K.
8
Recı́procamente, sea x un punto extremo de K. Supongamos que las componentes
distintas de cero de x son las p primeras componentes. Entonces,
x1 a1 + x2 a2 + · · · + xp ap = b,
con xi > 0, i = 1, 2, . . . , p.
Para demostrar que x es una solución básica factible, debe demostrarse que los vectores
a1 , a2 , . . . , ap son linealmente independientes.
Esto se hace por contradicción. Supongamos por tanto que a1 , a2 , . . . , ap son lineal-
mente dependientes. Entonces existe una combinación lineal no trivial igual a cero:
y1 a1 + y2 a2 + · · · + yp ap = 0.
Dem.: Esto resulta de la primera parte del teorema (2.8) y del teorema de la equivalencia
anterior.
El método del sı́mplex se basa en ir pasando de una solución básica factible (i.e un
punto extremo) a otra, hasta encontrar un punto extremo óptimo. Los resultados vistos
hasta ahora aseguran que para buscar una solución óptima es suficiente con considerar
sólo las soluciones básicas factibles.
9
Observación 2.23. Para un problema con n variables y m restricciones hay a lo sumo
n n!
=
m m!(n − m)!
Por tanto, es conveniente buscar una forma más eficiente de movernos entre puntos
extremos de la región factible, o lo que es lo mismo, una forma eficiente de gestionar los
cambios de base. Esto es precisamente lo que intenta el método del sı́mplex.
minimizar cT x
sujeto a Ax = b (2.9)
x≥0
Denotemos por J al conjunto de los ı́ndices de las variables no básicas, es decir, las colum-
nas de A que no están en la base B, y para cada columna aj de A, definimos yj := B −1 aj .
Entonces, si ponemos aj como combinación lineal de las columnas de las base B, obtene-
mos que el coeficiente de la columna i de B es precisamente yij .
Dado que (xB , xN ) es una solución basica factible tenemos que xB ≥ 0, xN = 0 y
b = Ax = BxB + N xN . Despejando xB en la ecuación anterior obtenemos
xB =B −1 b − B −1 N xN
X
=B −1 b − B −1 aj xj
j∈J
X
=B −1 b − yj xj .
j∈J
10
Entonces, trasladando esto a la función objetivo y definiendo zj := cTB yj tenemos que,
dado x ∈ Rn cualquiera,
z = cT x =cTB xB + cTN xN
X X
=cTB B −1 b − yj xj + cj xj
j∈J j∈J
X
cTB yj − cj xj
=zB −
j∈J
X
=zB − (zj − cj ) xj .
j∈J
P
Por tanto para que z = zB − j∈J (zj − cj ) xj sea menor que zB necesitamos que algún
(zj − cj ) > 0 7 . Es decir, dada una solución básica factible (xB , xN ), tenemos lo siguiente:
El análisis que acabamos de desarrollar también nos permite identificar cuando estamos
ante un problema sin óptimo finito. Supongamos que tenemos una variable no básica
k ∈ J para la cual zk − ck > 0 y que, al mismo tiempo, el vector yk = B −1 ak tiene todas
sus componentes menores o iguales que cero. Esto nos estarı́a diciendo que, a medida que
aumentamos el valor de xk , el cambio inducido en las variables de la base (para mantener
factibilidad) es tal que ninguna de ellas reduce su valor (B −1 b − yk xk ≥ B −1 b ≥ 0).
Por tanto podemos aumentar xk indefinidamente sin perder factibilidad y mejorando la
función objetivo a cada paso.
Algoritmo (Sı́mplex).
Paso 0. En la forma estándard, determinamos una base B que tiene asociada una solución
básica factible x = (xB , xN ), con xB = B −1 b y xN = 0. Además, zB = cTB B −1 b.
Paso 1. Calculamos los valores zj − cj para todas las variables no básicas j ∈ J, donde
zj = cTB B −1 aj = cTB yj . Tenemos las siguientes posibilidades:
11
Si ∃ j tal que zj − cj > 0. Sea k ∈ J el menor ı́ndice tal que zk − ck =
máxj∈J {zj − cj }. Ir al Paso 2 con k como variable de entrada.
El estudio de la convergencia del método del sı́mplex está relacionada con la existencia
o no de soluciones básicas degeneradas. Cuando una de las variables básicas toma el valor
cero, implica que distintas bases representan al mismo punto extremo de la región factible
y por tanto cuando se aplica el algoritmo (sı́mplex) hay distintos cambios de base que
pueden no mejorar la función objetivo.
Teorema 2.24. Dado un problema de programación lineal en forma estándar sin solu-
ciones básicas degeneradas, y dada una solución básica factible inicial , el método del
sı́mplex termina en una cantidad finita de pasos, bien encontrando una solución óptima
o concluyendo que no tiene solución óptima finita.
8
En el apartado 2.4.6, se explica que se puede hacer bajo la presencia de soluciones degeneradas.
12
Observación 2.25. Si x ∈ Rn es una solución degenerada de un problema de programa-
ción lineal con las condiciones habituales y, x tiene p < m componentes positivas, entonces
n−p
podrı́an haber m−p soluciones básicas factibles diferentes correspondientes a x.
Vamos ahora a ilustrar un ejemplo del método del sı́mplex. Para hacerlo usaremos la
tabla del método del sı́mplex. La idea consiste en guardar en una tabla toda la informa-
ción relevante de cada iteración a modo de facilitar la actualización de la misma. Veamos
primero cómo funciona la tabla.
xB xN z
zj − cj 0 cTB B −1 N − cN cTB b
xB cB Im×m B −1 N b
Observamos que tenemos la información necesaria para realizar una iteración del méto-
do del sı́mplex. En forma menos compacta, tenemos
Supongamos entonces que decidimos que la variable xk debe entrar en la base y la va-
riable xBr debe salir de la misma. Se asocia la nueva base a B̃. Las operaciones a realizar
sobre la tabla actual, deberı́an de ser las siguientes:
13
se actualiza el vector cB , y los valores b de las variables básicas xB .
Se actualizan las columnas yi y la matriz Im×m pasa a ser B̃ −1 .
se actualizan los valores zj − cj y el valor de la función objetivo cTB b.
Obtendrı́amos de este modo la tabla asociada a la base B̃, y poder ası́ iterar el algoritmo
en caso de ser necesario.
veamos ahora un ejemplo del funcionamiento del algoritmo del sı́mplex mediante la
tabla.
Ejemplo 2.26. Consideremos el siguiente problema de programación lineal:
minimizar −4x1 − 2x2 + 6x3
sujeto a −x1 + x2 + 2x3 ≤ 8
6x1 + x2 + 7x3 ≤ 6
−5x1 + 6x3 ≤ 1
x≥0
el primer paso debe ser pasar el problema a forma estándar, lo que resulta en el problema:
Paso 0. (Inicialización).
Determinamos B = (a4 , a5 , a6 ) = Im×m . x = (xB , xN )T es xB = B −1 b = (8, 6, 1)T y
xTN = (0, 0, 0), siendo x una solución básica factible.
Se calcula además el valor de la función objetivo zB = cTB xB = (0, 0, 0)xB = 0.
14
El máximo se alcanza para k = 1 y es 4 > 0. Por tanto, tenemos que x1 es la candidata
a entrar en la base.
Paso 2 . (criterio de salida). como el vector y1 = (−1, 6, −5)T tiene una única com-
ponente positiva, que esta asociada con la variable xs5 , entonces esta sale de la base. La
columna a1 entra en la base y x1 pasa a ser una variable básica.
La nueva base es B1 = (a4 , a1 , a6 ), con lo que tenemos:
1 −1 0 1 0.17 0
B1 = 0 6 0 y B1−1 = 0 0.17 0 ,
0 −5 1 0 0.83 1
y entonces xB = B1−1 b = (9, 1, 6)T , xN = (0, 0, 0)T y zB1 = cB1 xB = (0, −4, 0)T xB =
−4.
Paso 2.(criterio de salida). como el vector y2 = (1.17, 0.17, 0.83)T tiene todas las com-
ponente positivas, tenemos que mı́n{ 1.917 , 0.117 , 0.683 } = 0.117 . Por tanto x1 sale de la base.
La nueva base es B2 = (a4 , a2 , a6 ), con lo que tenemos:
1 1 0 1 −1 0
B2 = 0 1 0 y B2−1 = 0 1 0 ,
0 0 1 0 0 1
y entonces xB = B2−1 b = (2, 6, 1)T , xN = (0, 0, 0)T y zB2 = cTB2 xB = (0, −2, 0)T xB =
−12.
15
Iteración 3. Paso 1. (Criterio de entrada). Calculamos los zj − cj :
B2−1 a3 = y3 = (−5, 7, 6)T . Por tanto, z3 − c3 = cTB y3 − c3 = −14 − (−6) = −20 < 0.
[Tabla 3](óptima)
El máximo se alcanza para k = 5 y es −2 < 0. Por tanto, estamos ante una solución
óptima.
La solución óptima, expresada únicamente con las variables del problema original, viene
dada por (0, 6, 0) con valor óptimo −12.
Pasamos a ver ahora como generar una solución básica factible dado un programa
lineal. Si las condiciones del problema son de la forma Ax = b, x ≥ 0, con b ≥ 0 para
cada una de sus componentes, y la matriz de restricciones A contiene la matriz identidad
Im×m entonces el problema de encontrar una solución básica factible x = (xB , xN ) es
inmediato. Basta con seleccionar las columnas asociadas a dicha submatriz identidad y la
solución inicial será entonces xB = B −1 b = b ≥ 0 y xN = 0.
Suponiendo que no estamos ante las condiciones anteriores, podemos usar el llamado
método de la M grande (o ”Big-M ”).
En la forma estándar, la idea del método consiste en añadir variables artificiales en tan-
tas restricciones como sea necesario para que la nueva matriz de restricciones contenga
la matriz identidad como submatriz, lo que nos pone nuevamente en las condiciones del
caso anterior. En la función objetivo se añade además una penalización de las variables
artificiales dado por una constante M suficientemente grande.
16
consideremos el problema en la forma estándar
minimizar cT x
sujeto a Ax = b (2.10)
x ≥ 0,
17
De este modo podrı́amos tomar como base inicial B = (a7 , a8 , a9 ) con solución asocia-
da xTB = (7, 1, 7) y xN = 0.
Llegados ha este punto, habrı́a que iterar el método del sı́mplex y ver si en la solución ópti-
ma todas las variables artificiales se han hecho cero o no para decidir si se ha encontrado
una solución óptima del problema original o éste no tenia soluciones factibles.
Hasta ahora hemos podido ver la convergencia del método del sı́mplex bajo condiciones
de no degeneración. Ante la presencia de soluciones básicas degeneradas, existen métodos
diversos para evitar un posible ciclo durante el desarrollo del sı́mplex, garantizando ası́
la convergencia del método. En este apartado nos centraremos en la regla lexicográfica;
consiste en establecer un criterio para escoger la variable de salida de la base en cada ite-
ración del método del sı́mplex, asegurando que no exista la posibilidad de repetir ninguna
base a lo largo del proceso.
Sea x = (xB , xN ) una solución básica factible con base B asociada. supongamos que
xk es la variable escogida para entrar en la base. Entonces, para determinar la variable
que abandona la base calculan los ı́ndices de las variables candidatas con el criterio ya
expuesto en el Paso 2. del algoritmo (sı́mplex):
(xB )i (xB )r
I0 = i : = mı́n : yrk > 0 .
yik 1≤r≤m yrk
Si de aquı́ se deduce que solo hay una variable candidata, se elige ésta. En caso de
existir más de una candidata, se calculan los ı́ndices:
yi1 yr1
I1 = i : = mı́n .
yik r∈I0 yrk
De nuevo, si podemos deducir que solo hay una variable candidata, se elige esta. De
otra forma, se repite el proceso. Generalizando tenemos
yij yrj
Ij = i : = mı́n ,
yik r∈Ij−1 yrk
18
2.5. Dualidad
Primal Dual
minimizar cT x maximizar λT b
(2.12)
sujeto a Ax = b sujeto a λT A ≤ cT
x≥0
Donde x, c ∈ Rn , b, λ ∈ Rm y A ∈ Mm×n (R), con m ≤ n. x es la variable del problema
primal y λ es la variable del problema dual.
Cada variable del primal corresponde con una restricción del dual.
Cada restricción del primal se corresponde con una variable del dual.
P rimal Dual
≥0 ←→ ≤
Variables ≤0 ←→ ≥ Restricciones
no restr. ←→ =
≥ ←→ ≥0
Restricciones ≤ ←→ ≤0 Variables
= ←→ no restr.
19
Proposición 2.30. El dual del dual coincide con el primal.
−mı́n −bT (u − v)
sujeto a −AT (u − v) ≥ −c
u≥0
v≥0
donde hemos considerado que λ = u − v. Además podemos expresar
T T T
u
−b (u − v) = −b , b
v
y
T
u T T
−A (u − v) = −A , A
v
Entonces, el dual correspondiente es
−máx −y T c
sujeto a y T (−AT , AT ) ≤ (−bT , bT )
y ≥ 0,
que a su vez es equivalente a
mı́n cT y
sujeto a Ay = b
y≥0
que efectivamente coincide con el primal en su forma estándar.
Dem.: Se tiene
λT b = λT Ax ≤ cT x,
siendo válida la última desigualdad, porque x ≥ 0 y λT A ≤ cT .
20
Este resultado tiene varias implicaciones prácticas. La primera de ellas es que un vector
factible para uno de los problemas da lugar a una cota en el valor del otro. Los valores
asociados al primal son mayores que los asociados al dual.
De esta proposición se deriva de forma inmediata el siguiente corolario.
Corolario 2.32. Si x∗ y λ∗ son soluciones factibles del primal y del dual tales que cT x∗ =
(λ∗ )T b, entonces x∗ y λ∗ son soluciones optimas del primal y dual, respectivamente.
minimizar cT x
sujeto a Ax = b (2.13)
x ≥ 0,
maximizar λT b
(2.14)
sujeto a λT A ≤ cT
en función de B.
Se divide A como A = [B, N ]. Como la solución básica factible xB = B −1 b es óptima,
entonces de la sección (2.4.1) sabemos que zj − cj ≤ 0 para toda variable no básica j, que,
es equivalente a cTB B −1 aj − cj ≤ 0 y por tanto resulta cTB B −1 N ≤ cTN .
λT b = cTB B −1 b = cTB xB ,
y el valor de la función objetivo dual para esta λ es igual al valor del problema primal.
Por tanto por la dualidad débil, queda establecida la optimalidad de λ para el dual.
21
Corolario 2.34. Sea x∗ solución óptima con base B asociada de un programa lineal en
forma estándar como el de (2.12), entonces
λT = cTB B −1
Pasamos a ver ahora la relación existente entre las soluciones óptimas de los problemas
primal y dual. Presentamos entonces el teorema de holguras complementarias, ofreciendo
ası́ una caracterización de las soluciones óptimas de dichos problemas.
Para el teorema nos basaremos la formulación canónica de un problema de programación
lineal y su dual, es decir en el par:
Primal Dual
minimizar cT x maximizar λT b
(2.15)
sujeto a Ax ≥ b sujeto a λT A ≤ cT
x≥0 λT ≥ 0.
Dem.: Definimos,
ui := λi (a(i) x − bi ) ∀i ∈ {1, . . . , m},
y
vj := (cj − λT aj )xj ∀j ∈ {1, . . . , n}.
22
Observación 2.37. El resultado que acabamos de ver, implica que dadas un par de solu-
ciones óptimas x y λ, si una restricción del dual no se satura10 , entonces la correspondiente
variable del primal es 0 (i.e cj − λT aj > 0 ⇒ xj = 0).
∂ z̄
= λi .
∂bi
23
la columna correspondiente de la tabla11 incluyendo el zj − cj correspondiente. Para
este caso serı́a suficiente con recalcular la columna B −1 âj y obtener ẑj − cj =
CBT B −1 â − c . Si ẑ − c ≤ 0 mantenemos optimalidad y nada cambia. En caso
j j j j
contrario habrı́a que iterar el método del s´simplex hasta recuperar optimalidad (la
columna j entrarı́a en la base).
Cambios en una columna básica. El cambió sobre una columna básica, puede
implicar que tengamos dependencia de la matriz B, y por tanto dejemos de tener
una base. Pero aun sin perder la independencia de la base, cambiarı́a B −1 y eso
podrı́a provocar que cambien todas las columnas de la tabla del sı́mplex.
Ilustramos con un ejemplo simple los cambios que se producen en un programa lineal
tras aplicar alguna perturbación en el vector b:
Ejemplo 2.38. Consideremos el problema
[Tabla](óptima)
x1 x2 x3 xs4 xs5 z
zj − cj 0 − 12 0 −1 − 21 −16
cB xB
1 1
x3 −4 0 4 1 2 − 41 3
5
x1 −2 1 4 0 − 21 3
4 2
De forma general, supongamos que perturbamos una de las componentes del vector b
de forma que b̂ = b + (0, . . . , 0, ∆bi , 0, . . . , 0)T . Si Bi−1 es la columna i de B −1 , queremos
encontrar las condiciones que nos aseguren,
24
Es decir, si ∆b1 ∈ [−6, 4] se mantiene la factibilidad para x̂B . Equivalentemente, podemos
variar b1 en el intervalo [11 − 6, 11 + 4] = [5, 15].
Observamos además, si λT es una solución óptima del dual, entonces
Por cada unidad en que aumentemos b1 dentro de [5, 15], la función objetivo se verá
reducida en λ1 = −1 unidad; si por ejemplo tenemos b̂ = (12, 10), entonces el valor
óptimo de la función objetivo pasa a ser ẑ = −17.
Realizando el mismo análisis para b2 , la tasa de variación de la función objetivo serı́a
λ2 = −1/2.12
El algoritmo primal-dual es una variante del método del sı́mplex, que consiste en resol-
ver un problema de programación lineal operando de forma simultanea en los problemas
primal y dual.
Consideremos un problema de programación lineal en forma estándar y su formulación
dual como el que sigue, con las condiciones habituales:
Primal Dual
minimizar cT x maximizar λT b
sujeto a Ax = b sujeto a λT A ≤ cT
x≥0
Para facilitar la exposición nos referiremos a los problemas primal y dual como P y
D respectivamente. En el algoritmo primal-dual, primero es necesario disponer de una
solución factible λ para D, que se puede obtener del siguiente modo:
25
En este caso, para nuestra solución λ tendremos que algunas de las restricciones de la
forma λT ai ≤ ci estarán saturadas. Definimos el conjunto
X
ak xk = b
k∈kA (2.18)
xk ≥ 0 k ∈ KA
xj = 0 j∈/ KA .
Nos referiremos a KA como el conjunto de columnas activas 16 . Para buscar una solución
de (2.18) consideremos una versión restringida de P que llamaremos RP, y que es de la
forma:
m
X
minimizar xai
i=1
X
sujeto a ak xk + xa = b
k∈KA
xk ≥ 0 k ∈ KA
xj = 0 j∈/ KA
xai ≥ 0 i ∈ {1, . . . , m}.
λ̄ = λ + ωµ.
26
que µT b > 0 (ya que ha de coincidir con el óptimo de RP ). Entonces, si ω > 0 el
valor objetivo en D mejora.
Por otro lado para que λ̄ sea factible, necesariamente ∀i ∈ {1, . . . , n},
λ̄T ai = λT ai + ωµT ai ≤ ci .
ci − λT ai
ω̂ = mı́n .
/ A ,µT ai >0
i∈K µT ai
Observación 2.39. Bajo las condiciones del algoritmo primal-dual, se mantiene cons-
tantemente la factibilidad de λ en el dual.
27
Ejemplo 2.40. Dado el problema (P ):
Iteración 1.
Lo primero que necesitamos es una solución factible del problema dual. Como tenemos
que c = (2, 1, 4)T ≥ 0, podemos considerar λ = (0, 0)T .
Paso 2.
Iteración 2.
Paso 2.
Iteración 3.
Paso 2.
28
3. Programación Entera
Las principales fuentes consultadas para este capı́tulo han sido [8] y [9].
Hasta ahora hemos visto modelos de programación lineal donde las variables podı́an
tomar cualquier valor real.
Vamos a considerar ahora, el problema de la forma:
minimizar cT x
sujeto a Ax = b
(3.1)
x≥0
x ∈ Zn
Ejemplo 3.3.
minimizar −5x1 − 8x2
sujeto a x1 + x2 ≤ 6
5x1 + 9x2 ≤ 45
x≥0
x ∈ Z2
La solución óptima del problema relajado es x∗r = (2.25, 3.75) con valor objetivo zr =
−41.25. La solución óptima entera es x∗ = (0, 5), con valor objetivo z = −40. En este caso,
si intentásemos buscar una solución entera a partir de la solución óptima x∗r podrı́amos
probar de redondear la solución, obteniendo ası́ el punto (2, 4), que no es factible pues
2 · 5 + 9 · 4 = 46 > 45.
29
3.1.1. Descripción del método Branch and Bound
minimizar cT x + dT y
sujeto a Ax + Gy = b
(3.2)
x, y ≥ 0
x ∈ Zn
Supongamos que el problema MILP dado admite la solución óptima (x∗ , y ∗ ) con valor
óptimo z ∗ .
Consideremos entonces la relajación del problema MILP, es decir
con P0 = (x, y) ∈ Rn+ × Rp+ | Ax + Gy = b y supongamos que LP0 admite una solución
S1 := S ∩ {(x, y) | xj ≤ bf c} , S2 := S ∩ {(x, y) | xj ≥ df e}
donde bf c denota al mayor entero menor o igual que f y df e denota al menor entero
mayor o igual que f . Tenemos que (S1 , S2 ) es una partición de S.
Consideramos ahora los dos siguientes problemas enteros mixtos basados en esta partición,
La solución original del problema se ha reducido a resolver estos dos nuevos subproblemas.
Denotamos por P1 , P2 las relajaciones resultantes de S1 y S2 respectivamente. Esto es
P1 := P0 ∩ {(x, y) | xj ≤ bf c} , P2 := P0 ∩ {(x, y) | xj ≥ df e} ,
y consideramos,
(i) Si uno de los LPi es infactible, i.e., Pi = ∅, entonces también tenemos Si = ∅ ya que
Si ⊆ Pi . Y por tanto como MILPi es infactible no lo necesitamos considerar más.
Decimos que el problema queda podado por infactibilidad.
19
Cconsideramos que xj tiene mejor potencial, si se cumple que cj f es mı́nimo)
30
(ii) Sea (xi , y i ) una solución óptima de LPi con valor óptimo zi , para i = 1, 2.
(iia) Si xi es un vector entero, entonces (xi , y i ) es una solución óptima del problema
MILPi y una solución factible del problema MILP. El problema MILPi queda
solucionado, y decimos que queda podado por optimalidad. Como Si ⊆ S, le
sigue que zi ≥ z ∗ , esto es, zi es una cota superior del valor de MILP.
(iib) Si xi no es un vector entero, y zi es mayor o igual que el valor de la mejor cota
superior conocida del MILP, entonces Si no puede contener una solución mejor
y el problema queda podado por acotación.
(iic) Si xi no es un vector entero y zi es menor que el valor de la mejor cota superior
conocida, entonces Si aun puede contener una mejor solución óptima para el
MILP. Sea xij , la componente no entera de la solución xi tal que cj xij es
mı́nimo. Se define fi := xij y los conjuntos Si1 := Si ∩ {(x, y) | xij ≤ bfi c},
Si2 := S2 ∩ {(x, y) | xij ≥ dfi e} y se repite el proceso.
Paso 0. INICIALIZACIÓN.
Definimos L := {N0 }, la cota superior U B := +∞
Paso 1. PRINCIPAL.
U B := zij
(x∗ , y ∗ ) := (xi , y i ).
Ir al Paso 2.
Desde LPi se construyen los dos problemas lineales LPkj , LPkj+1 y se añaden
a L los nodos Nkj y Nkj+1 correspondientes, donde k = i + 1. Ir al paso 1.
20
En caso de no tener región factible no vacı́a y acotada, el método puede no converger. Esto se puede
ver en el ejemplo (3.8).
21
El ı́ndice i representa cada nivel del árbol binario, mientras j representa la posición. Para cada nivel
i ≥ 0, pueden haber 2i nodos distintos.
31
Paso 2. CONTROL
Si L =
6 ∅ ir al Paso 1.
Si L = ∅, la solución (x∗ , y ∗ ) es óptima. Se termina.
Observación 3.4. En el Paso 1. la selección del nodo Ni queda abierta. Lo mas reco-
mendado es tomar aquel con mayor potencial, es decir aquel donde el valor óptimo del
nodo zi sea mı́nimo.
(II) El potencial zij del subproblema asociado a Nij es tal que U B < zij con lo que
ninguna solución factible de Nij puede mejorar el valor U B obtenido.
Esto asegura que, entre las regiones factibles de todos los subproblemas explorados,
no hay ninguna solución que pueda mejorar U B. Lo cual, unido a que ninguna solución
factible del problema entero queda fuera de la unión de las regiones factibles de estos
subproblemas, asegura la optimalidad de U B.
Veamos a continuación como se resolverı́a el problema del ejemplo (3.3) con el algoritmo
de Branch and Bound.
32
Ejemplo 3.7.
minimizar −5x1 − 8x2
sujeto a x1 + x2 ≤ 6
5x1 + 9x2 ≤ 45
x≥0
x ∈ Z2
Paso 0 . Inicialización.
Definimos L = {N0 }, LB = −∞, U B = +∞.
L → L \ N0 (L = ∅).
Al resolver LP11 , obtenemos (x1 , x2 ) = (2, 3)T y z11 = −34 < U B = +∞. Actuali-
zamos U B = −34.
Paso 2 . Control.
como L =
6 ∅, volvemos al Paso 1.
L → L \ N12 (L = ∅).
Al resolver LP12 , obtenemos (x1 , x2 ) = (1.8, 4)T y z12 = −41 < U B = −34.
construimos los dos problemas correspondientes LP23 y LP24 añadiendo las restric-
ciones x1 ≤ 1 y x1 ≥ 2 respectivamente.. Actualizamos L = {N23 , N24 }.
Al resolver LP23 , obtenemos (x1 , x2 ) = (1, 4.44)T y z23 = −40.56 < U B = −34.
33
construimos los dos problemas correspondientes LP35 y LP36 añadiendo las restric-
ciones x2 ≤ 4 y x2 ≥ 5 respectivamente.. Actualizamos L = {N24 , N35 , N36 }.
Iteración 5 Paso 1 . Principal. Escogemos N24 por ser el nodo de mejor potencial
(−41).
Paso 2 . Control.
como L =
6 ∅, volvemos al Paso 1.
Al resolver LP35 , obtenemos (x1 , x2 ) = (1, 4)T y z35 = −37 < U B = −34. Actuali-
zamos U B = −34.
Paso 2 . Control.
como L =
6 ∅, volvemos al Paso 1.
L → L \ N36 (L = ∅).
Al resolver LP36 , obtenemos (x1 , x2 ) = (0, 5)T y z36 = −40 < U B = −37. Actuali-
zamos U B = −40.
Paso 2 . Control.
34
N0
x2 ≤ 3 x2 ≥ 4
N11 N12
x1 ≤ 1 x1 ≥ 2
N23 N24
x2 ≤ 4 x2 ≥ 5
N35 N36
Figura 1: esquema del algoritmo Branch and Bound del ejemplo 3.7
Para finalizar esta sección vamos a ver un ejemplo donde la región factible del problema
relajado no cumple las condiciones del teorema (3.5) y entonces el algoritmo no converge.
Ejemplo 3.8. Consideremos el siguiente problema de programación entera.
minimizar x1 + x2
sujeto a 3x1 − 3x2 ≤ 2
3x1 − 3x2 ≥ 1 (3.3)
x ≥0
∈ Z2
Si seguimos iterando, se derivan los problemas LP23 y LP24 resultantes de añadir las
restricciones x2 ≤ 0 y x2 ≥ 1 respectivamente.
LP23 es infactible.
Para LP24 ,la solución óptima del problema es (x1 , x2 ) = ( 43 , 1)T con z24 = 73 .
35
4. Problemas aplicados
Las principales fuentes consultadas para este capı́tulo han sido [8] y [9].
En esta sección vamos a mostrar algunos ejemplos de problemas clásicos cuya mo-
delización matemática dan pie a la formulación de problemas de programación lineal y
programación entera.
Una de las primeras aplicaciones conocidas del algoritmo del Simplex fue la determi-
nación de una dieta adecuada que fuera de menor coste. El problema de la dieta consiste
en determinar la dieta más económica que satisfaga las necesidades nutritivas mı́nimas
básicas para una persona o un grupo de personas.
Ejemplo 4.1. Supongamos que disponemos de n alimentos distintos con un precio ci
la unidad del alimento i-ésimo. Además hay m ingredientes nutritivos básicos y, para
conseguir una dieta equilibrada, cada persona debe recibir al menos bj unidades del j-
ésimo elemento nutritivo por dı́a. Finalmente, se supone que cada unidad del alimento i
contiene aji unidades del j-ésimo elemento nutritivo. Entonces, denominamos xi al número
de unidades del alimento i de la dieta. El problema consistirá en seleccionar las xi para
minimizar el coste total. Esto es:
si,
aji = Cantidad del nutriente j en el alimento i, para j ∈ {1, . . . , m}, i ∈ {1, . . . , n}
bj = Cantidad necesaria del nutriente j, para j ∈ {1, . . . , m}
ci = Coste unitario del alimento i, para i ∈ {1, . . . , n}
xi = número de unidades del alimento i, para i ∈ {1, . . . , n}.
minimizar c1 x1 + c2 x2 + · · · + cn xn
sujeto a a11 x1 + a12 x2 + · · · + a1n xn ≥ b1
a21 x1 + a22 x2 + · · · + a2n xn ≥ b2
.. ..
. .
am1 x1 + am2 x2 + · · · + amn xn ≥ bm
y xi ≥ 0, i ∈ {1, . . . , n}.
36
El precio unitario del nutriente j es λj . El farmacéutico quiere maximizar los beneficios
asociados a la venta de complementos vitamı́nicos, pero debe asegurarse que los precios
sean competitivos con el de los alimentos que contienen al nutriente. PEs decir, para cada
alimento i, el precio en complementos vitamı́nicos de sus nutrientes, j∈{1,...,m} λj aji no
puede ser superior al coste del alimento, ci .
Observación 4.2. Además podrı́amos dar una interpretación del teorema de holguras
complementarias. Supongamos por ejemplo que tenemos un par de óptimos x, λT del pri-
mal y dual respectivamente; entonces, si en el primal hay un nutriente que se produce por
encima de su nivel mı́nimo (a(j) x > bj ), entonces el precio del complemento correspon-
diente en el dual será 0. Se podrı́a interpretar como que ese nutriente se consigue ”gratis”.
De modo similar, si un complemento vitamı́nico tiene un precio > 0, la restricción en el
primal se verificará con igualdad ya que no puede ser que haya un exceso de nutriente en
el primal (el dual nos dice que ”no es gratis”).
Por otro lado, si compramos un alimento en el primal, no puede ser que en el dual lo ”pro-
duzcamos más baratoçon los complementos; ası́ pues, si en el dual replicamosün alimento
por debajo de su coste primal, entonces en el primal no será óptimo comprarlo.
Entonces si yj = 0, xj = 0. Si yj = 1 se cumple lj ≤ xj ≤ uj .
Supongamos que tenemos una actividad xj que podemos realizar o no y que en caso
de realizar-la tiene un coste fijo fj y un coste variable cj . Por lo tanto el coste asociado
a xj es 0 si xj = 0 y fj + cj xj si xj > 0. De nuevo una manera de modelar esto seria
considerando la variable binaria yj ∈ {0, 1} tal que:
1 si se realiza la actividad j
yj =
0 si no se realiza la actividad j.
37
Entonces el sumando correspondiente de la función objetivo serı́a fj yj + cj xj .
Observación 4.3. Hay que evitar soluciones en las que yj = 0 y xj > 0. Para eso se
puede añadir la restricción xj ≤ M yj , para M suficientemente grande. De esta forma nos
aseguramos que si yj = 1, xj no tenga ninguna restricción adicional, y que si yj = 0,
entonces se impondrá xj = 0
Supongamos que tenemos una variable xj que puede tomar una cantidad finita de
valores {v1 , · · · , vl }. Entonces consideramos yij variables binarias, con i ∈ {1, · · · , l} tales
que
1 si xj = vi
yij =
0 si xj 6= vi .
Veamos ahora el caso que dadas m restricciones queremos que se cumplan al menos k.
La formulación pasarı́a por introducir m variables binarias yi , donde
0 si imponemos que se cumpla la i-ésima restricción
yi =
1 si imponemos que se cumpla la i-ésima restricción,
38
En el problema habrı́a que introducir las siguientes m restricciones
Pn
a x ≤ b1 + M y1
Pnj=1 1j j
a x
j=1 2j j ≤ b2 + M y2
.. .. ..
Pn . . .
j=1 amj xj ≤ bm + M ym ,
acompañada de la restricción
m
X
yi = m − k.
i=1
n
X
maximizar uj xj
j=1
Xn
sujeto a p j xj ≤ P
j=1
x ∈ {0, 1}n
n
X
maximizar aj xj
j=1
n
X
sujeto a aj xj ≤ b
j=1
x ∈ {0, 1}n
39
4.3.2. Problemas de localización
Ejemplo 4.5. Supongamos que disponemos de una empresa con m potenciales ubicacio-
nes distintas en donde situar un almacén de distribución para atender las demandas de
n clientes. El problema que se plantea, es decidir qué almacenes deberı́an abrirse y qué
cantidad de mercancı́as se deben enviar desde cada almacén a cada cliente.
Usando las variables binarias vistas en el apartado 4.2.2, tenemos:
1 se abre el almacen de distribución j
yj =
0 si no se abre el almacen de distribución j.
Por otro lado xij denota la cantidad de mercancı́as enviadas del almacén i al cliente
j, y cij es el coste asociado a enviar una unidad de mercancı́a de i a j, y fi , el coste fijo
por abrir el almacén i.
Además, se debe tener en cuenta, que para cada cliente j, su demanda dj debe ser
realizada y no se pueden hacer envı́os desde almacenes no abiertos. Ası́ pues, con todo lo
descrito anteriormente, la formulación del problema es la siguiente:
m X
X n m
X
minimizar cij xij + fi yi
i=1 j=1 i=1
m
X
sujeto a xij = dj j ∈ {1, . . . , n}
i=1
n
X n
X
xij − yi dj ≤ 0 i ∈ {1, . . . , m}
j=1 j=1
xij ≥ 0 j ∈ {1, . . . , m}, j ∈ {1, . . . , n}
yi ∈ {0, 1} i ∈ {1, . . . , m}
La función objetivo a minimizar contempla tanto los costes fijos asociados a los alma-
cenes
Pm abiertos como los costes de transporte entre almacén y cliente. Con la restricción
i=0 xij = dj , se impone la demanda del cliente dj . Veamos ahora que pasa con las
variables vinarias:
Pn
Si yi = 0, el almacén i no abre, y entonces j=1 xij ≤ 0, no se envı́a nada desde el
almacén i.
40
5. Conclusiones
41
Referencias
[1] Bazaraa, M., Jarvis, J. and Sherali, H., 2013. Linear Programming And Network Flows.
Hoboken: Wiley.
[2] Luenberger, D. and López Mateos, M., 1989. Programación lineal y no lineal. Wil-
mington, Del.: Addison-Wesley Iberoamericana.
[3] Dantzig, G. and Thapa, M., 1997. Linear Programming, 1:Introduction. New York:
Springer.
[4] Fuente O’Connor, J., 1998. Técnicas De Cálculo Para Sistemas De Ecuaciones, Pro-
gramación Lineal Y Programación Entera. 2nd ed. Barcelona: Reverté.
[5] Basart i Muñoz, J., 1998. Programació Lineal. Bellaterra: Universitat Autònoma de
Barcelona, Servei de Publicacions.
[7] Matousek, J. and Gärtner, B., 2007. Understanding And Using Linear Programming.
Berlin: Springer.
[8] Conforti, M., Cornuejols, G. and Zambelli, G., 2014. Integer Programming. Springer.
[9] Bradley, S., Hax, A. and Magnanti, T., 1992. Applied Mathematical Programming.
Reading, Mass: Addison-Wesley.
42