op (2)

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

Optimización

Jaime Hernández Hernández


November 2023

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.

• Obtener el número de hectáreas de maı́z y trigo para maximizar el beneficio.


Modelizar matemáticamente el problema indicando todos los elementos del modelo.

max 500X1 + 400X2


s.a. X1 + X2 ≤ 3
20X1 + 10X2 ≤ 50
X1 , X2 ≥ 0

Los elementos que lo forman son:

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

Representar gráficamente la región factible.

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).

Elegimos, por ejemplo, Pyomo y ejecutamos el siguiente código en Python:


from pyomo.environ import *
from pyomo.opt import *

model = ConcreteModel()
model.X1 = Var(within=NonNegativeReals)
model.X2 = Var(within=NonNegativeReals)

model.obj = Objective(expr=500*model.X1 + 400*model.X2, sense=maximize)


model.con1 = Constraint(expr=model.X1 + model.X2 <= 3)
model.con2 = Constraint(expr=20*model.X1 + 10*model.X2 <= 50)

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) Modelizar matemáticamente el problema indicando todos los elementos del modelo.

b) Representar gráficamente la región factible.

c) Obtener la combinación de mercancı́as que maximice el valor total en el camión.

a)

El modelo de optimización del problema es el siguiente:


5
max ∑ vi Xi
i=1

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

s.a. 60X1 + 53X2 + 18X3 + 23X4 + 8X5 ≤ 650

X3 + X4 ≤ 1

X3 ≤ δ

X2 + X4 ≥ δ

X1 , X2 , X3 , X4 , X5 ∈ {0, 1}

δ ∈ {0, 1}

Los elementos que lo forman son:

Í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.

X = (X1 , X2 , X3 , X4 , X5 , δ )t ∈ {0, 1}6


Parámetros:
• vi : Valor de la mercancı́a i-ésimo ∀i ∈ I. v = (80, 60, 40, 55, 18)t (euros).

• pi : Peso de la carga i-ésimo ∀i ∈ I. p = (60, 53, 18, 23, 8)t (kg).


• P: Peso máximo que soporta el camión. P = 650 (kg).
Función objetivo:
z = ∑ vi Xi
i∈I

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 − δ ).

Calculando las cotas M1 y M2 (M1 = 1, M2 = −1) obtenemos las expresiones finales:


(
X3 ≤ δ ,
X2 + X4 ≥ δ .

Resolviendo por el software de Pyomo, obtenemos que la solución óptima es:


from pyomo.environ import *
from pyomo.opt import *

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)

model.obj = Objective(expr=80*model.X1 + 60*model.X2 + 40*model.X3+55*model.X4+18*model.X5, sense=ma


model.con1 = Constraint(expr=model.X3 + model.X4 <= 1)
model.con2 = Constraint(expr=model.X3<= model.Y1)
model.con4 = Constraint(expr=60*model.X1 + 53*model.X2+18*model.X3 + 23*model.X4 + 8*model.X5 <= 650
model.con3 = Constraint(expr=model.X4 + model.X2 >= model.Y1)

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))

*** Solución ***


*** Problema 2 ***:
(
z∗ = 213,
X ∗ = (X1∗ , X2∗ , X3∗ , X4∗ , X5∗ , δ ∗ ) = (1, 1, 0, 1, 1, 0).
Por tanto, el camionero deberá llevar las mercancı́as M1, M2,M4,M5 para conseguir maximizar el valor de
la carga, obteniendo un valor total de 213 euros. article amsmath

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)

Dado el problema de programación no lineal restringida con n variables y m restricciones:

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)

Aplicándolo al problema del enunciado:

Variables: n = 2

Restricciones:m = 2

Función objetivo: f (x1 , x2 ) = 15x1 + 5x2

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)

Resolviendo el problema mediante el software de Pyomo, redondeando a 2 decimales, obtenemos la sigu-


iente solución óptima:

from pyomo.environ import *


from pyomo.opt import *

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)

z∗ = f (x1∗ , x2∗ ) = 15 · 0.71 + 5 · 0.71 = 14.14

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) Resolver el problema utilizando programación lineal.

a)

El modelo de optimización del problema es el siguiente:


min ∑5i=1 ∑5j=1 c′i j Xi j

s.a. ∑5j=1 Xi j = 1 ∀i ∈ I

∑5i=1 Xi j = 1 ∀j ∈ J

Xi j ∈ {0, 1} ∀i ∈ I, ∀ j ∈ J

Los elementos que lo forman son:

Í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()

# Número de consultores y proyectos


n_consultores = n_proyectos = 5

# Índices para consultores y proyectos


consultores = range(n_consultores)
proyectos = range(n_proyectos)

C = [[4, 9, 3, 11, 4],


[9, 8, 3, 10, 8],
[7, 5, 3, 8, 6],
[9, 5, 3, 4, 6],
[10, 11, 7, 10, 11]]

# Variables
model.x = Var(consultores, proyectos, domain=Binary)

model.obj = Objective(expr=sum(C[i][j]*model.x[i,j] for i in consultores for j in proyectos), sense=

# 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

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy