{ "nbformat": 4, "nbformat_minor": 0, "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.8.5" }, "colab": { "name": "Guia 1 - Ejercicio 1 final.ipynb", "provenance": [], "collapsed_sections": [ "bkKyWz4HpYKv", "65dDjhT6pYLH" ] } }, "cells": [ { "cell_type": "code", "metadata": { "id": "hmA0i2opzcgQ" }, "source": [ "" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "4gRc7Tuzplau" }, "source": [ "# Instalacion de librerias" ] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "G6VN53Mopkk0", "outputId": "db98051d-59f7-49ec-af95-a8c3d4e84310" }, "source": [ "pip install pulp" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Collecting pulp\n", "\u001b[?25l Downloading https://files.pythonhosted.org/packages/14/c4/0eec14a0123209c261de6ff154ef3be5cad3fd557c084f468356662e0585/PuLP-2.4-py3-none-any.whl (40.6MB)\n", "\u001b[K |████████████████████████████████| 40.6MB 83kB/s \n", "\u001b[?25hCollecting amply>=0.1.2\n", " Downloading https://files.pythonhosted.org/packages/f3/c5/dfa09dd2595a2ab2ab4e6fa7bebef9565812722e1980d04b0edce5032066/amply-0.1.4-py3-none-any.whl\n", "Requirement already satisfied: docutils>=0.3 in /usr/local/lib/python3.7/dist-packages (from amply>=0.1.2->pulp) (0.17)\n", "Requirement already satisfied: pyparsing in /usr/local/lib/python3.7/dist-packages (from amply>=0.1.2->pulp) (2.4.7)\n", "Installing collected packages: amply, pulp\n", "Successfully installed amply-0.1.4 pulp-2.4\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "k94MmZPnrIIO" }, "source": [ "# Carga de librerias" ] }, { "cell_type": "code", "metadata": { "id": "sxKlfYC4pYJ8" }, "source": [ "import pandas as pd\n", "import numpy as np\n", "from scipy.optimize import linprog\n", "from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "Qug49EqtsKTm" }, "source": [ "try:\n", " # settings colab:\n", " from google.colab import drive\n", "except ModuleNotFoundError: \n", " print(\"Ha ocurrido un error\")" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "BId135-bsCTH", "outputId": "59c0dd30-1705-4d5e-fad6-a494f61de99a" }, "source": [ "try:\n", " drive.mount('/content/drive')\n", "except Exception: \n", " print(\"Ha ocurrido un error\") " ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Mounted at /content/drive\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "kDAFG8GSpYKc" }, "source": [ "# Ejercicio 1" ] }, { "cell_type": "markdown", "metadata": { "id": "fY1enPsIpYKf" }, "source": [ "En un taller metalúrgico se fabrican dos tipos de piezas A y B, que deben seguir los siguientes\n", "procesos:\n", "1. Estampado en hojas metálicas\n", "2. Soldado\n", "3. Pintado\n", "\n", "La operación de estampado consiste en preparar partes idénticas que luego serán soldadas de a\n", "pares, formando la pieza A. El mismo proceso se realiza para la pieza B.\n", "Los insumos de equipos son los siguientes, para la realización de cada una de las operaciones\n", "(expresados en segundos por pieza):\n", "\n", "![Guia 1 - Ejercicio 1.jpg](data:image/jpeg;base64,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)\n", "\n", "La utilidad unitaria es de \\$ 4 para la pieza A y \\$ 3 para la pieza B. Se desea establecer el\n", "programa semanal de producción que maximice la utilidad del taller con respecto a las piezas\n", "consideradas." ] }, { "cell_type": "markdown", "metadata": { "id": "ajSjaeqopYKg" }, "source": [ "## Con Scipy" ] }, { "cell_type": "markdown", "metadata": { "id": "jfHan20npYKi" }, "source": [ "Se define la funcion objetivo y las restricciones" ] }, { "cell_type": "markdown", "metadata": { "id": "jN1iNgJxpYKj" }, "source": [ "Observaciones de Scipy: \n", "* Solamente se pueden resolver problemas de Mínimización\n", "* No acepta restricciones de Mayor o igual (>=)" ] }, { "cell_type": "markdown", "metadata": { "id": "G5xaW9H-pYKk" }, "source": [ "En este problema como es de Maximizacion, se cambia a minimizacion de la siguiente forma:\n", "* max z = 4 * x + 3 * y -----> es equivalente a ------> min z = -4 * x - 3 * y" ] }, { "cell_type": "code", "metadata": { "id": "Cbb7BPqHpYKl" }, "source": [ "obj = [-4, -3] # se cambian de signos para pasar de maximizacion a minimizacion\n", "# ─┬ ─┬\n", "# │ └┤ coeficiente para y\n", "# └────┤ coeficiente para x\n", "\n", "lhs_ineq = [[ 3, 8], # Coeficientes estampado lado izquierdo\n", " [12, 6], # Coeficientes soldado lado izquierdo\n", " [ 9, 9]] # Coeficientes pintado ecuacion coeficientes lado izquierdo\n", "\n", "rhs_ineq = [48000, # Estampado ecuacion lado derecho\n", " 42000, # Soldado lado derecho\n", " 36000] # Pintado lado derecho" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "fCvKVuQapYKn" }, "source": [ "Se definen los limites de las variables x e y. Esta definicion es redundante ya que son los valores por defecto" ] }, { "cell_type": "code", "metadata": { "id": "N5J8qJW9pYKo" }, "source": [ "bnd = [(0, float(\"inf\")), # Limite de x\n", " (0, float(\"inf\"))] # Limite of y" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "3Q6JjHJ-pYKp" }, "source": [ "Optimizacion y resolucion del problema" ] }, { "cell_type": "code", "metadata": { "id": "5aAT_DsVpYKq", "outputId": "35d2cd43-83ae-458b-c26a-e51b8cabf668" }, "source": [ "opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq,\n", " bounds=bnd, method=\"revised simplex\")\n", "opt" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ " con: array([], dtype=float64)\n", " fun: -15000.0\n", " message: 'Optimization terminated successfully.'\n", " nit: 2\n", " slack: array([31000., 0., 0.])\n", " status: 0\n", " success: True\n", " x: array([3000., 1000.])" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "markdown", "metadata": { "id": "reUtuxA-pYKu" }, "source": [ "Valores que se obtienen son:\n", "* con: Residuos de restricciones de igualdad\n", "* fun: Valor optimo de la función objetivo en la igualdad (si es que existe)\n", "* message: Status de la solucion\n", "* nit: Numero de iteraciones necesarias para realizar el calculo\n", "* slack: Valores de las variables slack\n", "* status: Numero entero entre 0 y 4 que muestra el resultado de la solucion:\n", " * 0: solucion optima\n", " * 1: iteracion limitada\n", " * 2: solucion degenerada\n", " * 3: solucion irrestrica\n", " * 4: se encuentran dificultadas numericas\n", "* success: Variable booleana que indica si se alcanzo la solucion optima\n", "* x: NumPy array que continiene los valores optimos para las variables de decision" ] }, { "cell_type": "markdown", "metadata": { "id": "bkKyWz4HpYKv" }, "source": [ "## Con Pulp" ] }, { "cell_type": "markdown", "metadata": { "id": "txbDcxsRpYKw" }, "source": [ "Se inicializa una instancia de LpProblem:\n", "* Maximizacion: sense = LpMaximize o -1\n", "* Minimizacion: sense = LpMinimize o 1 (es la opcion que viene por default)" ] }, { "cell_type": "markdown", "metadata": { "id": "PeXcGXsppYKx" }, "source": [ "Creacion del modelo" ] }, { "cell_type": "code", "metadata": { "id": "j8pTDYG7pYKz" }, "source": [ "model = LpProblem(name=\"Maximizacion_Beneficio_Fabrica\", sense=LpMaximize)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "aWHXRtVRpYK0" }, "source": [ "Inicializacion de variables" ] }, { "cell_type": "code", "metadata": { "id": "HTZVp7TOpYK7" }, "source": [ "A = LpVariable(name=\"A\", lowBound=0)\n", "B = LpVariable(name=\"B\", lowBound=0)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "KrhY8DyFpYK8" }, "source": [ "Restricciones" ] }, { "cell_type": "code", "metadata": { "id": "36o0IU0-WhOc" }, "source": [ "random_demanda = rnd()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "rPygJ5hLpYK9" }, "source": [ "model += ( 3 * A + 8 * B <= 48000, \"estampado\")\n", "model += (12 * A + 6 * B <= 42000, \"soldado\")\n", "model += ( 9 * A + 9 * B <= 36000, \"pintado\")" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "82Ie0am0pYK-" }, "source": [ "Funcion Objetivo" ] }, { "cell_type": "code", "metadata": { "id": "GTcFxlzLpYK_" }, "source": [ "obj_func = 4 * A + 3 * B\n", "model += obj_func" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "26EmmA_CpYK_", "outputId": "7dee8a77-e7be-4152-880a-15136e4c777a" }, "source": [ "model" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "Maximizacion_Beneficio_Fabrica:\n", "MAXIMIZE\n", "4*A + 3*B + 0\n", "SUBJECT TO\n", "estampado: 3 A + 8 B <= 48000\n", "\n", "soldado: 12 A + 6 B <= 42000\n", "\n", "pintado: 9 A + 9 B <= 36000\n", "\n", "VARIABLES\n", "A Continuous\n", "B Continuous" ] }, "metadata": { "tags": [] }, "execution_count": 9 } ] }, { "cell_type": "markdown", "metadata": { "id": "Qn-CR8PYpYLB" }, "source": [ "Resolucion del problema" ] }, { "cell_type": "code", "metadata": { "id": "hUUml0N1pYLB" }, "source": [ "status = model.solve()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "C7iL_ysipYLC", "outputId": "96a387fc-f319-41cd-9cf2-ffb5716cb9ab" }, "source": [ "print(f\"status: {model.status}, {LpStatus[model.status]}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "status: 1, Optimal\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "t2TQBV8cpYLD", "outputId": "f1c94c5b-d8b6-4451-bded-2d56d54ef24b" }, "source": [ "print(f\"objective: {model.objective.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "objective: 15000.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "AloPHKDtpYLE", "outputId": "e9fb9f68-1847-4b4b-d53a-38102c9fa42f" }, "source": [ "for var in model.variables():\n", " print(f\"{var.name}: {var.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "A: 3000.0\n", "B: 1000.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "WMAQkVbqpYLF", "outputId": "8d6796a7-a170-428b-f6aa-c8e3ddbbd114" }, "source": [ "for name, constraint in model.constraints.items():\n", " print(f\"{name}: {constraint.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "estampado: -31000.0\n", "soldado: 0.0\n", "pintado: 0.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "65dDjhT6pYLH" }, "source": [ "## Con Pulp - Lectura de dataframes" ] }, { "cell_type": "markdown", "metadata": { "id": "JHpHjuQVpYLH" }, "source": [ "Lectura del dataframe" ] }, { "cell_type": "code", "metadata": { "id": "XaNR1wbZpYLI" }, "source": [ "df_insumos = pd.read_excel('/content/drive/My Drive/Guia 1 - Ejercicio 1/Guia 1 - Ejercicio 1 insumos.xlsx')" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 141 }, "id": "zreySA-bpYLJ", "outputId": "67412b2b-7460-4079-937a-98ac04d6f4f7" }, "source": [ "df_insumos" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OperacionPieza_APieza_BTiempo_Disponible_seg_por_semana
0Estampado3848000
1Soldado12642000
2Pintado9936000
\n", "
" ], "text/plain": [ " Operacion Pieza_A Pieza_B Tiempo_Disponible_seg_por_semana\n", "0 Estampado 3 8 48000\n", "1 Soldado 12 6 42000\n", "2 Pintado 9 9 36000" ] }, "metadata": { "tags": [] }, "execution_count": 11 } ] }, { "cell_type": "code", "metadata": { "id": "ybcpgsMapYLK" }, "source": [ "df_utilidad = pd.read_excel('/content/drive/My Drive/Guia 1 - Ejercicio 1/Guia 1 - Ejercicio 1 utilidad.xlsx')" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "HTJx2pI1pYLK", "outputId": "0b7f6592-ffb9-44ef-a84b-434998bd143f" }, "source": [ "df_utilidad" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Pieza_APieza_B
043
\n", "
" ], "text/plain": [ " Pieza_A Pieza_B\n", "0 4 3" ] }, "metadata": { "tags": [] }, "execution_count": 18 } ] }, { "cell_type": "markdown", "metadata": { "id": "GMeqJsDapYLL" }, "source": [ "Inicializacion de variables" ] }, { "cell_type": "code", "metadata": { "id": "Y8SHP3bwpYLM" }, "source": [ "A = LpVariable(name=\"A\", lowBound=0)\n", "B = LpVariable(name=\"B\", lowBound=0)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IERtH0GdpYLN" }, "source": [ "Creacion del modelo" ] }, { "cell_type": "code", "metadata": { "id": "jztoak_IpYLO" }, "source": [ "model_2 = LpProblem(name=\"Maximizacion_Beneficio_Fabrica\", sense=LpMaximize)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "eoNdBjQSpYLO" }, "source": [ "Definicion de restricciones\n", "* la funcion lp realiza una suma de los elementos que hay dentro\n", "* luego de la coma se agrega como string el nombre de cada una de las variables" ] }, { "cell_type": "code", "metadata": { "id": "jIbl0YXapYLP" }, "source": [ "for i in range(len(df_insumos)):\n", " model_2 += lpSum(df_insumos['Pieza_A'][i] * A + df_insumos['Pieza_B'][i] * B) <= df_insumos['Tiempo_Disponible_seg_por_semana'][i], str(df_insumos['Operacion'][i])" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "H3e984h-pYLQ" }, "source": [ "Funcion objetivo" ] }, { "cell_type": "code", "metadata": { "id": "vLxzlWEHpYLR" }, "source": [ "obj_func_2 = lpSum(df_utilidad['Pieza_A'] * A + df_utilidad['Pieza_B'] * B)\n", "model_2 += obj_func_2" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "bi3EMa2FpYLR", "outputId": "0df0feba-999f-4497-a30a-c51c64715764" }, "source": [ "obj_func_2" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "4*A + 3*B + 0" ] }, "metadata": { "tags": [] }, "execution_count": 23 } ] }, { "cell_type": "code", "metadata": { "id": "FSBZO0pTpYLS" }, "source": [ "status_2 = model_2.solve()" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "GVbgr3tfpYLT", "outputId": "97fc811e-9294-4214-fd45-3025d3d7c7e8" }, "source": [ "print(f\"status: {model_2.status}, {LpStatus[model_2.status]}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "status: 1, Optimal\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "nYeeC9lYpYLU", "outputId": "2f86ff81-0520-48f9-b93b-8b7d88ce962f" }, "source": [ "print(f\"objective: {model_2.objective.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "objective: 15000.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "K96pCCYppYLW", "outputId": "65eb01cc-f0bd-475e-a1f9-03d5a239fc16" }, "source": [ "for var in model_2.variables():\n", " print(f\"{var.name}: {var.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "A: 3000.0\n", "B: 1000.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "nrYltBuSpYLX", "outputId": "2f251597-59a6-4de8-b9e2-ce0e6699ca86" }, "source": [ "for name, constraint in model_2.constraints.items():\n", " print(f\"{name}: {constraint.value()}\")" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Estampado: -31000.0\n", "Soldado: 0.0\n", "Pintado: 0.0\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "fZzGwm5UpYLY" }, "source": [ "" ], "execution_count": null, "outputs": [] } ] }