{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Bienvenidos a Jupyter Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jupyter es un entorno interactivo de ejecución de código, aquí podemos mostrar de forma más ordenada y explicativa el código que estamos ejecutando." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos importar las librerías clásicas:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Titulo pequeño\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## titulo mediano" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#esto es un ejemplo\n", "def suma(x, y):\n", " return x+y" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "35" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "suma(15, 20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aquí acabamos de realizar una suma" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "y comprobar que es como si estuviesemos trabajando en cualquier script:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50\n" ] } ], "source": [ "a=100\n", "b=50\n", "print(a-b)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hay q empezar a hacer la tarea de Opti\n" ] } ], "source": [ "print(\"Hay q empezar a hacer la tarea de Opti\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "También podemos realizar informes o reportes de las tareas de forma más bacán por que se puede utilizar $LATEX$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\sum_{0}^{n}\\frac{1}{x^{2}}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$P=\\{x\\in\\mathcal{R}^{n}|Ax=b, x\\geq0\\}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$\\frac{x^{2}}{1000}$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "aqui hemos definido un poliedro" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora vayamos a $\\textbf{PULP}$." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import pulp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El modelo resultante del problema anterior:\n", "\n", "$$\\begin{array}{cc} \\min & \\sum^{10}_{j=1}e_j(C_E)_j + \\sum^6_{i=1}\\sum^{10}_{j=1}a_{ij}(C_A)_{ij} &\\\\\n", "\\mbox{s.a} & e_{j}\\in\\{0,1\\}&\\forall j \\in \\{1,2,3,4,5,6,7,8,9,10\\} \\\\\n", " & a_{i,j}\\in \\mathbb{N}_0&\\forall i\\in\\{1,2,3,4,5,6\\}, j\\in\\{1,2,3,4,5,6,7,8,9,10\\}\\\\\n", " &\\sum^{6}_{i=1}a_{i,j}- e_jP_j\\leq 0&\\forall j \\in \\{1,2,3,4,5,6,7,8,9,10\\} \\\\\n", " & \\sum^{10}_{j=1}a_{i,j}=D_i&\\forall i \\in \\{1,2,3,4,5,6\\} \n", "\\end{array}\n", "$$\n", "\n", "donde $e_j$ nos dice si la escuela $j$ abre o no y $a_{ij}$ nos dice el número de niños que del área $i$ que asistiran a la escuela $j$.\n", "$C_E$ es un vector que nos dice cuanto cuesta abrir una escuela.\n", "$C_A$ es una matriz que entrega el costo anuel de que un niño del área $i$ asista a una escuela $j$.\n", "El vecotr $P$ nos entrega la capacidad de cada escuela y el vector $D$ la demanda de cada zona." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "$C_E=\\begin{pmatrix}\n", "100000\\\\ 500000\\\\ 150000\\\\ 230000\\\\ 100000\\\\ 180000\\\\ 90000\\\\ 100000\\\\ 100000\\\\ 100000\n", "\\end{pmatrix}$ \n", "\n", "\n", "\n", "\n", "\n", "$C_A=\\begin{pmatrix}\n", "0 & 0 & 150 & 150 & 150 & 150 & 150 & 150 & 150 & 150 \\\\ \n", "150 & 150 & 0 & 150 & 150 & 150 & 150 & 150 & 150 & 150 \\\\ \n", "150 & 150& 150& 0 & 0 & 150& 150& 150 & 150 & 150 \\\\ \n", "150 & 150 & 150 & 150 & 150 & 0 & 150 & 150 & 150 & 150 \\\\ \n", "200 & 200 & 200 & 200 & 200 & 200 & 0 & 200 & 200 & 200 \\\\ \n", "200 & 200 & 200 & 200 & 200 & 200 & 200 & 0 & 0 & 0\n", "\\end{pmatrix}$\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\n", "P=\\begin{pmatrix}\n", "1500\\\\ 2000\\\\ 800\\\\ 2000\\\\ 800\\\\ 1000\\\\ 1200\\\\ 1500\\\\ 1500\\\\ 500\n", "\\end{pmatrix}\\;\\;\n", "D=\\begin{pmatrix}\n", "1200\\\\ 800\\\\ 1400\\\\ 2500\\\\ 1000\\\\ 1500\n", "\\end{pmatrix}\n", "$$ \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A continuación definimos los parámetros:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "CE=[0,100000,500000,150000,230000,100000,180000,90000,100000,100000,100000]\n", "CA=[[0,0,0,0,0,0,0,0,0,0,0],\\\n", " [0,0,0,150,150,150,150,150,150,150,150],\\\n", " [0,150 , 150 , 0 ,150 , 150 , 150 , 150 , 150 , 150 , 150],\\\n", " [0,150 , 150, 150, 0 , 0 , 150, 150, 150 , 150 , 150],\\\n", " [0,150 , 150 , 150 , 150 , 150 , 0 , 150 , 150 , 150 , 150],\\\n", " [0,200 , 200 , 200 , 200 , 200 , 200 , 0 , 200 , 200 , 200],\\\n", " [0,200,200,200,200,200,200,200,0,0,0]]\n", "P=[0,1500, 2000, 800, 2000, 800, 1000, 1200, 1500, 1500, 500]\n", "D=[0,1200, 800, 1400, 2500, 1000, 1500]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ojo que estamos agregando ceros ya que python indexa desde 0 y no desde 1." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Ahora las variables" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "#Listas\n", "I=[1,2,3,4,5,6]\n", "J=[1,2,3,4,5,6,7,8,9,10]\n", "\n", "#Variables\n", "e = pulp.LpVariable.dicts(\"e\", (j for j in J), cat='Binary')\n", "a = pulp.LpVariable.dicts(\"a\", ((i,j) for i in I for j in J), lowBound=0, cat='Integer')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora podemos definir el modelos agregándole restricciones." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Modelo:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "asignacion:\n", "MINIMIZE\n", "150*a_(1,_10) + 150*a_(1,_3) + 150*a_(1,_4) + 150*a_(1,_5) + 150*a_(1,_6) + 150*a_(1,_7) + 150*a_(1,_8) + 150*a_(1,_9) + 150*a_(2,_1) + 150*a_(2,_10) + 150*a_(2,_2) + 150*a_(2,_4) + 150*a_(2,_5) + 150*a_(2,_6) + 150*a_(2,_7) + 150*a_(2,_8) + 150*a_(2,_9) + 150*a_(3,_1) + 150*a_(3,_10) + 150*a_(3,_2) + 150*a_(3,_3) + 150*a_(3,_6) + 150*a_(3,_7) + 150*a_(3,_8) + 150*a_(3,_9) + 150*a_(4,_1) + 150*a_(4,_10) + 150*a_(4,_2) + 150*a_(4,_3) + 150*a_(4,_4) + 150*a_(4,_5) + 150*a_(4,_7) + 150*a_(4,_8) + 150*a_(4,_9) + 200*a_(5,_1) + 200*a_(5,_10) + 200*a_(5,_2) + 200*a_(5,_3) + 200*a_(5,_4) + 200*a_(5,_5) + 200*a_(5,_6) + 200*a_(5,_8) + 200*a_(5,_9) + 200*a_(6,_1) + 200*a_(6,_2) + 200*a_(6,_3) + 200*a_(6,_4) + 200*a_(6,_5) + 200*a_(6,_6) + 200*a_(6,_7) + 100000*e_1 + 100000*e_10 + 500000*e_2 + 150000*e_3 + 230000*e_4 + 100000*e_5 + 180000*e_6 + 90000*e_7 + 100000*e_8 + 100000*e_9 + 0\n", "SUBJECT TO\n", "_C1: a_(1,_1) + a_(2,_1) + a_(3,_1) + a_(4,_1) + a_(5,_1) + a_(6,_1)\n", " - 1500 e_1 <= 0\n", "\n", "_C2: a_(1,_2) + a_(2,_2) + a_(3,_2) + a_(4,_2) + a_(5,_2) + a_(6,_2)\n", " - 2000 e_2 <= 0\n", "\n", "_C3: a_(1,_3) + a_(2,_3) + a_(3,_3) + a_(4,_3) + a_(5,_3) + a_(6,_3) - 800 e_3\n", " <= 0\n", "\n", "_C4: a_(1,_4) + a_(2,_4) + a_(3,_4) + a_(4,_4) + a_(5,_4) + a_(6,_4)\n", " - 2000 e_4 <= 0\n", "\n", "_C5: a_(1,_5) + a_(2,_5) + a_(3,_5) + a_(4,_5) + a_(5,_5) + a_(6,_5) - 800 e_5\n", " <= 0\n", "\n", "_C6: a_(1,_6) + a_(2,_6) + a_(3,_6) + a_(4,_6) + a_(5,_6) + a_(6,_6)\n", " - 1000 e_6 <= 0\n", "\n", "_C7: a_(1,_7) + a_(2,_7) + a_(3,_7) + a_(4,_7) + a_(5,_7) + a_(6,_7)\n", " - 1200 e_7 <= 0\n", "\n", "_C8: a_(1,_8) + a_(2,_8) + a_(3,_8) + a_(4,_8) + a_(5,_8) + a_(6,_8)\n", " - 1500 e_8 <= 0\n", "\n", "_C9: a_(1,_9) + a_(2,_9) + a_(3,_9) + a_(4,_9) + a_(5,_9) + a_(6,_9)\n", " - 1500 e_9 <= 0\n", "\n", "_C10: a_(1,_10) + a_(2,_10) + a_(3,_10) + a_(4,_10) + a_(5,_10) + a_(6,_10)\n", " - 500 e_10 <= 0\n", "\n", "_C11: a_(1,_1) + a_(1,_10) + a_(1,_2) + a_(1,_3) + a_(1,_4) + a_(1,_5)\n", " + a_(1,_6) + a_(1,_7) + a_(1,_8) + a_(1,_9) = 1200\n", "\n", "_C12: a_(2,_1) + a_(2,_10) + a_(2,_2) + a_(2,_3) + a_(2,_4) + a_(2,_5)\n", " + a_(2,_6) + a_(2,_7) + a_(2,_8) + a_(2,_9) = 800\n", "\n", "_C13: a_(3,_1) + a_(3,_10) + a_(3,_2) + a_(3,_3) + a_(3,_4) + a_(3,_5)\n", " + a_(3,_6) + a_(3,_7) + a_(3,_8) + a_(3,_9) = 1400\n", "\n", "_C14: a_(4,_1) + a_(4,_10) + a_(4,_2) + a_(4,_3) + a_(4,_4) + a_(4,_5)\n", " + a_(4,_6) + a_(4,_7) + a_(4,_8) + a_(4,_9) = 2500\n", "\n", "_C15: a_(5,_1) + a_(5,_10) + a_(5,_2) + a_(5,_3) + a_(5,_4) + a_(5,_5)\n", " + a_(5,_6) + a_(5,_7) + a_(5,_8) + a_(5,_9) = 1000\n", "\n", "_C16: a_(6,_1) + a_(6,_10) + a_(6,_2) + a_(6,_3) + a_(6,_4) + a_(6,_5)\n", " + a_(6,_6) + a_(6,_7) + a_(6,_8) + a_(6,_9) = 1500\n", "\n", "VARIABLES\n", "0 <= a_(1,_1) Integer\n", "0 <= a_(1,_10) Integer\n", "0 <= a_(1,_2) Integer\n", "0 <= a_(1,_3) Integer\n", "0 <= a_(1,_4) Integer\n", "0 <= a_(1,_5) Integer\n", "0 <= a_(1,_6) Integer\n", "0 <= a_(1,_7) Integer\n", "0 <= a_(1,_8) Integer\n", "0 <= a_(1,_9) Integer\n", "0 <= a_(2,_1) Integer\n", "0 <= a_(2,_10) Integer\n", "0 <= a_(2,_2) Integer\n", "0 <= a_(2,_3) Integer\n", "0 <= a_(2,_4) Integer\n", "0 <= a_(2,_5) Integer\n", "0 <= a_(2,_6) Integer\n", "0 <= a_(2,_7) Integer\n", "0 <= a_(2,_8) Integer\n", "0 <= a_(2,_9) Integer\n", "0 <= a_(3,_1) Integer\n", "0 <= a_(3,_10) Integer\n", "0 <= a_(3,_2) Integer\n", "0 <= a_(3,_3) Integer\n", "0 <= a_(3,_4) Integer\n", "0 <= a_(3,_5) Integer\n", "0 <= a_(3,_6) Integer\n", "0 <= a_(3,_7) Integer\n", "0 <= a_(3,_8) Integer\n", "0 <= a_(3,_9) Integer\n", "0 <= a_(4,_1) Integer\n", "0 <= a_(4,_10) Integer\n", "0 <= a_(4,_2) Integer\n", "0 <= a_(4,_3) Integer\n", "0 <= a_(4,_4) Integer\n", "0 <= a_(4,_5) Integer\n", "0 <= a_(4,_6) Integer\n", "0 <= a_(4,_7) Integer\n", "0 <= a_(4,_8) Integer\n", "0 <= a_(4,_9) Integer\n", "0 <= a_(5,_1) Integer\n", "0 <= a_(5,_10) Integer\n", "0 <= a_(5,_2) Integer\n", "0 <= a_(5,_3) Integer\n", "0 <= a_(5,_4) Integer\n", "0 <= a_(5,_5) Integer\n", "0 <= a_(5,_6) Integer\n", "0 <= a_(5,_7) Integer\n", "0 <= a_(5,_8) Integer\n", "0 <= a_(5,_9) Integer\n", "0 <= a_(6,_1) Integer\n", "0 <= a_(6,_10) Integer\n", "0 <= a_(6,_2) Integer\n", "0 <= a_(6,_3) Integer\n", "0 <= a_(6,_4) Integer\n", "0 <= a_(6,_5) Integer\n", "0 <= a_(6,_6) Integer\n", "0 <= a_(6,_7) Integer\n", "0 <= a_(6,_8) Integer\n", "0 <= a_(6,_9) Integer\n", "0 <= e_1 <= 1 Integer\n", "0 <= e_10 <= 1 Integer\n", "0 <= e_2 <= 1 Integer\n", "0 <= e_3 <= 1 Integer\n", "0 <= e_4 <= 1 Integer\n", "0 <= e_5 <= 1 Integer\n", "0 <= e_6 <= 1 Integer\n", "0 <= e_7 <= 1 Integer\n", "0 <= e_8 <= 1 Integer\n", "0 <= e_9 <= 1 Integer\n", "\n" ] } ], "source": [ "#Problema\n", "model = pulp.LpProblem(\"asignacion\", pulp.LpMinimize)\n", "\n", "#Funcion objetivo\n", "model += pulp.lpSum([e[j]*CE[j] for j in J])+\\\n", " pulp.lpSum([pulp.lpSum([a[i,j]*CA[i][j] for i in I]) for j in J])\n", "\n", "#Restricciones\n", "for j in J:\n", " model += pulp.lpSum([a[i, j] for i in I]) - e[j]*P[j]<=0\n", " \n", "for i in I:\n", " model += pulp.lpSum([a[i, j] for j in J])==D[i]\n", "\n", "print(model)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora podemos resolver el problema." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Optimal'" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Resolver\n", "model.solve()\n", "#Estado\n", "pulp.LpStatus[model.status]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y podemos analizar la solución encontrada:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a_(1,_1) = 1200.0\n", "a_(1,_10) = 0.0\n", "a_(1,_2) = 0.0\n", "a_(1,_3) = 0.0\n", "a_(1,_4) = 0.0\n", "a_(1,_5) = 0.0\n", "a_(1,_6) = 0.0\n", "a_(1,_7) = 0.0\n", "a_(1,_8) = 0.0\n", "a_(1,_9) = 0.0\n", "a_(2,_1) = 0.0\n", "a_(2,_10) = 0.0\n", "a_(2,_2) = 0.0\n", "a_(2,_3) = 800.0\n", "a_(2,_4) = 0.0\n", "a_(2,_5) = 0.0\n", "a_(2,_6) = 0.0\n", "a_(2,_7) = 0.0\n", "a_(2,_8) = 0.0\n", "a_(2,_9) = 0.0\n", "a_(3,_1) = 0.0\n", "a_(3,_10) = 0.0\n", "a_(3,_2) = 0.0\n", "a_(3,_3) = 0.0\n", "a_(3,_4) = 1400.0\n", "a_(3,_5) = 0.0\n", "a_(3,_6) = 0.0\n", "a_(3,_7) = 0.0\n", "a_(3,_8) = 0.0\n", "a_(3,_9) = 0.0\n", "a_(4,_1) = 300.0\n", "a_(4,_10) = 0.0\n", "a_(4,_2) = 0.0\n", "a_(4,_3) = 0.0\n", "a_(4,_4) = 600.0\n", "a_(4,_5) = 0.0\n", "a_(4,_6) = 0.0\n", "a_(4,_7) = 164.0\n", "a_(4,_8) = 0.0\n", "a_(4,_9) = 1436.0\n", "a_(5,_1) = 0.0\n", "a_(5,_10) = 0.0\n", "a_(5,_2) = 0.0\n", "a_(5,_3) = 0.0\n", "a_(5,_4) = 0.0\n", "a_(5,_5) = 0.0\n", "a_(5,_6) = 0.0\n", "a_(5,_7) = 1000.0\n", "a_(5,_8) = 0.0\n", "a_(5,_9) = 0.0\n", "a_(6,_1) = 0.0\n", "a_(6,_10) = 0.0\n", "a_(6,_2) = 0.0\n", "a_(6,_3) = 0.0\n", "a_(6,_4) = 0.0\n", "a_(6,_5) = 0.0\n", "a_(6,_6) = 0.0\n", "a_(6,_7) = 0.0\n", "a_(6,_8) = 1500.0\n", "a_(6,_9) = 0.0\n", "e_1 = 1.0\n", "e_10 = 0.0\n", "e_2 = 0.0\n", "e_3 = 1.0\n", "e_4 = 1.0\n", "e_5 = 0.0\n", "e_6 = 0.0\n", "e_7 = 1.0\n", "e_8 = 1.0\n", "e_9 = 1.0\n" ] } ], "source": [ "#Valores optimos de las variables\n", "for variable in model.variables():\n", " print(\"{} = {}\".format(variable.name, variable.varValue))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y la solución óptima" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1145000.0\n" ] } ], "source": [ "#Optimo de la funcion objetivo\n", "print(pulp.value(model.objective))" ] } ], "metadata": { "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.0" } }, "nbformat": 4, "nbformat_minor": 2 }