Created
August 22, 2019 01:49
-
-
Save ELC/a54149a25d3f2071d9a5da32a31a1c60 to your computer and use it in GitHub Desktop.
FRRo Operativa Demo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
channels: | |
- defaults | |
- conda-forge | |
dependencies: | |
- ipython | |
- ipywidgets | |
- matplotlib | |
- numpy |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2019-08-20T19:58:59.648656Z", | |
"start_time": "2019-08-20T19:58:58.855662Z" | |
}, | |
"init_cell": true, | |
"slideshow": { | |
"slide_type": "skip" | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"from IPython.display import display as idisplay\n", | |
"from matplotlib import pyplot as plt\n", | |
"import numpy as np\n", | |
"\n", | |
"from IPython.display import HTML\n", | |
"from ipywidgets.widgets import interactive, IntSlider, FloatSlider, Layout, HBox, VBox\n", | |
"\n", | |
"from utils import *\n", | |
"\n", | |
"%matplotlib inline\n", | |
"\n", | |
"plt.style.use('bmh')\n", | |
"\n", | |
"slider_width = 300\n", | |
"\n", | |
"style = {'description_width': '30px'}\n", | |
"slider_layout = Layout(width=f'{slider_width}px')" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "slide" | |
} | |
}, | |
"source": [ | |
"# 1. INTRODUCCIÓN A LA PROGRAMACIÓN LINEAL" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "subslide" | |
} | |
}, | |
"source": [ | |
"## 1.1 UN POCO DE HISTORIA\n", | |
"\n", | |
"La Programación Lineal fue conceptualmente desarrollada antes de la segunda guerra mundial. Sin embargo, el mayor progreso en este campo se ubica en 1947 cuando George Dantzig, matemático estadounidense, plantea en términos muy precisos el modelo estándar al cual se ajusta todo problema de programación lineal. Posteriormente Dantzig también formula el procedimiento de solución conocido como Método Simplex. \n", | |
"\n", | |
"Como trabajos de valor anteriores a 1947, que tuvieron influencia sobre la programación lineal, cabe citar la Teoría de Juegos publicada en 1928 por el matemático norteamericano de origen húngaro John Von Neumann y la extensa monografía presentada en 1939 por Leonid Kantorovich, titulada Métodos Matemáticos en la Organización y Planificación de la Producción. Kantorovich, economista, ingeniero y matemático ruso, obtiene en 1975 el Premio Nobel de Economía por sus aportaciones a la Teoría de la Asignación Óptima de Recursos." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "subslide" | |
} | |
}, | |
"source": [ | |
"## 1.2 ¿QUÉ ES UN PROGRAMA LINEAL?\n", | |
"\n", | |
"La Programación (u Optimización) Matemática aborda el diseño de metodologías para resolver, desde un punto de vista práctico, situaciones reales en las cuales, en general, se pretende determinar la asignación de recursos escasos para cumplir un objetivo dado.1 Tales situaciones presentan además, como aspecto común, la necesidad de identificar el mejor curso de acción (en lo posible, el óptimo), frente a múltiples alternativas de solución.\n", | |
"\n", | |
"Una de las herramientas más importantes de la optimiza ción matemática es la programación lineal, siendo habitual su uso en diversas áreas de toma de decisiones de empresas y organizaciones de todo el mundo.\n", | |
"\n", | |
"Un problema (o programa) lineal está compuesto por una función objetivo a optimizar y un conjunto de restricciones que limitan o condicionan dicho objetivo. Como característica distintiva, tanto la función objetivo como las restricciones, son funciones lineales. El siguiente ejemplo nos permitirá introducir el tema de manera sencilla.\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "slide" | |
} | |
}, | |
"source": [ | |
"### Ejemplo 1-1\n", | |
"\n", | |
"Un pequeño taller de alfarería produce vasijas y cántaros de alta calidad, con diseños y colores autóctonos. Los principales recursos utilizados en el taller son la mano de obra calificada de artesanos locales y cierto tipo de arcilla. Actualmente se dispone de 40 h oras de mano de obra y 75kg de arcilla, por día.\n", | |
"\n", | |
"Cada vasija tiene una contribución marginal de $ \\$ 20$ y requiere $~\\$ 1 $ hora de mano de obra y $3kg$ de arcilla, mientras que, cada cántaro tiene una contribución marginal de $ \\$45$ e insume 2 horas de mano de obra y $1,5kg$ de arcilla. Se sabe además, que la demanda diaria de cántaros nunca excede las $15$ unidades.\n", | |
"\n", | |
"Bajo el supuesto que todas las unidades producidas pueden venderse, se desea programar la producción diaria de manera de maximizar la contribución marginal total.\n", | |
"\n", | |
"La formulación de un programa lineal requiere la construcción de un **modelo matemático** en términos de:\n", | |
"\n", | |
"- **Variables de decisión**, también denominadas **variables concreta** o **actividades** del sistema.\n", | |
"- Una **función económica** (función **objetivo** o **funcional**) a maximizar o minimizar, siendo ésta una función lineal de las variables de decisión.\n", | |
"- Un conjunto de restricciones que limitan los valores de las variables de decisión, siendo cada restricción una ecuación o inecuación lineal de las variables de decisión.\n", | |
"\n", | |
"De esta forma, para el Ejemplo 1-1 tendremos:\n", | |
"\n", | |
"Variables de decisión\n", | |
"\n", | |
"- $x_1$: producción diaria de vasijas (en unidades)\n", | |
"- $x_2$: producción diaria de cántaros (en unidades)\n", | |
"\n", | |
"Función objetivo\n", | |
"\n", | |
"<center> Maximizar $z= 20 x_1 + 45 x_2$</center>\n", | |
"\n", | |
"Restricciones\n", | |
"\n", | |
"- Disponibilidad de mano de obra (en horas diarias): $x_1 + 2x_2 \\le 40$\n", | |
"- Disponibilidad de arcilla (en $\\frac{kg}{dia}$): $3x_1 + 1.5x_2 \\le 75$\n", | |
"- Demanda máxima (en unidades diarias): $x_2 \\le 15$\n", | |
"\n", | |
"Como **restricciones implícitas, las variables de decisión deben ser no negativas.\n", | |
"\n", | |
"$$ x_1, x_2 \\ge 0$$\n", | |
"\n", | |
"La condición de no negatividad dota a las variables de significado económico y resulta fundamental para el método de resolución.\n", | |
"\n", | |
"En síntesis, en lenguaje matemático, nuestro problema consiste en seleccionar los valores o niveles de las actividades x1 y x2 para\n", | |
"\n", | |
"<center> Maximizar $z= 20 x_1 + 45 x_2$</center>\n", | |
"\n", | |
"Sujeta a las restricciones\n", | |
"\n", | |
"$$x_1 + 2x_2 \\le 40$$\n", | |
"$$3x_1 + 1.5x_2 \\le 75$$\n", | |
"$$x_2 \\le 15$$\n", | |
"$$ x_1, x_2 \\ge 0$$" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "skip" | |
} | |
}, | |
"source": [ | |
"# COMPLETAR LAS SECCIONES FALTANTES" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"slideshow": { | |
"slide_type": "slide" | |
} | |
}, | |
"source": [ | |
"# 1.5 PROGRAMAS LINEALES BIDIMENSIONALES. MÉTODO GRÁFICO\n", | |
"\n", | |
"COMPLETAR TEXTO\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2019-08-20T19:58:59.800651Z", | |
"start_time": "2019-08-20T19:58:59.652653Z" | |
}, | |
"init_cell": true, | |
"slideshow": { | |
"slide_type": "skip" | |
} | |
}, | |
"outputs": [], | |
"source": [ | |
"interaction = interactive(plot_two_variables, a11=FloatSlider(min=0, max=5, step=0.1, value=0.9, description='a11', style=style, layout=slider_layout),\n", | |
" a21=FloatSlider(min=0, max=5, step=0.1, value=2, description='a21', style=style, layout=slider_layout),\n", | |
" a12=FloatSlider(min=0, max=5, step=0.1, value=3, description='a12', style=style, layout=slider_layout),\n", | |
" a22=FloatSlider(min=0, max=5, step=0.1, value=1.5, description='a22', style=style, layout=slider_layout),\n", | |
" a13=FloatSlider(min=0, max=5, step=0.1, value=0, description='a13', style=style, layout=slider_layout),\n", | |
" a23=FloatSlider(min=0, max=5, step=0.1, value=1, description='a23', style=style, layout=slider_layout),\n", | |
" b1=IntSlider(min=0, max=100, step=1, value=40, description='b1', style=style, layout=slider_layout),\n", | |
" b2=IntSlider(min=0, max=100, step=1, value=75, description='b2', style=style, layout=slider_layout),\n", | |
" b3=IntSlider(min=0, max=100, step=1, value=15, description='b3', style=style, layout=slider_layout),\n", | |
" c1=IntSlider(min=0, max=100, step=1, value=20, description='c1', style=style, layout=slider_layout),\n", | |
" c2=IntSlider(min=0, max=100, step=1, value=45, description='c2', style=style, layout=slider_layout),\n", | |
");\n", | |
"\n", | |
"components = interaction.children[:-1]\n", | |
"graph = interaction.children[-1]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": { | |
"ExecuteTime": { | |
"end_time": "2019-08-20T19:59:00.229643Z", | |
"start_time": "2019-08-20T19:58:59.803649Z" | |
}, | |
"init_cell": true, | |
"slideshow": { | |
"slide_type": "subslide" | |
} | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"application/vnd.jupyter.widget-view+json": { | |
"model_id": "931e5996e80142ef900db336043749dc", | |
"version_major": 2, | |
"version_minor": 0 | |
}, | |
"text/plain": [ | |
"HBox(children=(VBox(children=(FloatSlider(value=0.9, description='a11', layout=Layout(width='300px'), max=5.0,…" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"HBox([VBox(components, layout=Layout(width=f'{slider_width*1.3}px')), VBox([graph])])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"interaction.children[0].value=1.0" | |
] | |
} | |
], | |
"metadata": { | |
"celltoolbar": "Initialization Cell", | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.7.3" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Extracted from https://github.com/binder-examples/jupyter-extension/blob/master/postBuild | |
jupyter contrib nbextension install --user | |
jupyter nbextension enable init_cell/main | |
# Notebooks w/ extensions that auto-run code must be "trusted" to work the first time | |
jupyter trust PLC1.ipynb |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import matplotlib.pyplot as plt | |
import numpy as np | |
def plot_two_variables(a11, a21, a12, a22, a13, a23, b1, b2, b3, c1, c2): | |
fig = plt.figure(figsize=(12, 6)) | |
x_1 = np.linspace(0, 45, 100) | |
# Mano de Obra | |
x_2 = b1/a21 - a11/a21 * x_1 | |
plt.plot(x_1, x_2, label="Mano de Obra") | |
x_4 = x_2 | |
# Materia Prima | |
x_2 = b2/a22 - a12/a22 * x_1 | |
plt.plot(x_1, x_2, label="Materia Prima") | |
x_4 = np.minimum(x_4, x_2) | |
# Demanda | |
x_2 = b3/a23 + a13/a23 * x_1 | |
plt.plot(x_1, x_2, label="Demanda") | |
x_4 = np.minimum(x_4, x_2) | |
# Sombrear area de interés | |
plt.fill_between(x_1, 0, x_4, color='grey', alpha=0.5) | |
# Optimo | |
z = c1 * x_1 + c2 * x_4 | |
z_x_2 = np.max(z) | |
z_x_1 = np.argmax(z) | |
plt.scatter(x_1[z_x_1], x_4[z_x_1], label="Óptimo", s=100, color="black") | |
# Fijar ticks | |
plt.xticks(np.arange(0, 46, 5)) | |
plt.yticks(np.arange(0, 51, 5)) | |
# Fijar Límites de X e Y | |
plt.ylim(0, 50) | |
plt.xlim(0, 45) | |
plt.legend() | |
plt.tight_layout() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment