op (2)
op (2)
op (2)
1 Problema 1
Un agricultor cultiva dos tipos de cultivos en su granja: maı́z y trigo. Cultivar una hectárea de maı́z le lleva
20 horas, mientras que cultivar una hectárea de trigo le lleva 10 horas. El agricultor tiene un lı́mite de 3
hectáreas para la siembra total. Además, solo puede dedicar un máximo de 50 horas al trabajo en la granja.
Por cada hectárea de maı́z, gana 500 euros, y por cada hectárea de trigo, gana 400 euros. El agricultor quiere
determinar la cantidad óptima de maı́z y trigo que debe cultivar para maximizar sus beneficios.
Se pide:
• Modelizar matemáticamente el problema indicando todos los elementos del modelo.
• Representar gráficamente la región factible.
Variables:
X1 : Hectáreas de maı́z
X2 : Hectáreas de trigo t
X1
X= ∈ R2
X2
Función objetivo:
z = 500X1 + 400X2
1
Beneficio obtenido por la fabricación de los collares y las pulseras
Restricciones:
R1 : X1 + X2 ≤ 3 (No se permite cultivar más de 3 hectáreas)
R2 : 20X1 + 10X2 ≤ 50 (A lo sumo, 50 horas de trabajo)
R3, 4 : X1 ≥ 0, X2 ≥ 0 (No negatividad)
Parámetros:
c = [500, 400] ∈ R2
1 1
A= ∈ R2×2
20 10
b = [3, 50] ∈ R2
En forma matricial, el modelo se puede escribir como sigue:
max z = cT X
s.a. AX ≤ b
X ≥0
Utilizando un software gráfico, por ejemplo Geogebra, y considerando la intersección de todas las restric-
ciones, obtenemos la siguiente representación gráfica de la región factible:
Figure 1:
2
Obtener el número de hectáreas de maı́z y trigo para maximizar el beneficio.
Para obtener el número de hectáreas de maı́z y trigo que maximizan el beneficio, debemos resolver el modelo
descrito en el apartado a). Podemos resolverlo, analı́ticamente, gráficamente o mediante software (Excel o
Python).
model = ConcreteModel()
model.X1 = Var(within=NonNegativeReals)
model.X2 = Var(within=NonNegativeReals)
solver = SolverFactory(’glpk’)
results = solver.solve(model)
print()
print(’*** Solución ***’)
print(’*** Problema 1 ***:’)
print(’X1:’, value(model.X1))
print(’X2:’, value(model.X2))
print(’objective:’, value(model.obj))
*** Solución ***
*** Problema 1 ***:
X1 : 2.0
X2 : 1.0
objective : 1400.0
Trasladando la solución al problema, se obtiene un beneficio máximo de 1400 euros si se cultivan dos
hectáreas de maı́z (X1 = 2) y una de trigo (X2 = 1).
2 Problema 2
Un camionero se prepara para realizar un viaje de carga. Tiene disponibles cinco tipos de mercancı́a que
desea transportar, pero la capacidad de su camión está limitada a un peso máximo de 65 kg. Para facilitar la
selección de la carga, ha asignado un valor a cada tipo de mercancı́a en orden ascendente de importancia:
Tipo de Mercancı́a M1 M2 M3 M4 M5
Peso kg 60 53 18 23 8
Valor (euros) 80 60 40 55 18
3
Las mercancı́as M2 y M4 son excluyentes, lo que significa que no se pueden transportar ambas simultáneamente.
Además, debido a las caracterı́sticas especiales de la mercancı́a M5, solo tiene sentido llevarla si se trans-
porta alguna de las mercancı́as M1 o M4.
Se pide:
a)
5
s.a. ∑ pi Xi ≤ P
i=1
X2 + X4 ≤ 1
X5 ≤ δ
X1 + X4 ≥ δ
Xi ∈ {0, 1} ∀i ∈ I
δ ∈ {0, 1}
En particular:
4
max z = v1 X1 + v2 X2 + v3 X3 + v4 X4 + v5 X5
X3 + X4 ≤ 1
X3 ≤ δ
X2 + X4 ≥ δ
X1 , X2 , X3 , X4 , X5 ∈ {0, 1}
δ ∈ {0, 1}
Índices:
Mercancı́as: I = {1, 2, 3, 4, 5}
Variables:
(
1 si el camionero lleva la mercancı́a i en el camión ∀i ∈ I
Xi =
0 si no
δ : variable binaria que ayuda a modelizar la condición (*). Su valor en la solución nos indicará cuál de las
restricciones disyuntivas está cumpliéndose.
5
Restricciones:
R1 : ∑5i=1 pi Xi ≤ P (La capacidad total del camión no se excede)
X3 + X4 ≤ 1 (Mercancı́as 3 y 4 excluyentes)
R2 :
R3 : X3 ≤ δ (Solo lleva el mercancı́a 3 si lleva el 2 o el 4) (Condición *)
R4 : X2 + X4 ≥ δ (Solo lleva el mercancı́a 3 si lleva el 2 o el 4) (Condición *)
RB : Xi ∈ {0, 1} ∀i ∈ I (Las variables de decisión son binarias)
Condición (*)
Debido a las caracterı́sticas del mercancı́asM3, solo tiene sentido llevarlo si se lleva alguno de los mer-
cancı́as M2 o M4. La condición es equivalente a que si se lleva el mercancı́a M3 es porque también se lleva
el mercancı́a M2 o el mercancı́a M4:
X3 = 1 ⇒ X2 = 1 ∨ X4 = 1.
(A ⇒ B): X3 = 1 ⇒ X2 + X4 ≥ 1.
(A ⇒ B) es equivalente a (¬A ∨ B).
(¬A ∨ B) : (
X3 ≤ 0,
X2 + X4 ≥ 1.
Ahora, como son 2 restricciones disyuntivas, introducimos una variable binaria δ para que se cumpla una o
la otra.
Con esto obtendremos las 2 restricciones que hay que añadir al modelo para incluir la condición (*).
(
X3 ≤ M1 δ ,
X2 + X4 ≥ 1 + M2 (1 − δ ).
model = ConcreteModel()
model.X1 = Var(within=Binary)
model.X2 = Var(within=Binary)
model.X3 = Var(within=Binary)
model.X4 = Var(within=Binary)
model.X5 = Var(within=Binary)
6
model.Y1 = Var(within=Binary)
solver = SolverFactory(’glpk’)
results = solver.solve(model)
print()
print(’* Solución *’)
print(’* Problema 2 *:’)
print(’X1:’, value(model.X1))
print(’X2:’, value(model.X2))
print(’X3:’, value(model.X3))
print(’X4:’, value(model.X4))
print(’X5:’, value(model.X5))
print(’Y1:’, value(model.Y1))
print(’objective:’, value(model.obj))
Problema 3
Un ingeniero de software trabaja en una empresa de tecnologı́a. Tiene dos proyectos en los que puede asig-
nar recursos de desarrollo: x1 representa la cantidad de horas que asignas al primer proyecto y x2 la cantidad
de horas que asignas al segundo proyecto. El objetivo es maximizar esta expresión 15x1 + 5x2 para lograr el
mayor impacto posible.
Sin embargo, existen restricciones importantes a considerar. La primera restricción es que la suma de horas
invertidas en ambos proyectos no puede exceder un lı́mite, (3x12 + x22 ≤ 2). La segunda restricción es que
debes respetar un presupuesto de horas limitado para los proyectos (2x1 + 3x2 ≤ 4).
a) Plantear las ecuaciones de Karush-Kuhn-Tucker para este problema, teniendo en cuenta las restric-
ciones.
7
b) Resolver este problema mediante software como Pyomo o Excel para determinar cómo debes asignar
las horas-hombre a los proyectos para maximizar la eficiencia total de desarrollo.
Solución:
a)
max z = f (x1 , x2 )
s.a. g1 (x1 , x2 ) ≤ b1
g2 (x1 , x2 ) ≤ b2
x1 , x2 ∈ R
Las ecuaciones de Karush-Kuhn-Tucker se definen como:
∇ f (x1 , x2 ) + ∑m i=1 ui ∇gi (x1 , x2 ) = 0 (n ecuaciones)
ui (gi (x1 , x2 ) − bi ) =0 ∀i = 1, 2 (m ecuaciones)
Variables: n = 2
Restricciones:m = 2
Restricciones:
(
g1 (x1 , x2 ) = 3x12 + x22
g2 (x1 , x2 ) = 2x1 + 3x2
Términos independientes: (
b1 =2
b2 =4
Los gradientes son:
∇ f (x1 , x2 ) = (15, 5)
∇g1 (x1 , x2 ) = (6x1 , 2x2 )
∇g2 (x1 , x2 ) = (2, 3)
8
Ecuaciones KKT:
15 + u1 (6x1 ) + 2u2 = 0
5 + u (2x ) + 3u = 0
1 2 2
u (3x 2 + x2 − 2) = 0
1 1 2
u2 (2x1 + 3x2 − 4) = 0
b)
model = ConcreteModel()
model.x1 = Var(within=Reals)
model.x2 = Var(within=Reals)
model.obj = Objective(expr=15*model.x1 + 5*model.x2, sense=maximize)
model.con1 = Constraint(expr=3*model.x1**2 + model.x2**2 <= 2)
model.con2 = Constraint(expr=2*model.x1 + 3*model.x2 <= 4)
solver = SolverFactory(’ipopt’)
results = solver.solve(model)
print()
print(’*** Solution ***:’)
print(’x1:’, value(model.x1))
print(’x2:’, value(model.x2))
print(’objective:’, value(model.obj))
x∗ = (0.71, 0.71)
El ingeniero debe emplear 0.71 horas para cada proyecto para maximizar el impacto posible, obteniendo
un valor de 14.14 de impacto.
Problema 4
Una compañı́a de consultorı́a con cinco proyectos diferentes (P1 a P5) y cinco consultores (C1 a C5). Cada
consultor tiene una tarifa especı́fica por proyecto, representada por una matriz de costes. La compañı́a busca
asignar un consultor a cada proyecto de manera que el costo total sea mı́nimo. Para ello se proporciona la
siguiente matriz de costes:
9
4 9 3 11 4
9 8 3 10 8
C′ =
7 5 3 8 6
9 5 3 4 6
10 11 7 10 11
a)
s.a. ∑5j=1 Xi j = 1 ∀i ∈ I
∑5i=1 Xi j = 1 ∀j ∈ J
Xi j ∈ {0, 1} ∀i ∈ I, ∀ j ∈ J
Índices:
• Consultores: I = {1, 2, 3, 4, 5}
• Proyectos: J = {1, 2, 3, 4, 5}
Variables: Xi j = (
1 si el consultor i se asigna el proyecto j
∀i ∈ I, ∀ j ∈ J
0 en otro caso
Vector de variables:
X = (X11 , . . . , X15 , X21 , . . . , X25 , . . . , X51 , . . . , X55 )t ∈ {0, 1}25
Función objetivo: Coste total de la asignación.
5 5
z = ∑ ∑ c′i j Xi j
i=1 j=1
Restricciones:
5
Rr : ∑ j=1 Xi j = 1 ∀i ∈ I (A cada consultor se le asigna un único proyecto)
5
Rt : ∑i=1 Xi j = 1 ∀ j ∈ J (Cada proyecto es realizado por un único consultor)
Rb : Xi j ∈ {0, 1} ∀i ∈ I, ∀ j ∈ J (Variables binarias)
Parámetros:
10
• Matriz de costes: C′ , donde c′i j es el coste de asignar el consultor i al proyecto j.
Resolviendo el problema planteado con pyomo llegamos a la siguiente solución:
from pyomo.environ import *
from pyomo.opt import SolverFactory
model = ConcreteModel()
# Variables
model.x = Var(consultores, proyectos, domain=Binary)
# Restricciones:
model.consultores_asignados = ConstraintList()
for i in consultores:
model.consultores_asignados.add(sum(model.x[i,j] for j in proyectos) == 1)
model.proyectos_asignados = ConstraintList()
for j in proyectos:
model.proyectos_asignados.add(sum(model.x[i,j] for i in consultores) == 1)
solver = SolverFactory(’glpk’)
results = solver.solve(model)
# Imprimir la solución
print(’*** Solución ***:’)
for i in consultores:
for j in proyectos:
if value(model.x[i,j]) == 1:
print(f’Consultor {i+1} asignado al Proyecto {j+1}’)
print(’Costo total:’, value(model.obj))
*** Solución ***
11
*** Problema 4 ***:
∗ ∗ ∗ ∗ ∗
X15 = X23 = X32 = X43 = X51 =1 y Xi∗j = 0 en otro caso;
z∗ = 26
Por tanto, podemos concluir que la siguiente asignación es óptima:
Consultor C1 C2 C3 C4 C5
Proyecto P5 P3 P2 P4 P1
Con esta asignación estratégica de los consultores a los proyectos, la compañı́a logra una optimización efi-
ciente de sus recursos, alcanzando un costo total mı́nimo de 26 unidades, lo que representa la solución más
económica posible dadas las tarifas especı́ficas de cada consultor por proyecto.
12