{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "SRXossXvecIC", "pycharm": {} }, "source": [ "# Production Model Sensitivity Analysis" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ihMeDuJ5ecIF", "pycharm": {} }, "source": [ "This notebook revisits the simple production model for the purpose of sensitivity analysis. The notebook uses [Pyomo](http://www.pyomo.org/) to represent the model with the [COINOR-CBC](https://github.com/coin-or/Cbc) solver to calculate solutions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "colab": {}, "colab_type": "code", "id": "2JKaLcN8edkz", "pycharm": {} }, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "import shutil\n", "import sys\n", "import os.path\n", "\n", "if not shutil.which(\"pyomo\"):\n", " !pip install -q pyomo\n", " assert(shutil.which(\"pyomo\"))\n", "\n", "if not (shutil.which(\"cbc\") or os.path.isfile(\"cbc\")):\n", " if \"google.colab\" in sys.modules:\n", " !apt-get install -y -qq coinor-cbc\n", " else:\n", " try:\n", " !conda install -c conda-forge coincbc \n", " except:\n", " pass\n", "\n", "assert(shutil.which(\"cbc\") or os.path.isfile(\"cbc\"))\n", "\n", "from pyomo.environ import *" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Df2vj9GiecIn", "pycharm": {} }, "source": [ "## Production plan: Mixed product strategy" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "uMh4W-ijecIo", "pycharm": {} }, "source": [ "So far we have learned that we can make \\$1,600 per week by manufacturing product X, and $2,400 per week manufacturing product Y. Is it possible to do even better?\n", "\n", "To answer this question, we consider the possibilty of manufacturing both products in the same plant. The marketing department assures us that product Y will not affect the sales of product X. So the same constraints hold as before, but now we have two decision variables, $x$ and $y$.\n", "\n", "![LP_ProductXY.png](https://github.com/jckantor/ND-Pyomo-Cookbook/blob/master/notebooks/figures/LP_ProductXY.png?raw=1)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 527 }, "colab_type": "code", "executionInfo": { "elapsed": 267, "status": "ok", "timestamp": 1555698938250, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "RgjGjPrFecIr", "outputId": "8b0b6119-171d-4e1c-8ab6-bc95c0f8f1a3", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "P = 2600.0\n", "x = 20.0\n", "y = 60.0\n" ] } ], "source": [ "model = ConcreteModel()\n", "\n", "# declare decision variables\n", "model.x = Var(domain=NonNegativeReals)\n", "model.y = Var(domain=NonNegativeReals)\n", "\n", "# declare objective\n", "model.profit = Objective(\n", " expr = 40*model.x + 30*model.y,\n", " sense = maximize)\n", "\n", "# declare constraints\n", "model.demand = Constraint(expr = model.x <= 40)\n", "model.laborA = Constraint(expr = model.x + model.y <= 80)\n", "model.laborB = Constraint(expr = 2*model.x + model.y <= 100)\n", "\n", "# solve\n", "SolverFactory('cbc').solve(model)\n", "\n", "print(f\"P = {model.profit()}\")\n", "print(f\"x = {model.x()}\")\n", "print(f\"y = {model.y()}\")" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "x7WugdoxecI1", "pycharm": {} }, "source": [ "The mixed product strategy earns more profit than either of the single product srategies. Does this surprise you? Before going further, try to explain why it is possible for a mixed product strategy to earn more profit than either of the possible single product strategies." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "o_K5Y2OaecI2", "pycharm": {} }, "source": [ "## What are the active constraints?" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 392 }, "colab_type": "code", "executionInfo": { "elapsed": 1102, "status": "ok", "timestamp": 1555698950832, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "DewV4M8mecI3", "outputId": "6fb9bbce-fbbd-43da-914b-818bc9ed69bf", "pycharm": {} }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(6, 6))\n", "plt.subplot(111, aspect='equal')\n", "plt.axis([0, 100, 0, 100])\n", "plt.xlabel('Production Qty X')\n", "plt.ylabel('Production Qty Y')\n", "\n", "# Labor A constraint\n", "x = np.array([0, 80])\n", "y = 80 - x\n", "plt.plot(x, y, 'r', lw=2)\n", "plt.fill_between([0, 80, 100], [80, 0,0 ], [100, 100, 100], color='r', alpha=0.15)\n", "\n", "# Labor B constraint\n", "x = np.array([0, 50])\n", "y = 100 - 2*x\n", "plt.plot(x, y, 'b', lw=2)\n", "plt.fill_between([0, 50, 100], [100, 0, 0], [100, 100, 100], color='b', alpha=0.15)\n", "\n", "# Demand constraint\n", "plt.plot([40, 40], [0, 100], 'g', lw=2)\n", "plt.fill_between([40, 100], [0, 0], [100, 100], color='g', alpha=0.15)\n", "\n", "plt.legend(['Labor A Constraint', 'Labor B Constraint', 'Demand Constraint'])\n", "\n", "# Contours of constant profit\n", "x = np.array([0, 100])\n", "for p in np.linspace(0, 3600, 10):\n", " y = (p - 40*x)/30\n", " plt.plot(x, y, 'y--')\n", "\n", "# Optimum\n", "plt.plot(20, 60, 'r.', ms=20)\n", "plt.annotate('Mixed Product Strategy', xy=(20, 60), xytext=(50, 70), \n", " arrowprops=dict(shrink=.1, width=1, headwidth=5))\n", "\n", "plt.plot(0, 80, 'b.', ms=20)\n", "plt.annotate('Y Only', xy=(0, 80), xytext=(20, 90), \n", " arrowprops=dict(shrink=0.1, width=1, headwidth=5))\n", "\n", "plt.plot(40, 0, 'b.', ms=20)\n", "plt.annotate('X Only', xy=(40, 0), xytext=(70, 20), \n", " arrowprops=dict(shrink=0.1, width=1, headwidth=5))\n", "\n", "plt.text(4, 23, 'Increasing Profit')\n", "plt.annotate('', xy=(20,15), xytext=(0,0), \n", " arrowprops=dict(width=0.5,headwidth=5))\n", "\n", "fname = 'LPprog01.png'\n", "fname = os.path.join('figures', fname) if os.path.exists('figures') else fname\n", "plt.savefig(fname, bbox_inches='tight')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sensitivity analysis" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "sm73VOWaecI9", "pycharm": {} }, "source": [ "Sensitivity analysis is the process of determining how the solution to a linear programming problem (or for that matter, any optimization problem) depends on parameter values. This can lead to important insights. In this toy application, for example, sensitivity analysis will reveal the extra profit obtained by adding additional hours of labor. For many applications, the information obtained from sensitivity analysis can be the primary reason to create the linear program.\n", "\n", "For the general case, assume that the linear program can be written in the form\n", "\n", "$$\n", "\\begin{align*}\n", "P = \\max c^Tx \\\\\n", "\\end{align*}\n", "$$\n", "subject to\n", "$$\n", "\\begin{align*}\n", "A x \\leq b \\\\\n", "x \\geq 0 \n", "\\end{align*}\n", "$$\n", "\n", "The inequality constraints can be combined into a single matrix expression\n", "\n", "$$\n", "\\begin{align*}\n", "\\begin{bmatrix} A \\\\ -I \\end{bmatrix} x \\leq \\begin{bmatrix} b \\\\ 0 \\end{bmatrix}\n", "\\end{align*}\n", "$$\n", "\n", "A general feature of linear programming problems with $n$ decision variables is that the optimal value of the objective is found at the intersection of $n$ active constraints. At the optimal solution, the active constraints can be treated as linear equalities. Let the matrix $A_a$ refer to the subset of $n$ rows of $\\begin{bmatrix} A \\\\ -I \\end{bmatrix}$ comprising the active constraints, and $b_a$ be the corresponding elements of $b$. The solution to the linear program is then given by \n", "\n", "$$\n", "\\begin{align*}\n", "P & = c^T x \\\\\n", "A_ax & = b_a\n", "\\end{align*}\n", "$$\n", "\n", "Solving for $x {A_a}^{-1}b_a$\n", "\n", "$$\n", "\\begin{align*}\n", "P & = c^T {A_a}^{-1} b_a \n", "\\end{align*}\n", "$$\n", "\n", "The quantities in the vector $c^T {A_a}^{-1}$ show how the profit $P$ depends on small changes in the available resources given in $b_a$.\n", "\n", "$$\n", "\\begin{align*}\n", "P + \\delta P = c^T {A_a}^{-1} (b_a + \\delta b_a) \\implies \\delta P = \\underbrace{c^T {A_a}^{-1}}_{y^T} \\delta b_a\n", "\\end{align*}\n", "$$\n", "\n", "The vector $y^T = c^T {A_a}^{-1}$ are the sensitivity coefficients. \n", "\n", "Let's see how this works out for the toy problem in this notebook. First we define the 'augmented' matrices corresponding to the inequality constraints." ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "A = [[ 1 0]\n", " [ 1 1]\n", " [ 2 1]\n", " [-1 0]\n", " [ 0 -1]]\n", "\n", "b = [[ 40]\n", " [ 80]\n", " [100]\n", " [ 0]\n", " [ 0]]\n", "\n", "c = [40 30]\n" ] } ], "source": [ "A_augment = np.array([[1, 0], [1, 1], [2, 1], [-1, 0], [0, -1]])\n", "b_augment = np.array([[40], [80], [100], [0], [0]])\n", "c = np.array([40, 30])\n", "\n", "print(f\"\\nA = {A_augment}\")\n", "print(f\"\\nb = {b_augment}\")\n", "print(f\"\\nc = {c}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The active constraints are rows 2 and 3 that correspond to the labor constraints. Since Python uses zero-indexing, " ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "active_constraints = [1, 2]\n", "\n", "A_active = A_augment[active_constraints, :]\n", "b_active = b_augment[active_constraints, :]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next let's verify that we are getting the expected solution." ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "x = [[20.]\n", " [60.]]\n", "\n", "P = [2600.]\n" ] } ], "source": [ "x = np.dot(np.linalg.inv(A_active), b_active)\n", "print(f\"\\nx = {x}\")\n", "\n", "P = np.dot(c, x)\n", "print(f\"\\nP = {P}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now compute the sensitivity coefficients." ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "y = [20. 10.]\n" ] } ], "source": [ "y = np.dot(c, np.linalg.inv(A_active))\n", "print(f\"\\ny = {y}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "These coefficients describe the incremental profit that can be obtained for each additional unit of the corresponding resource in $b_a$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adjoint sensitivity\n", "\n", "The sensitivity coefficients can be computed as\n", "\n", "$$\n", "\\begin{align*}\n", "y^T = c^T {A_a}^{-1}\n", "\\end{align*}\n", "$$\n", "\n", "which involves inversion of a linear matrix. This is an expensive and potentially sensitive numerical operation which can be avoided. \n", "\n", "$$\n", "\\begin{align*}\n", "y^T = c^T {A_a}^{-1} \\implies y^T A_a = c^T \\implies A_a^T y = c\n", "\\end{align*}\n", "$$\n", "\n", "In other words, $y$ can be computed by solving a system of equations involving the transposed matrix $A_a^T$ with the coefficients of the objective function on the right hand side." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([20., 10.])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.solve(A_active.T, c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Accessing sensitivity coefficients in Pyomo" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 527 }, "colab_type": "code", "executionInfo": { "elapsed": 244, "status": "ok", "timestamp": 1555698956390, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "1Gch446_ecI-", "outputId": "9cba0cc5-2ef2-4a4d-a0a3-2edb00acca0a", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Solution\n", "x = 20.0\n", "y = 60.0\n", "\n", "Sensitivity Analysis\n", "y_demand = -0.0\n", "y_laborA = 20.0\n", "y_laborB = 10.0\n" ] } ], "source": [ "model = ConcreteModel()\n", "\n", "# for access to dual solution for constraints\n", "model.dual = Suffix(direction=Suffix.IMPORT)\n", "\n", "# declare decision variables\n", "model.x = Var(domain=NonNegativeReals)\n", "model.y = Var(domain=NonNegativeReals)\n", "\n", "# declare objective\n", "model.profit = Objective(\n", " expr = 40*model.x + 30*model.y,\n", " sense = maximize)\n", "\n", "# declare constraints\n", "model.demand = Constraint(expr = model.x <= 40)\n", "model.laborA = Constraint(expr = model.x + model.y <= 80)\n", "model.laborB = Constraint(expr = 2*model.x + model.y <= 100)\n", "\n", "# solve\n", "SolverFactory('cbc').solve(model)\n", "\n", "print(\"\\nSolution\")\n", "print(f\"x = {model.x()}\")\n", "print(f\"y = {model.y()}\")\n", "\n", "print(\"\\nSensitivity Analysis\")\n", "print(f\"y_demand = {-model.dual[model.demand]}\")\n", "print(f\"y_laborA = {-model.dual[model.laborA]}\")\n", "print(f\"y_laborB = {-model.dual[model.laborB]}\")" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "l62jBuVfecJD", "pycharm": {} }, "source": [ "Analysis of the constraints." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 228, "status": "ok", "timestamp": 1555698960030, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "RO8qhMAXecJF", "outputId": "9c5efeb8-7347-4430-dd66-d09cc647d893", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Constraint value lslack uslack dual\n", "demand 20.00 inf 20.00 0.00\n", "laborA 80.00 inf 0.00 -20.00\n", "laborB 100.00 inf 0.00 -10.00\n" ] } ], "source": [ "str = \" {0:7.2f} {1:7.2f} {2:7.2f} {3:7.2f}\"\n", "\n", "print(\"Constraint value lslack uslack dual\")\n", "for c in [model.demand, model.laborA, model.laborB]:\n", " print(c, str.format(c(), c.lslack(), c.uslack(), model.dual[c]))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "YsmJens8ecJI", "pycharm": {} }, "source": [ "## Theory of constraints" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "R6FM4LwcecJK", "pycharm": {} }, "source": [ "* For $n$ decisions you should expect to find $n$ 'active' constraints.\n", "* Each inactive constraint has an associated 'slack.' The associated resources have no incremental value.\n", "* Each active constraint has an associated 'shadow price'. This is additional value of additional resources." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": {}, "colab_type": "code", "id": "PhCCA3bWfRTy", "pycharm": {} }, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "02.01-Production-Models-with-Linear-Constraints.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }