Skip to content

Instantly share code, notes, and snippets.

@ELC
Created August 22, 2019 01:49
Show Gist options
  • Save ELC/a54149a25d3f2071d9a5da32a31a1c60 to your computer and use it in GitHub Desktop.
Save ELC/a54149a25d3f2071d9a5da32a31a1c60 to your computer and use it in GitHub Desktop.
FRRo Operativa Demo
channels:
- defaults
- conda-forge
dependencies:
- ipython
- ipywidgets
- matplotlib
- numpy
Display the source blob
Display the rendered blob
Raw
{
"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
}
# 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
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