{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CLP Graphic solution example\n", "\n", "## Try me\n", " [![Open In Colab](../../_static/colabs_badge.png)](https://colab.research.google.com/github/ffraile/operations-research-notebooks/blob/main/docs/source/CLP/tutorials/graphic-solution-extended.ipynb)[![Binder](../../_static/binder_badge.png)](https://mybinder.org/v2/gh/ffraile/operations-research-notebooks/main?labpath=docs%2Fsource%2FCLP%2Ftutorials%2Fgraphic-solution-extended.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction\n", "In this notebook we analyse the graphic method to solve CLP problems of two variables. First, we will derive a CLP model of our problem, and then, we will use the Python plotting library matplotlib to obtain a graphical representation that we will use to find the optimal solution.\n", "\n", "The graphic method is not really a practical method to solve CLP problems, but rather, a quite didactic mean to gain understanding on the CLP. Later in the course, we will cover the Simplex algorithm, one of the most successful algorithms in history, which is an extension of this method. To put it into practice, we will use a simple blending problem defined below. \n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Problem Definition\n", "The cost per gram of $M_{1}$ is 45 €cents\n", "\n", "The cost per gram $M_{2}$ is 12 €cents\n", "\n", "The final product has two nutritional properties that depend on $M_{1}$ and $M_{2}$, the non-saturated fat and the proteins.\n", "\n", "To meet the quality requirements, the final product must have no more than 0.5 percent of non-saturated fat and at least 8 percent proteins.\n", "\n", "The recip must have at least 2% of $M_{2}$. \n", "\n", "$M_{1}$ is 3 percent non-saturated fat and 80 percent protein.\n", "\n", "$M_{2}$ is 3 percent non-saturated fat and 20 percent protein.\n", "\n", "\n", "**> How many grams of M1 and M2 should be used in every 100 grams of product?**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Model\n", "The problem can be modeled as:\n", "\n", "$\\min Z = 45x_{1} + 12x_{2}$\n", "\n", "where:\n", "\n", "$x_{1}:$ grams of M1 per 100 grams of product\n", "\n", "$x_{2}:$ grams of M2 per 100 grams of product\n", "\n", "The objective function is subject to the following constraints:\n", "\n", "$x_{1} > 0$\n", "\n", "$x_{2} \\geq 2$\n", "\n", "$x_{1}+x_{2} \\leq 100$\n", "\n", "$3x_{1}+3x_{2} \\leq 50$\n", "\n", "$8x_{1} + 2x_{2} \\geq 80$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solution \n", "We will use the [numpy](https://docs.scipy.org/doc/numpy/reference/index.html) library to create the decision space and the [pyplot](https://matplotlib.org/api/pyplot_api.html) library to represent the decision space. \n", "Numpy provides useful functions to create multidimensional arrays. Below, some tips of the functions we are going to use.\n", "\n", "### Numpy Functions\n", "The following subsections describe some functions of the [Numpy](https://numpy.org/) Python package that are used in this example. The [Numpy Tutorial](../../Introduction/libraries/Numpy%20tutorial.ipynb) includes comprehensive information about this package, but as a reminder and for the sake of completeness, here you can find a brief description of the functions used in this tutorial.\n", "\n", "#### Linspace\n", "We will use the function ```linspace``` to create the x-axis that represents the $x_{1}$ decision variable. Linspace receives as arguments the minimum and maximum values of the axis and the number of elements that we want in our axis.\n", "\n", "#### maximum and minimum\n", "We will use the functions maximum and minimum to obtain the lines that delimit the feasibility region. \n", "Minimum and maximum take two (multidimensional) arrays and provide an array with the element-wise minimum or maximum at each position.\n", "\n", "### Pyplot Functions\n", "Likewise, the following subsections describe some functions of the [Matplotlib](https://numpy.org/) Python package that we have used. The [Matplotlib Tutorial](../../Introduction/libraries/Matplotlib tutorial.ipynb) provides more information and sample codes of the library, but here is a brief guide of the main functions used in this tutorial.\n", "\n", "#### plot\n", "We will use the function plot to draw lines. Plot takes two arrays as parameters and uses the values of each position of the array as coordinates. We can add additional parameters as described [here](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html). We will use one parameter to represent the labels.\n", "\n", "#### fill_between\n", "We will use the function fill_between to fill the area between two lines. Since we can only use two lines to call fill, we will need to use the numpy functions maximum and minimum to create the lines that we want to draw\n", "\n", "#### xlim, ylim\n", "We will use these functions to set the limits of both coordinates\n", "\n", "#### ylabel, xlabel, legend\n", "We will use these functions to add labels to the different axis and a legend to the figure\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Feasibility region\n", "Let us determine the feasibility region by iteratively representing the different constraints in the decision space. We start by representing the possible values of $x_{1}$ and $x_{2}$ just taking into account the physical constraints:\n", "\n", "$x_{1} > 0$\n", "\n", "$x_{2} > 0$\n", "\n", "$x_{1}+x_{2} \\leq 100$\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 1 }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#Import the numpy and pyplot libraries, we set the aliases np and plt so that it is easier to use\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "#We set the mode inline of matplotlib to get the result at the output of the cell code\n", "%matplotlib inline\n", "\n", "# Construct lines, in our coordinate system x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0, we use the function linspace to create a linear space for x\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "# y1 represents the line of constraint y <= 100 - x\n", "y1 = 100 - x\n", "\n", "#y2 represents the line of constraint y > 0 (we need this function to call fill between)\n", "y2 = x*0\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$x_{1}+x_{2} \\leq 100$')\n", "\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 100))\n", "plt.ylim((0, 100))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "\n", "plt.fill_between(x, y1, y2, where=y1>y2, color='grey', alpha=0.5) #fill where y1 is greater than y2\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Introducing constraints\n", "No we enter the first constraint:\n", "\n", "$x_{1} > 0$\n", "\n", "$x_{2} \\geq 2$\n", "\n", "$x_{1}+x_{2} \\leq 100$\n", "\n", "We can see how this affects the feasibility area by representing again the equations" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 2 }, { "data": { "text/plain": "
", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf4AAAEMCAYAAAAlNdQ3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/Il7ecAAAACXBIWXMAAAsTAAALEwEAmpwYAAAt70lEQVR4nO3dd5hU9dnG8e8z22dn6X2pUgWkiSCwRAUxICooFvIqIZaQGCJGjb1BBNQAEozGBhpbFIOgRI1G3aWJgCCC9F5lYalL2zq/948dIlGQtrtnZuf+XNdeO+fMmdlnD2e557TfY845REREJDr4vC5ARERESo+CX0REJIoo+EVERKKIgl9ERCSKKPhFRESiiIJfREQkipR48JvZy2a2w8yWHDWvkpl9amarQ98rhuabmT1tZmvMbLGZtSvp+kRERKJJaezx/x3o+YN59wGfO+caA5+HpgF6AY1DX4OA50qhPhERkahR4sHvnJsB7P7B7D7Aq6HHrwJ9j5r/misyB6hgZjVLukYREZFo4dU5/urOuW2hx5lA9dDjVGDzUcttCc0TERGRYhDrdQHOOWdmpzxusJkNouh0ADGJgXNjKtSgfFIcqRWSiPFZsdcpIlLWLFiwYKdzruoZvL5abGzseKAlulg8XASBJQUFBbece+65O461gFfBv93MajrntoUO5R8pbitQ56jlaofm/Yhz7kXgRYCGjRq5Hn8Yy3+2gkuMZWjfc+jdqhZm+gAgInI8ZrbxTF4fGxs7vkaNGmdXrVp1j8/nU+OXMBAMBi0rK6t5ZmbmeOCKYy3j1Se0qcDA0OOBwPtHzf9l6Or+84F9R50SOC4D+rcM8HCHeAK+fH7/1jfc/MpcdmTnlEjxIiICQMuqVatmK/TDh8/nc1WrVt1H0VGYYy9T0kWY2VvAl0BTM9tiZjcDTwA9zGw1cHFoGuAjYB2wBngJ+N2p/KwGFeMZ2jmZvg1g5uqdXDQqg7fnbkQdCEVESoRPoR9+Qv8mx833Ej/U75z7xXGe6n6MZR0w+Ex+XmyMj75NkzmvZj4vf5vDfVOWMOXrzYy+rh11KvnP5K1FREQiXpm9GCO1XBwPdg7QvxF8s3kvF4+Zxksz1lAY1IdTERGJXmU2+AF8ZvRslMyItEQaphQy4qOV9P3rdFZv3+91aSIiEuWuueaa+pUqVWrduHHjFkfPnzRpUrn69eu3rFu3bssHHnigxonmn6oyHfxHVPHHcnfHADeebazLOkCvcTMY+58V5BUEvS5NREQ88sEHH6T069evvlc//6abbto5derU1UfPKygo4I477qj70UcfrVq1atXSd999t9KCBQsSjzf/dH5uVAQ/gJlxQT0/I7ok0apikHHpa7n0L9NYtHmP16WJiMgZ6NixY5MpU6aUAxgyZEitgQMH1jnRa0rjvQ8cOGATJ04sP3DgwDoTJ04s/8Pne/XqdaBq1aoFR8+bNm1acr169XKbN2+el5iY6K666qrdkyZNqnC8+afzO3k+gE9pq5AUw5DzUpi39TBvrjhE32dnc1PnutzdqzmJcTFelyciEpHunrSozqrM/cV6BXWTGimHRl3devOJlhs6dOh3jz76aGpmZmbs4sWL/Z999tma4qrhVN97yZIlCe+//375Tz75pPy2bdviO3funN27d+99l1122UmdY968eXN8ampq3pHp2rVr582dOzdwvPmn8ztFXfAf0SE1iRZVg7y59CATZm/ik6WZjLq2LZ0aVvG6NBEROQW9evU68Mgjj/DMM89UnzVr1srY2FiWLVsWP3To0JrZ2dkxH3/88bqjl2/VqlWzvLw836FDh3z79u2LbdasWXOAESNGbOnXr1/2id779ddfr/Dhhx+W379/f8zNN9+886qrrvrva/r169dww4YNiTfffPP2N954Y33dunX/Z48+HERt8AMkx/sY1DaF8zNzeHV5Lr94aS7XnVuLhy5vSUpinNfliYhEjJPZMy8p8+bNS8rKyoqrUKFCQcWKFYMAzZs3z3vnnXc29uzZ86wfLr948eIVUHSO/5VXXqn87rvvbjiV9x4wYMDeAQMG7M3KyooZPHhw7aODf/ny5ctmz57tnzp1avkrr7yyYX5+vl100UXZv//973c2btw473g/54g6derkbd26Nf7I9JYtW+JTU1Pzjjf/JFfR/4iac/w/pVWNREZ09XNRLcc7C7bSbVQ6ny/f7nVZIiJyAhs3boy74YYbGkyePHmN3+8vnDRpUrnSeu8HHnig5pAhQ7KOnufz+UhLSzv05z//eduCBQtWfvrpp6tbtGhxODMz86R2tC+44IKDGzZsSFyxYkV8Tk6OTZ48uVK/fv32Hm/+6fxeCv6QxFgfA1sFuP+8eGKCedz86nwGv/EVuw+e1gcqEREpYfv3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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "# y2 represents the line of constraint y <= 100 - x\n", "y1 = 100 - x\n", "y2 = x*0+2;\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$x_{1}+x_{2} \\leq 100$')\n", "plt.plot(x, y2, label=r'$x_{2}\\geq2$')\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 100))\n", "plt.ylim((0, 100))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "\n", "plt.fill_between(x, y1, y2, where=y1>y2, color='grey', alpha=0.5) #fill where y1 is greater than y2\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we enter the next constraint:\n", "\n", "$x_{1} > 0$\n", "\n", "$x_{2} \\geq 2$\n", "\n", "$x_{1}+x_{2} \\leq 100$\n", "\n", "$3x_{1}+3x_{2} \\leq 50$\n", "\n", "Again, we can check the effect on the feasibility region" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 3 }, { "data": { "text/plain": "
", "image/png": "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NW3aNGvixInJU6ZMqV7cz52Xl4fhw4c7BQQEpPv6+t4q+LjWrVvXd3V19bj3x9fX1+2LL76ofvbsWfP7X6Nbt24uvr6+bmfOnCnn4ODgNXPmzCpmZmb473//e65z5871XV1dPXr27HnVx8cn62HLi+J7vUeM4bK+Pj4+Kjo6usieLzs3D1/tOIl5v59EJQszTO7ugW5ejhyWRERGRURilFI+hX18bGxsore3d1pRZioqKSkpJiEhIU47d+606tevX9q0adNSiuq5p0yZUnXZsmWVvb29bzZu3Pj2uHHjUh//qNIhNja2ire3d+0H3cdC8AhHUzLwfmgcYpPS0b6hA6b09EQ16yL92CcRkWaMuRDQgz2qEPCQwSO4VbNC2Ftt8OFLDRF1MhUdZkRg2f5zHJZERERGh4XgMUx0giF+dbBptB88nKzwQdghvDZ/H85eual1NCIioiLDQvCEalepgGVDWmFaYCPEX0hHp1mRWLDzNIclERGRUWAheAoigr4tnBEe4g/felUw5dcjCPx6N46lcFgSEREZNhaCQqhmbYH5b/hgTt8mOH/1Frp+uROzth7nsCQiIjJYLASFJCLo7l0dW0P88VIjR8zaegLdvozCn+evax2NiIjoqbEQPCO7CuaY3acJFgb7IP12DgLn7cLUXxNwO/uu1tGIiIieGAtBEXmxoQO2hPihbwtnzN95Bp1mRWL3KX48l4iIDAMLQRGysjDD1F6NsHxoK+gEeG3+PnwQFoeMrBytoxERET0SC0ExaFWnMn4b7YdhfnWw4sB5dJgRga0JHJZERGRITp48adayZcv6devW9ahXr57Hp59+WlXrTMWJhaCYlDc3wQcvNcSaEW1ga2mOwYuj8fayg7hy447W0YiI6AnoBwolnTp16vCBAweOLFy4sGpMTIzRXr+ehaCYedWwwbqRvgjpUB+b4pPRfkYE1v55gZc/JiIqIi1btqy/evVqKwAYNWpU9eDg4JqPWr937961p06dWjU+Pr7co9arVatWzr1phra2tnl169a9fe7cuX9MLTQWTzSfmZ6NuakOo150RWfPahgXGofRy//E2j8vYkpPT1S3Ka91PCKiZ7dmRE1cTrAs0ues6n4LPb86/7jVJk+efHHSpElOKSkppnFxcZZbt249+Zj1k1evXm09fPhw50uXLpm1adMms2vXruldunTJtLS0fOBva8eOHTNPSEiw9Pf3v1HYb6e04x6CElTfoRJWDW+NiV3dsefUFXScGYmf9p5FHi9/TERUaF26dLmhlMLcuXMdVq9efdrU1BRLliyx6dOnT62AgIA6YWFhVgXX9/T0vDNx4sTLO3bsODF9+vSkvXv3Vnr11VfrhYaGWj/o+dPT03WBgYF1p0+fft7Ozs5or0DHPQQlzEQnGOTrgg4NHfDB6jh8tCYe62MvYnqQF1yqVNA6HhFR4TzBb/LFZf/+/eVTU1PNbGxscm1tbfMAoH///tf79+9/PTU11WTEiBE1AgMDM+6t/+2339qtW7fO5ujRo+WbNGly85133knu2bNnRpUqVf5xAZk7d+5IQEBA3ZdffvlqcHDw9RL8tkoc9xBoxLmyJX4a1BKfB3khITkDnWdF4tuIU8i9a7Tlk4ioyJ09e9asX79+LmFhYSctLS3vhoaG/s/egAkTJjiOGjUqteCya9eumXzwwQcpJ06cOBwaGpo4ePDgaw8qA3l5eejTp0+t+vXrZ02ePNnoPyrGQqAhEcErzWtia4g//OrbY9pvRxH49W4cSc54/IOJiMq4zMxMXY8ePep+9tlnSU2bNs2aOHFi8pQpU6oD+f+YDx8+3CkgICD93omB96xbt852wIABLg0aNPBwdXX9689PP/1kU3C98PDwimvWrKkcFRVVyc3Nzd3Nzc19xYoVDzysYAzEGM529/HxUdHR0VrHeCZKKWw8lIJJ6+Jx/VYO3nq+Lka0q4dypiZaRyMiIyUiMUopn8I+PjY2NtHb27tUXpJ1ypQpVZctW1bZ29v7ZuPGjW+PGzcu9fGPMn6xsbFVvL29az/oPhaCUubazWx8uiEBYQcvoF7VivgsyAvNatlqHYuIjJAxFwJ6sEcVAh4yKGVsK5hjxquNsWhAc9y6k4ve3+zGJ+sP41Z2rtbRiIjIiLEQlFIvNKiKLSH+6N+qFhbtSkTHmZGIOsEiTkRExYOFoBSrWM4U/+7hiZXDnoOZiQ79Fu7DuNBYpN/msCQiIipaLAQGoIWLHX4b3RbDn6+LVX9cQIcZEdh8OEXrWEREZERYCAyEhZkJ3u/shjVvtUHliuUwbEkMRiz9A6mZHJZERETPTtNCICJjReSwiMSLyDIRsRARFxHZJyInRWSFiBjtIInCaFTDGutGtsF7nRogPOESOsyMQNgfSRyWREREz0SzQiAiTgBGAfBRSnkCMAHQB8BnAGYqpeoBuAZgkFYZSyszEx1GvFAPG0e3RV37ighZGYs3Fx3Aheu3tY5GREQGSutDBqYAyouIKQBLAMkA2gEI1d//I4Ce2kQr/epVrYhfhj2Hyd3ccSDxKjrOiMDiPYkclkRERE9Ns0KglLoA4P8AnEN+EUgHEAPgulLq3ofukwA4PejxIjJURKJFJDo1texegEqnE7zZxgWbx/ihaS1bfLz2MF79bg9OpRrthE4iIioGWh4ysAXQA4ALgOoAKgDo/KSPV0p9p5TyUUr52NvbF1NKw1HTzhKLB7bAF729cCwlE11m78S8309yWBIRGbVbt25Jo0aNGjZo0MC9Xr16HmPHjq1ujK8JAE5OTo3q16/v7ubm5u7p6dnw3vLQ0FCr2rVrezo7O3tOmDChWmGfX8tDBu0BnFFKpSqlcgCEAWgDwEZ/CAEAagC4oFVAQyMieNmnJra+4492Dari803H0HPeLhy+mK51NCKiYmFhYaGioqKOHTt2LOHw4cMJ27Zts9q2bdszzZLfsGFDpaCgoNol+ZpPKiIi4vjRo0cT4uPjjwBAbm4uxo4d67xx48bjx48fP7xq1Sq7mJgYi8I8t5aF4ByAViJiKSIC4EUACQB2AOitXycYwFqN8hmsqpUs8E3/Zvj69aZISb+D7nN34YvNR5GV84/pnkREBk2n08Ha2joPALKzsyU3N1f/TwrQsmXL+qtXr7YCgFGjRlUPDg6uWdpf88aNG7JixQrr4ODgmk8yWfH333+vUKtWrTvu7u7ZFhYWKjAw8GpoaKjN039X+Sf1aUIptU9EQgH8ASAXwEEA3wH4FcByEZmiX7ZQq4yGrksjRzxXtzKm/HoEX+04hd/iU/B5kBd8attpHY2IjMzEXRNrnrx20rIon7Oebb1bn7b59Pzj1svNzYWnp6f7uXPnygUHB19u167dTQCYPHnyxUmTJjmlpKSYxsXFWW7duvVkUWUryteMj48vt3btWuvNmzdbJycnm7du3TojICAgvWvXrpn3r/viiy+6iggGDBiQ+u6776adP3/e3MnJKfve/TVq1Mjet29fxcJ8T5oVAgBQSk0CMOm+xacBtNAgjlGysTTH/73sje7e1fFB2CG8/O0eBD9XG+91aoAK5TT9z09EVCRMTU1x9OjRhLS0NJOAgIC6Bw4csGjevHlWly5dbnz88ceYO3euQ1RU1DFTU1MkJCSYT5482TEjI8Nk06ZNpws+j5eXl1t2drbu1q1buvT0dFM3Nzd3AJg6dWpSUFBQRmFfc8mSJTa//vqrdWZmpsmgQYPSAgMD/+e5goKC6iYmJloMGjTo0k8//XTG2dn5gdPsoqKijrq4uORcuHDBtF27dvU9PDyyivR9LMono9LLr749toz1wxebj+HHPYkIT7iEaYGN4FefJ2QS0bN7kt/ki1uVKlXutm3bNnP9+vXWzZs3z9q/f3/51NRUMxsbm1xbW9s8AHB3d89euXLl2c6dO9e5//FxcXFHgfxzCBYtWlR51apViUXxmv3797/ev3//66mpqSYjRoyocX8hOHLkSMLu3bst161bZ92rV6+6OTk58sILL2SMHDkyzdXV9a/f/l1cXHIAwMnJKTcgIOD6nj17Kvj5+d24cOHCXxfwS0pK+p89Bk9D6+sQUAmqUM4Uk7t74Jdhz6GcmQ5vfL8f7/4Si+u3CrXtEBFp7uLFi6ZpaWkmQP7x9x07dlg1bNgw6+zZs2b9+vVzCQsLO2lpaXk3NDTUSuvXnDBhguOoUaP+8Tl5nU4HX1/fW59//nlyTEzMsfDw8BMeHh63U1JS/vqlPSMjQ3ft2jXdva937Nhh5eXlddvf3/9mYmKixdGjR82zsrIkLCzMLigo6Hphvi/uISiDfGrbYeOotvhy+wl8E3Eavx9Lxac9PNClkaPW0YiInsr58+fN3nzzTZe7d+9CKSU9evS42rVr18y2bdvW/+yzz5KaNm2aNXHixOQPPvigRu/evTMe/4xF/5p5eXkYMWKEU0BAQLqvr++t+5+vdevW9VNTU83uXz5p0qQLbdu2vQUASUlJpr169aoHAHfv3pWgoKAr976f//73v+c6d+5c/+7du3jttdfSfHx8CnUoQYzhGvg+Pj4qOjpa6xgG6fDFdIwLjcPhixno4lkNn/TwQNVKhfrEChEZGBGJUUr5FPbxsbGxid7e3mlFmam4paSkmISEhDjt3LnTql+/fmnTpk0r9tGxU6ZMqbps2bLK3t7eNxs3bnx73Lhxml1NLzY2toq3t3ftB93HQkDIvZuH+TvPYObW47Aw1WFiV3f0blYD9z5GQ0TGqSwWgrLuUYWA5xAQTE10GP58Xfw2ui0aVKuE90Lj8Mb3+3H+6j/2bBERkZFiIaC/1LWviBVDn8OnPTzwx9lr6DQrEj/sOsNhSUREZQALAf0PnU7Q/7na2DzWD81r22Hy+gS8/O0enLz8j+tjEBGREWEhoAeqYWuJHwY0x4xXvHEq9QZemh2Fr3acRA6HJRHR3/Ly8vJ4spGB0P+3eugPcRYCeigRQWDTGggf648OHg74YvMxdJ+7C/EXOCyJiAAA8ampqdYsBaVfXl6epKamWgOIf9g6vA4BPZZ9pXL46rWm6O6dgo/WxKPHV7swpG0djGnvCgszE63jEZFGcnNzB6ekpCxISUnxBH/BLO3yAMTn5uYOftgK/NghPZX0Wzn4z8YjWBF9HnWqVMD0IC+0cOGwJCJD9KwfOyTjwkZHT8Xa0gyf9fbCT4NaIvtuHl75dg8mronHjTsPnMVBREQGgoWACsXXtQq2jPXDwDYu+GnfWXScEYEdxy5rHYuIiAqJhYAKzdLcFB93c0fov1rDspwpBiw6gJAVf+LaTQ5LIiIyNCwE9Mya1bLFr6N8MapdPayLvYj2MyKwIe4ijOH8FCKisoKFgIpEOVMThHRsgPVv+6K6TXmM/Pkghi2JwaWMQg3dIiKiEsZCQEWqoaMVVr/VGh90cUPE8VS0nxGBFQfOcW8BEVEpx0JARc7URIdh/nWxaYwfGjpa4f1Vh9Bv4T6cu8JhSUREpRULARUblyoVsHxIK0zp6YnY8+noNCsSC6PO4C6HJRERlTosBFSsdDpBv1a1sGWsH1rVscOnGxLQ+5vdOHGJw5KIiEoTFgIqEdVtyuP7N5tjdp/GSEy7iZfm7MScbSeQncthSUREpQELAZUYEUGPxk7YGuKPzp6OmBF+HN3nRiH2/HWtoxERlXksBFTiKlcshy/7NsH8N3xw7VY2es3bhWkbj+B29l2toxERlVksBKSZDu4OCA/xx6vNa+LbyNPoMjsSe09f0ToWEVGZxEJAmrKyMMO0QC/8PLgl8hTQ57u9+HD1IWRm5WgdjYioTGEhoFKhdb0q2DzGD4N9XbBs/zl0nBmJ7UcvaR2LiKjMYCGgUqO8uQk+6uqOVcNbo5KFKQb+EI3Ryw/iyo07WkcjIjJ6LARU6jRxtsWGt9tiTHtXbDyUjA4zI7EulsOSiIiKEwsBlUrmpjqMaV8fG95ui5p2lhi17CCGLI5GSjqHJRERFQcWAirVGlSrhLDhrfFRQENEnUxDhxkRWLafw5KIiIoaCwGVeiY6weC2dbB5jB88nazxQdghvDZ/H85eual1NCIio8FCQAajVuUK+HlIS0wLbIT4C/nDkuZHnuawJCKiIsBCQAZFRNC3hTPCQ/zhW68Kpm48gsB5u3AshcOSiIiehaaFQERsRCRURI6KyBEReU5E7EQkXERO6P+21TIjlU7VrC0w/w0ffNm3CZKu3UbXL3diZvhxDksiIiokrfcQzAawSSnlBsAbwBEA4wFsU0q5Atimv030DyKCbt7VER7ij4BGjpi97QS6frkTf3JYEhHRU9OsEIiINQA/AAsBQCmVrZS6DqAHgB/1q/0IoKcW+chw2FUwx6w+TfD9mz7IzMpF4LxdmLIhgcOSiIiegpZ7CFwApAJYJCIHRWSBiFQA4KCUStavkwLAQbOEZFDauTlgy1g/9G3hjAVRZ9BpViR2n0zTOhYRkUHQshCYAmgK4GulVBMAN3Hf4QGV/2HzB55CLiJDRSRaRKJTU1OLPSwZhkoWZpjaqxGWD20FnQCvLdiH8avikH6bw5KIiB5Fy0KQBCBJKbVPfzsU+QXhkog4AoD+78sPerBS6jullI9Sysfe3r5EApPhaFWnMjaN8cMw/zpYGX0eHWdGIDyBw5KIiB5Gs0KglEoBcF5EGugXvQggAcA6AMH6ZcEA1moQj4yAhZkJPujSEGtGtIGtpTmGLI7GyJ//QBqHJRER/YNoeQlYEWkMYAEAcwCnAQxAfklZCcAZwFkAryilrj7qeXx8fFR0dHTxhiWDlp2bh28jTuHL7SdRoZwJJnXzQI/G1SEiWkcj0oyIxCilfLTOQaWDpoWgqLAQ0JM6cSkT41bF4eC562jnVhVTenqiuk15rWMRaYKFgArS+joERCXK1aESQv/VGh93dceeU1fQcWYkftp7Fnm8/DERlXEsBFTmmOgEA31dsGWsHxrXtMFHa+LRZ/5enEnjsCQiKrtYCKjMqmlniSWDWuDzIC8cSc5A51mR+CbiFHLv8vLHRFT2sBBQmSYieKV5TWwN8Yd/fXtM/+0oes3bjYSLGVpHIyIqUSwERAAcrCzwbf9m+Oq1pkhOv43uc6Pw3y3HcCeXlz8morKBhYBIT0QQ4OWI8LH+6N64Or7cfhIBc6IQc/aa1tGIiIodCwHRfWwrmGPGK42xaEBz3LqTi97f7MYn6w/j5p1craMRERUbFgKih3ihQVVsCfFH/1a1sGhXIjrNisTOE5ybQUTGiYWA6BEqljPFv3t4YuWw52BuokP/hfsxLjQW6bc4LImIjAsLAdETaOFih42j22L483Wx6o8LaD8zApviU7SORURUZFgIiJ6QhZkJ3u/shrUj2sC+Yjn866cYjFj6B1IzOSyJiAwfCwHRU/J0ssbakW3wXqcGCE+4hPYzIrAqJgnGMBeEiMouFgKiQjAz0WHEC/WwcXRb1KtaEe/8Eos3Fx1A0rVbWkcjIiqUJy4EItJBRObrRxZDRIYWWyoiA1GvakX8Muw5fNLdAwcSr6LTzEgs3pPIYUlEZHCeZg/BQADvAegnIu0ANC6WREQGRqcTBLeujc1j/NC0li0+XnsYr363B6dSb2gdjYjoiT1NIchUSl1XSr0LoCOA5sWUicgg1bSzxOKBLfB/L3vj+KUb6DJ7J+b9fhI5HJZERAbgaQrBr/e+UEqNB7C46OMQGTYRQe9mNRAe4ocX3ari803H0POrXYi/kK51NCKiR3psIRCR2SIiSqm1BZcrpb4svlhEhq1qJQt83a8Zvn69KS5l3EGPr3bhi81HkZXDYUlEVDo9yR6CTADrRMQSAESkk4jsKt5YRMahSyNHbA3xQ68mTvhqxym8NGcnohOvah2LiOgfHlsIlFIfAVgGIEJfBEIAjC/uYETGwsbSHP/3sjcWD2yBOzl5ePnbPZi0Nh43OCyJiEqRJzlk8CKAIQBuAqgCYJRSamdxByMyNn717bFlrB+Cn6uNxXvPotPMSEQc57AkIiodnuSQwYcAJiqlngfQG8AK/ccOiegpVShnisndPfDLsOdgYaZD8Pf78c7KWFy/la11NCIq4+RpL7cqIo4AVimlWhdPpKfn4+OjoqOjtY5B9FSycu5i7vaT+DriFGwtzfFpDw90aeSodSwqQ0QkRinlo3UOKh2e+tLFSqlkAC8WQxaiMsXCzATvdmqAdSPbwMGqHIYv/QP/WhKDyxlZWkcjojKoULMMlFK3izoIUVnlUd0aa0e0wfud3bD92GW0nxGBldHnOSyJiEoUhxsRlQKmJjoMf74ufhvdFm7VrDAuNA5vfL8f569yWBIRlQwWAqJSpK59RSwf2gqf9vDAH2evodOsSCzadQZ3OSyJiIoZCwFRKaPTCfo/VxtbQvzRvLYdPlmfgFe+3YOTlzO1jkZERoyFgKiUcrIpjx8GNMeMV7xxKvUGXpodhbnbT3BYEhEVCxYColJMRBDYtAbCx/qjg4cD/m/LcXSfuwuHkjgsiYiKFgsBkQGwr1QOX73WFN/2b4a0G3fQc94uTP+Nw5KIqOiwEBAZkE4e1bB1rD96N62BbyJOocvsndh3+orWsYjICLAQEBkYa0szfNbbC0sHt0RuXh5e/W4vJq6JR2ZWjtbRiMiAsRAQGag29apg8xg/DGzjgp/25Q9L2nHsstaxiMhAsRAQGTBLc1N83M0dq4a3RoVyphiw6ABCVvyJazc5LImIno7mhUBETETkoIhs0N92EZF9InJSRFaIiLnWGYlKu6bOttgwyhej2tXDutiLaD8jAhviLvLyx0T0xDQvBABGAzhS4PZnAGYqpeoBuAZgkCapiAxMOVMThHRsgPVv+8LJtjxG/nwQQ5fE4BKHJRHRE9C0EIhIDQABABbobwuAdgBC9av8CKCnJuGIDFRDRyuEDW+NCS+5IfJ4KtrPiMCKA+e4t4CIHknrPQSzAIwDcO/Sa5UBXFdK5epvJwFwetADRWSoiESLSHRqamqxByUyJKYmOgz1q4vNY/zg7miF91cdwusL9uHcFQ5LIqIH06wQiEhXAJeVUjGFebxS6jullI9Sysfe3r6I0xEZh9pVKmDZkFaY2ssTcUnp6DQrEgujOCyJiP5Jyz0EbQB0F5FEAMuRf6hgNgAbETHVr1MDwAVt4hEZB51O8HrLWggP8cNzdSvj0w0JCPp6N45f4rAkIvqbZoVAKfWBUqqGUqo2gD4AtiulXgewA0Bv/WrBANZqFJHIqDhal8fCYB/M7tMYZ6/cRMCcnZi99QSyczksiYi0P4fgQd4HECIiJ5F/TsFCjfMQGQ0RQY/GTtga4o8uno6YufU4us+NQuz561pHIyKNiTGceezj46Oio6O1jkFkcLYmXMJHa+JxOTMLg9vWwdj29VHe3ETrWFRCRCRGKeWjdQ4qHUrjHgIiKiHt3R2wJcQPrzZ3xneRp9FldiT2nOKwJKKyiIWAqIyzsjDDtMBG+HlISygAfefvxYTVh5DBYUlEZQoLAREBAFrXrYJNo/0wpK0Llu8/h44zIrH96CWtYxFRCWEhIKK/lDc3wYcB7gh7qw2sy5th4A/RGL38IK7cuKN1NCIqZiwERPQPjWvaYP3bvhjT3hUbDyWjw8xIrP3zAi9/TGTEWAiI6IHMTXUY074+NrzdFjXtLDF6+Z8Y/GM0ktNvax2NiIoBCwERPVKDapUQNrw1PgpoiF2n0tBxRiR+3ncOebz8MZFRYSEgoscy0QkGt62DzWP84OlkjQmrD+G1BXuRmHZT62hEVERYCIjoidWqXAE/D2mJ6YGNcPhCBjrPjsT8yNPIvcvLHxMZOhYCInoqIoI+LZwRHuIP33pVMHXjEQR9vRtHUzK0jkZEz4CFgIgKpZq1Bea/4YMv+zZB0rXb6DonCjPCj+NO7l2toxFRIbAQEFGhiQi6eVdHeIg/unlXx5xtJ9DtyygcPHdN62hE9JRYCIjomdlVMMfMVxvj+zd9kJmVi8Cvd+PTDQm4lZ2rdTQiekIsBERUZNq5OWDLWD+83tIZC6POoPOsndh9Mk3rWET0BFgIiKhIVbIww5SejbB8aCvoBHhtwT6MXxWH9NsclkRUmrEQEFGxaFWnMjaN8cMw/zpYGX0eHWZEYMvhFK1jEdFDsBAQUbGxMDPBB10aYs2INrCrYI6hS2Iw8uc/kMZhSUSlDgsBERU7rxr5w5Le6VAfWw5fQvsZEVh9MInDkohKERYCIioRZiY6vP2iK34d5QuXKhUwdkUsBv5wABevc1gSUWnAQkBEJcrVoRJC/9UaH3d1x97TV9FxZiSW7D3LYUlEGmMhIKISZ6ITDPR1wZaxfmhc0wYT18Sjz/y9OJ16Q+toRGUWCwERaaamnSWWDGqBz4O8cCQ5A11m78Q3Eac4LIlIAywERKQpEcErzWtia4g//OvbY/pvR9Fz3i4kXOSwJKKSxEJARKWCg5UFvu3fDPNeb4qU9Cx0nxuF/245xmFJRCWEhYCISg0RwUuNHBE+1h/dG1fHl9tPImBOFGLOclgSUXFjISCiUse2gjlmvNIYPwxojtvZd9H7m934ZP1h3LzDYUlExYWFgIhKrecbVMXmsX7o36oWFu1KRKdZkdh5IlXrWERGiYWAiEq1iuVM8e8enlg57DmYm+jQf+F+vPdLLNJvcVgSUVFiISAig9DCxQ4bR7fFW8/XRdjBC2g/MwKb4jksiaiosBAQkcGwMDPBuM5uWDuiDewrlsO/forBW0tjcDkzS+toRAaPhYCIDI6nkzXWjmyD9zo1wNYjl9FhRiRWxXBYEtGzYCEgIoNkZqLDiBfqYeOotqhXtSLe+SUWwYsOIOnaLa2jERkkFgIiMmj1qlbEL8OewyfdPRCdeBWdZkZi8Z5EDksiekosBERk8HQ6QXDr2tg8xg9Na9ni47WH8cq3e3CKw5KInphmhUBEaorIDhFJEJHDIjJav9xORMJF5IT+b1utMhKRYalpZ4nFA1vg/172xonLN9Bl9k58teMkcjgsieixtNxDkAvgHaWUO4BWAEaIiDuA8QC2KaVcAWzT3yYieiIigt7NaiA8xA/tG1bFF5uPoedXuxB/IV3raESlmmaFQCmVrJT6Q/91JoAjAJwA9ADwo361HwH01CQgERm0qpUsMO/1ZvimX1NcyriDHl/twuebjiIrh8OSiB6kVJxDICK1ATQBsA+Ag1IqWX9XCgAHrXIRkeHr7OmIbSH+CGzihHm/n8JLc3biQOJVrWMRlTqaFwIRqQhgFYAxSqn/GYCu8j9U/MBThUVkqIhEi0h0aiqvbU5ED2dtaYYvXvbG4oEtcCcnDy9/swcfr43HDQ5LIvqLpoVARMyQXwaWKqXC9IsviYij/n5HAJcf9Fil1HdKKR+llI+9vX3JBCYig+ZX3x5bxvrhzda1sWTvWXSaGYmI4/yFggjQ9lMGAmAhgCNKqRkF7loHIFj/dTCAtSWdjYiMV4Vyppjc3QOh/3oOFmY6BH+/HyEr/8T1W9laRyPSlGh1qU8R8QWwE8AhAPc+EzQB+ecRrATgDOAsgFeUUo884Ofj46Oio6OLMS0RGaOsnLuYu/0kvok4BRtLM/y7hydeauSodawSIyIxSikfrXNQ6aBZIShKLARE9CwOX0zH+6viEH8hA509quHfPTxQ1cpC61jFjoWACtL8pEIiIq15VLfGmrfa4P3Obth+7DLaz4jAyujzHJZEZYpRFILEjEQkZSZpHYOIDJipiQ7Dn6+LTaPbwq2aFcaFxqH/wv04f5XDkqhsMIpCcDvnNnqu6YnF8YtxN48XHSGiwqtjXxHLh7bCpz09cfDcNXScGYlFu87gLoclkZEzikJgr7OHs84ZX8R8gdfWv4bT109rHYmIDJhOJ+jfqha2hPijZR07fLI+AS9/sxsnL2dqHY2o2BhFITAVU7xd/W30seqDM+lnELQuCPP+mIecvBytoxGRAXOyKY9FbzbHzFe9cTrtJl6aHYW5209wWBIZJaP4lEG9evXUggULAADpOelYkboCh3IOoU7FOviP/3/gUcVD44REZOjSbtzBpHWH8WtcMtyqVcIXvb3RqIa11rGeCT9lQAUZxR6CgqzNrDG0+lC8afMmUm+mou+vffHFvi+QlZuldTQiMmBVKpbDV681xbf9m+HqzWz0nLcL0347wmFJZDSMrhDc08y6GT50+hDNzJth8dHF6BnWEwdSDmgdi4gMXCePaggP8UfvpjXwbcRpdJm9E/tOX9E6FtEzM9pCAAAVTCog2DEYw+yG4VbWLQzcPBCToybjRvYNraMRkQGzLm+Gz3p7YenglsjNy8Or3+3FR2sOITOL5y2R4TLqQnCPZyVPTHCagDbl2iDsVBi6hXVD5PlIrWMRkYFrU68KNo/xwyBfFyzddw6dZkZix9EHzmMjKvXKRCEAAAsTC/Sp1gdvV3kbkiMYsX0E3tvxHq5lXdM6GhEZMEtzU0zs6o5Vw1ujQjlTDPjhAMau+BNXb3JYEhmWMlMI7nGt4IrxTuPRzqIdtpzbgq5hXbHx9EZeopSInklTZ1tsGOWLUS+6Yn3sRXSYEYENcRf5s4UMRpkrBABgrjNHL4deeKfqO6h4tyLe3/k+3tryFi7f4q4+Iiq8cqYmCOlQH+vf9oWTbXmM/Pkghi6JwaUMfsqJSr8yWQjucS7vjPec3sNLli9hb8pedAvrhl+O/sJGT0TPpKGjFcKGt8aEl9wQeTwV7WdEYPn+c/zZQqWa0V2YqLBS7qRgaepSJN5NRNMqTTHFbwpqVqpZRAmJqKxKTLuJ91fFYd+Zq2hdtzKmB3rBubKl1rEA8MJE9L/K9B6CgqqVq4axTmMRWCkQh9MOo+fqnlh0aBGHJRHRM6ldpQKWDWmF//RqhLikdHScFYEFO09zWBKVOtxD8ABXs69iaepSHM89jobWDfEf//+gnm29Int+IiqbktNv48PV8dh+9DIa17TB5729UN+hkmZ5uIeACuIeggewM7fDyOoj8ZrVazibcRa91/fG3D/mIucuLzpCRIXnaF0eC4N9MLtPY5y7egsBc3Zi9tYTyM7lsCTSHvcQPEZGbgZWXF6BuJw41K5YG//x+w8a2TcqltciorLjyo07+GR9AtbFXkQDh0r4vLcXvGvalGgG7iGggriH4DGsTK0wpPoQDLAZgKs3r+L1ja9j+t7puJ17W+toRGTAKlcshzl9m2DBGz5Iv52DXvN2YeqvCbidzfOWSBssBE+oqXVTfOj0IXzMfbD02FL0COuB/cn7tY5FRAauvbsDtoT4oU8LZ8zfeQadZ0dizykOS6KSx0LwFCxNLPGG4xsYXnk47mTdwaAtgzBx50RkZmdqHY2IDJiVhRn+06sRfh7SEgDQd/5efBB2CBkclkQliIWgENwrumOC0wS0tWiLtafXotuqbthxbofWsYjIwLWuWwWbRvthqF8drDhwDh1nRGLbkUtax6IygoWgkMqZlMMrDq9gtP1omOSaYNSOUQjZFoKrWVe1jkZEBqy8uQkmvNQQYW+1gXV5Mwz6MRqjlh3ElRt3tI5GRo6F4BnVtayL8U7j0b58e2xP2o5uq7rh11O/8hKlRPRMGte0wfq3fTG2fX38Fp+M9jMisPbPC/zZQsWGhaAImOnM0KNqD7zr8C6slBXGR43Hvzb/Cyk3U7SORkQGzNxUh9HtXbHh7bZwrlwBo5f/icE/RiM5nZ9yoqLHQlCEaljUwHtO7yGgQgAOXDqA7mHdsfzIcuQpXnSEiAqvQbVKCBveGh8FNMSuU2noMCMSS/edRR4vf0xFiBcmKiaX7lzC0tSlOHP3DBpXboypflPhbOWsdSwiMnDnrtzC+LA47D51Ba3q2GF6oBdqV6lQqOfihYmoIO4hKCYO5Rww1mksgioF4ciVI+i5picWxi1Ebl6u1tGIyIA5V7bE0sEtMT2wEQ5fyECnWZH4LvIUcu9yTyQ9G+4hKAFXs69iWeoyHM09igbWDTDVbyoa2DXQOhYRGbiU9Cx8tCYeW49cgncNa3zW2wtu1aye+PHcQ0AFcQ9BCbAzt8Nb1d/C69avIykjCa+ufxVzoucg+2621tGIyIBVs7bA/Dea4cu+TZB07Ta6zonCjPDjuJPLyx/T0+MeghKWmZuJFZdXIDYnFrUq1MJUv6nwruqtdSwiMnBXb2bj0w0JWH3wAlyrVsRnvb3Q1Nn2kY/hHgIqyCgKQf26LuqHef/VOsZTOXjzCJZlbkAGbqJP7e4Y4zUIlqbltY5FRAZu18k0TPvtCC5n3kHf5s4Y9nwdWJqZPnBdsXJkIaC/GEUh8KluoqKHVtQ6xlO7IYJZdjZYYVUJTjm5mJx2Ba2yeDUyIioZ8kkGCwH95cG10cBkW1bDOe+hWscolDcAeGUlY54uDkMcTRFk44mQam1hZWKhdTQiMnBn0m5i9cELSLuRDZ9atujSqBrKm5n8vcIng7QLR6VOqdxDICKdAcwGYAJggVJq+qPW9/HxUdHR0SWSrbhk5WZhXuw8/Hj4R1S2qIyPWn2Eds7ttI5FRAYuK+cuZm49jvmRp1GlYjlM6emJjh7VAPAcAvpfpa4QiIgJgOMAOgBIAnAAQF+lVMLDHmMMheCew2mH8fHuj3H82nF0rt0Z41uMR+XylbWORUQGLi7pOsaFxuFoSiYCvBwxuZsHqlpZsBDQX0rjxw5bADiplDqtlMoGsBxAD40zlRiPKh5Y3nU53m7yNrad24Yea3tg/an1HGhCRM/Eq0b+sKR3O9ZH+OFL6DAzQutIVMqUxnMInACcL3A7CUDL+1cSkaEA7p04cEdE4ksgmya6o/vTrF4FQFoxRTE0fC/+xvfib3wv/sYrpNFfSmMheCJKqe8AfAcAIhLN3V75+F78je/F3/he/I3vxd9ExDiOtVKRKI2HDC4AqFngdg39MiIiIiompbEQHADgKiIuImIOoA+AdRpnIiIiMmql7pCBUipXREYC2Iz8jx1+r5Q6/JiHfVf8yQwG34u/8b34G9+Lv/G9+BvfC/pLqfvYIREREZW80njIgIiIiEoYCwEREREZdiEQkc4ickxETorIeK3zlCQRqSkiO0QkQUQOi8ho/XI7EQkXkRP6vx89/9SIiIiJiBwUkQ362y4isk+/fazQn6Rq9ETERkRCReSoiBwRkefK6nYhImP1/3/Ei8gyEbEoK9uFiHwvIpcLXqPlYduB5Jujf0/iRKSpdslJKwZbCPSXOP4KQBcA7gD6ioi7tqlKVC6Ad5RS7gBaARih//7HA9imlHIFsE1/u6wYDeBIgdufAZiplKoH4BqAsjLJZTaATUopNwDeyH9Pytx2ISJOAEYB8FFKeSL/JOU+KDvbxQ8AOt+37GHbQRcArvo/QwF8XUIZqRQx2EKAMn6JY6VUslLqD/3Xmcj/oe+E/PfgR/1qPwLoqUnAEiYiNQAEAFigvy0A2gEI1a9SJt4LEbEG4AdgIQAopbKVUtdRRrcL5H+SqryImAKwBJCMMrJdKKUiAVy9b/HDtoMeABarfHsB2IiIY4kEpVLDkAvBgy5x7KRRFk2JSG0ATQDsA+CglErW35UCwEGrXCVsFoBxAPL0tysDuK6UytXfLivbhwuAVACL9IdPFohIBZTB7UIpdQHA/wE4h/wikA4gBmVzu7jnYdsBf56SQRcCAiAiFQGsAjBGKZVR8D6V/5lSo/9cqYh0BXBZKRWjdZZSwBRAUwBfK6WaALiJ+w4PlKHtwhb5v/m6AKgOoAL+uQu9zCor2wE9OUMuBGX+EsciYob8MrBUKRWmX3zp3q4+/d+XtcpXgtoA6C4iicg/dNQO+cfRbfS7ioGys30kAUhSSu3T3w5FfkEoi9tFewBnlFKpSqkcAGHI31bK4nZxz8O2gzL/85QMuxCU6Usc64+RLwRwRCk1o8Bd6wAE678OBrC2pLOVNKXUB0qpGkqp2sjfDrYrpV4HsANAb/1qZeW9SAFwXkTuTbF7EUACyuB2gfxDBa1ExFL//8u996LMbRcFPGw7WAfgDf2nDVoBSC9waIHKCIO+UqGIvIT8Y8f3LnE8VdtEJUdEfAHsBHAIfx83n4D88whWAnAGcBbAK0qp+08sMloi8jyAd5VSXUWkDvL3GNgBOAign1LqjobxSoSINEb+yZXmAE4DGID88l/mtgsR+QTAq8j/VM5BAIORf2zc6LcLEVkG4Hnkj3u+BGASgDV4wHagL0xzkX9I5RaAAUopTkIsYwy6EBAREVHRMORDBkRERFREWAiIiIiIhYCIiIhYCIiIiAgsBERERAQWAiIiIgILAVGR0o+k7qD/eoqIfKl1JiKiJ2H6+FWI6ClMAvBvEamK/IFT3TXOQ0T0RHhhIqIiJiIRACoCeF4plam/YuKHAKyVUr0f/WgiIm3wkAFRERKRRgAcAWQrpTIBQCl1Wik1SNtkRESPxkJAVET00+OWIn/k7g0R4ahdIjIYLARERUBELJE/XvcdpdQRAJ8i/3wCIiKDwHMIiIqZiFQGMBVABwALlFLTNI5ERPQPLARERETEQwZERETEQkBERERgISAiIiKwEBARERFYCIiIiAgsBERERAQWAiIiIgILAREREYGFgIiIiAD8P6gs5Ij5c9+SAAAAAElFTkSuQmCC\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "# y2 represents the line of constraint y <= 100 - x\n", "y1 = 100 - x\n", "y2 = x*0+2;\n", "y3 = (50-3*x)/3.0\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$x_{1}+x_{2} \\leq 100$')\n", "plt.plot(x, y2, label=r'$x_{2}\\geq2$')\n", "plt.plot(x, y3, label=r'$3x_{1} + 3x_{2} \\leq 50$')\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 100))\n", "plt.ylim((0, 100))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "\n", "plt.fill_between(x, y3, y2, where=y3>y2, color='grey', alpha=0.5) #fill where y3 is greater than y2\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can see that now the physical constraint $x_{1}+x_{2} \\leq 100$ does not have any impact on the feasibility region. We can focus on narrower intervals of $x_{1}$ and $x_{2}$ to search for the best solution. Let's also introduce the next constraint.\n", "\n", "$x_{1} > 0$\n", "\n", "$x_{2} \\geq 2$\n", "\n", "$x_{1}+x_{2} \\leq 100$\n", "\n", "$3x_{1}+3x_{2} \\leq 50$\n", "\n", "$8x_{1} + 2x_{2} \\geq 80$\n", "\n", "Now the feasibility region is:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 4 }, { "data": { "text/plain": "
", "image/png": "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\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "\n", "# y1 represents the physical constraint x + y <= 100\n", "y1 = 100 - x\n", "\n", "# y2 represents the line of constraint y >= 2\n", "y2 = x*0+2\n", "\n", "# y3 represents the constraint 3x + 3y <= 50\n", "y3 = (50-3*x)/3.0\n", "\n", "# y4 represents the line of the constraint 6x + 2y >= 4 \n", "y4 = (80 - 8*x)/2.0\n", "\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$x_{1}+x_{2} \\leq 100$') #y4\n", "plt.plot(x, y2, label=r'$x_{2}\\geq2$') #y1\n", "plt.plot(x, y3, label=r'$3x_{1} + 3x_{2} \\leq 50$') #y2\n", "plt.plot(x, y4, label=r'$8x_{2} + 2x_{1} \\geq 80$') #y3 \n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 20))\n", "plt.ylim((0, 15))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "y5=np.maximum(y4, y3) #line representing the maximum between y4 and y3\n", "y6=np.maximum(y2,y4) #line representing the maximum between y2 and y4\n", "plt.fill_between(x, y5, y6, where=y5>y6, color='grey', alpha=0.5) #fill where y5 ys greater than y6\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The feasible region (in grey) contains all possible solutions to the objective function. \n", "\n", "Minima and maxima of linear programming problems are found at the vertices of the feasible region. Therefore, the solution is the minimum of the objective function between the three vertices.\n", "\n", "The three corners are the intersections between the lines:\n", "\n", "| Line 1 | Line 2 | \n", "|-------------|:-----------:| \n", "| 3x +3y ≤ 50 | 8x +2y ≥ 80 | \n", "| 8x +2y ≥ 80 | y ≥ 2 | \n", "| y ≥ 2 | 3x +3y ≤ 50 |\n", "\n", "Considering that the objective function is:\n", "\n", "Z = 45x + 12y\n", "\n", "We can calculate Z for each corner:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1)\n", "\n", " 3x +3y ≤ 50 and 8x +2y ≥ 80 \n", " (50-3x)/3 = (80 - 8x) / 2 \n", " x = 7.78 \n", " y = 8.86 \n", " Z = 456.42 \n", "\n", "\n", "2)\n", "\n", " 8x +2y ≥ 80 and y ≥ 2 \n", " (80 - 8x) / 2 = 2 \n", " x = 9.5 \n", " y = 2 \n", " Z = 451.5 \n", "\n", "\n", "3)\n", "\n", " y ≥ 2 - x and 3x +3y ≤ 50 \n", " 2 = (50 - 3x) / 3 \n", " x = 14.67 \n", " y = 2 \n", " Z = 684 " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true, "pycharm": { "is_executing": false } }, "outputs": [ { "data": { "text/plain": "" }, "metadata": {}, "output_type": "execute_result", "execution_count": 5 }, { "data": { "text/plain": "
", "image/png": "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LWrWNTMz61HTpuTBBx/0au5xKysrMXDgQL+AgIDg06dPGwPAsmXL7P38/EJUKtU/x6zRs2fPwNDQ0K6pqaktdqlL//79/a2trbsPHDjQr/bye+65x9fHxyfU398/5P777/cpKysTzT3GmjVrbH19fUOeeuopDwDYt2+feffu3YP8/PxCAgICgr/88st/WpN99tlnDj4+PqHz58+vc57E5po/f76LEKJnenq6GqhqeGxtbd295v9yzpw5bjXr3n///T4ODg7h/v7+IXXtr77tG4vFEumFznadsWroKvjb++PpHU9jVcIq2DiaQ+NphZTEAlj06MEpBIg6sEWLFjlFRUX5v/766x4333xzYO1CJCcnR/XRRx+5hIWFFdXextPTsywxMTEhMTEx4dtvv01t7rEPHDhgnpWVZXzy5MkEPz+/CgDo3r17ybp1605HREQUXr3+4cOHk8LCworWrVtn15j9e3h4dGtonTlz5mR8/vnn565ePn78+OyzZ8/GJyUlHS8tLRXvvfde/W0S6rF06VLNm2++mfbhhx9eAAArKyvdypUrz50+ffr4li1bTs2dO9czKyvLCAAmT56cvXv37sTPP/+8RYul06dPG2/fvt3Gzc2tvPbyiIiIwpr/y7fffrtmUms88sgjWRs3bjzV0H7r2r6xWv0Cb6LG0phr8NVdX+GFPS9g0cFFSCtMw23d7sfhX1Kg7nMbit9/CxWXLsHYpcX/kCGiRtq+4oRn9oVCi4bXbDwHD6viwQ91PV/X8zk5OapFixa5b9y48dSRI0fM77rrrgJra2tdzfOzZ8/2mDNnTsY777zj2tCxTp48aXLHHXcE/PXXX4nOzs7am2++OfDFF19MHzlyZH5d22RnZxtpNJp/3bbbo0ePepvYurq6anNzc40aytNYI0aMKPj555+tr14+duzYvJrHERERRWlpaSYAMHHiRE9HR0ft22+/nb5u3TqbN954w23//v1JRkZ1R8rPzzdyc3P753WGhYWV1Tz28fGpcHBw0Kanp6s1Gk0lAHh5eWkLCgpa7DUCwJNPPun51ltvpY0ePdqv4bWBqKiowqSkJJOWzHA9HFkivWKuNseSAUswIXgCVp9YjbUVywEJXHG5CQBQtGePwgmJqK0ZGRlBCIGaUY3AwMBye3t7HQDs3bvX4sKFCybjxo3Lu3q7tLQ0k65duwb36tUr8Ndff7UCgICAgPIZM2ZkPPLII14LFixwCQwMLK2vUAKAyspKIUTTzm6pVCpZWVnZpG1uRFlZmVizZo3jsGHD8gDggw8+uPDDDz84/PTTT9azZ8/2+uabb5LrK5SAqtepqqMP544dOywqKipEcHBwWe3l9fWXzcnJUdWc+rr66/Dhw2ZXr79q1So7Nze3iltvvbXk6uf+/vtvq8DAwODIyEj/Q4cOXbNtQ250e44skd4xUhnh2V7PopNVJyw6sAgPmd2MMxdtEOrmhsJdu2E3erTSEYk6rPpGgFqLjY2N7oMPPkh+6aWXOmVlZRnHx8ebL1my5KKFhYVu1qxZnitXrrzm9JSXl1fFuXPn4lxdXSv37Nljcf/99/slJCTEOzg46GbNmpW1fv16+6+//topLi4uoaHjHzlyxMLd3b28ofVq8/DwqNi1a9c1I0E1nnvuOdcff/zRAQAuX75sHBQUFAwAvXr1Kly5cmWTTxnGxMR43XLLLYVDhgwpBABra2vdp59+mhwVFRX08ssvnw8JCSmrb/v8/HxVamqqqZeX1zWvMyUlxXjixImdv/rqq3NXF1w2NjaV8fHxpqGhodfs397eXpeYmNjg+wsABQUFqsWLF7vu2LHjmlNqffr0KUpJSYmztbXVrVmzxnbUqFF+KSkpjW4aeqPbAxxZIj32YNcH8f6g95FsH4fUhCuouLkHivbtgyxv0s8sImoHxo8fn7du3bozTz31VEZWVpb6lVdeccnNzTU6deqU2aBBgwI9PDy6xcbGWo4ePdpv9+7dFubm5tLV1bUSAPr371/s5eVVFh8fbwZU/WLOyMgwAapOPdV33Lvvvtv37bffdp88eXJWU/JGR0fnHDhwwMrX1/e6Fx4vWrQoo+YaGmdn54qax80plGbPnu2WlZWl/vLLL/9VyB49etTc1tZWe/HiReP6tv/9998tvby8wnr37l3g5eX1rzlasrOzVVFRUX7z58+/MHjw4KKrt33iiScu9erVK/i999675sL7powsnThxwjQtLc00LCws2MPDo9ulS5dMevTo0TU1NVXt4OCgs7W11QFVpx21Wq2oufi7MW50e4AjS6TnbvO8DUZDbBC3PBff4DIeLipC8ZG/YXlLb6WjEVEbycvLU126dEkNANbW1pVBQUGl2dnZakdHx8qcnJzYmvVuvvnmwLfffvt8ZGRk8cWLF9XOzs5atVqNhIQEk+TkZNPAwMAyAHjyySc9Ro8efcXb27v84Ycf9t6xY8fpuo79008/nXvrrbc0S5Ysce7Xr19yYzN/9tlnjrfddlv+t99+m3IDL71B77zzjub333+33bNnz7+uRzp58qTJxx9/7Hr48OGEIUOG+P/++++5gwYNuqbYAYBBgwYVpaenx/r5+YUeP37ctGYUqrS0VAwbNsxv3LhxVyZOnJhzvW3ff/99txMnTsT7+Phc04qhKSNLN998c0l2dvY//5ceHh7dDh06dMLNzU2bmpqq7tSpk1alUmHHjh0WOp0OLi4ujZ5470a3BziyRAagT8/uUJupYGLRC1oVcHTjMqUjEVEbKi8vF5MmTfIeNWpUl0WLFrlv3brV9rnnnrtU3zZbtmyxCgoKCgkKCgoePXp0l/feey/FxcWlctOmTVZHjx61XLhwYcaUKVOyjY2N5fvvv3/d6QhqdO3atSw3N/dfgwsrVqywc3FxCTt69Kjlfffd59+vXz//2s/n5OSo/fz86r0IvCl69uwZOGHChM5//vmnjYuLS9i6detsAODZZ5/1zsrKUkdERHStuS1ep9Ph4Ycf9nnttdfO+/j4VHz55ZfJkydP9i4uLq7zwitzc3Pp4eFRfuXKlX8qrmXLltkfPHjQ6ttvv9XUjAjt27fPvPZ25eXl4nqFUktatWqVfUBAQEhgYGDw008/7bVixYqzNddW3X333b79+vULOnfunKmLi0vYu+++qwGAxYsXOy1evNipoe0bS9R3cZa+iYiIkIcOHVI6Bilgy9J4nE/Mhvup56G6koMT7z6BGREz0NSLLok6IiHEYSllRHO3j42NTQ4PD2/SaajWkJSUZPLbb79ZT58+vU07a+/YscNixowZXkePHk1s7C/Z6Ohor27dupU899xzma0cr8UMGDDAb+rUqZm177Crz4ULF9RhYWEhV65ciW14bf0XGxurCQ8P97necxxZIoPgG+6E0kItfAZPg1cW8OOfSzHn9zkor+T1S0QdhaOjY2VERERxWx/31ltvLXF3dy/v2rXrP5NS1iciIiIwKSnJfNSoUbltEK/FPP7445kvv/yye82klPX57LPPHAYOHBgwbdq0jLbIpjSOLJFBKCvRYtnsPQiNsIFmcTR2RgXik+5nEGYfhk/u+gS2prZKRyTSW+1lZKm1ZGRkGN12222BVy/fuXNnUs1F4u1B7TvwaowYMSJ70aJFHaLgaUh9I0u8wJsMgqm5Gu4BdkhNKYOLhwciklUYf9t4/Dfnvxj741h8OeRLeNp4Kh2TiAyQq6trZWMvRDZkixYtymBh1Dw8DUcGwzfcCbmXioG+Q2Bx5jR6mXbHVKepyC7JxrifxuHopaNKRyRqr3Q6nY4XCFK7Vf351tX1PIslMhi+4VUtj7LdI6AqrwCOH0eARQBmus6EUaURHvntEfx29jeFUxK1S/GZmZm2LJioPdLpdCIzM9MWQJ0TVfI0HBkMawczaDytcCFPwNbEBOYJJ1DesyfcTN0wx30OPs34FM/seQZp+Wl4JPwR3ilH1EK0Wu2jGRkZSzMyMkLBP7Kp/dEBiNdqtY/WtQKLJTIovuFOOLjpHEJ7R8LyxN8okxJCCNiobTDTfSaWZSzDe7HvIbUgFfP6zoNaxY840Y3q2bPnZQD3KJ2DSCn8C4EMim+4BpBAftBAmGRdQWVa2j/PmahM8Ljb44g0j8T6s+sx5dcpKK5o87uMiYionWGxRAZF08kKVg6muISqaUDUcXH/el4lVLjf+X7cZ3Mf9mfux4MbH8TlostKRCUionZC0WJJCDFTCHFcCBEvhPhOCGHW8FbUkQkh4BvmhAvJJRA+XWCZdPK66w2yH4RJjpNwvvA8xmwcg6TspDZOSkRE7YVixZIQwgPAdAARUspQAEYAximVhwyHb7gG2godinsNh8XZs6gsvv6ptnCrcMxwmYHyinJM2DQBf6T90cZJiYioPVD6NJwagLkQQg3AAsBFhfOQAXAPsIOJuRqZNl2h0mqB+Drv9oSXmRfmuM2BDWwwdftUfH/i+zZMSkRE7YFixZKU8gKAtwGkAkgHkCel3HL1ekKIx4UQh4QQhzIzDaYfIbUiIyMVvEMdkXZJBWluDvOEE/Wu72DsgFnus9BZ3RmvHngVS/YvgSG1+SEiImUpeRrOHsAIAL4A3AFYCiGir15PSvmFlDJCShnh5OTU1jFJT/mGa1BaWIGy3sNgmZQEqatz4lUAgIWRBZ50fxK9THvh68SvMWvbLDbhJSKiRlHyNNztAM5JKTOllBUA1gPoo2AeMiBeIY5QGQnkePaGSU4OKlNTG9zGSBhhgssERFlFYdvFbYj5OQa5pbmtH5aIiAyaksVSKoBbhBAWomqq5cEA6j+fQlTN1FwNjwA7XCy2AwAYxx1r1HZCCAx1HIoJ9hNwIvcExv44Fqn5DRdaRETUcTW6WBJC3CGE+FII0b36+8dv5MBSyv0A1gI4AuBYdZYvbmSf1LH4hjsh70o5yoJ6wSqpaVMD3GxzM6Y5TUNOaQ7GbRyHvy/93UopiYjI0DVlZOkRAM8AiBZCDALQ/UYPLqWcL6UMklKGSiknSCnLbnSf1HH4hFU11s0LuQPmycmoLCho0vb+Fv6Y5ToLxjpjTPptEn4580trxCQiIgPXlGKpQEqZK6WcA+BOAL1aKRNRo1g7mMHJyxqXjDwhKiuBY407FVebq6krZrvPhpvKDc/ufRZf/v0l75QjIqJ/aUqxtKnmgZTyeQArWj4OUdP4hmuQmalDua0LLE4kNmsfNmobPO3xNEJNQvFB3Af4z57/QKvTtnBSIiIyVA0WS0KI94UQQkr5Y+3lUsoPWy8WUeP4hFU11i2IuLtRUwjUxVgY4zHXx3Cb+W344dwPeOLXJ9iEl4iIADRuZKkAwEYhhAUACCHuEkKwbwTpBU0nK1g7mCHLPhTG+fmoPHeu2ftSCRVGOY/CaNvROJR5CA9sfAAZRRktmJaIiAxRg8WSlPIlAN8B2FVdJM0C8HxrByNqDCEEfMI1yMg1QaXKBCbNuG7pagPsBuBRx0eRVpiGcT+OYxNeIqIOrjGn4QYDeAxAEQANgOlSyj2tHYyosXzDNajUSuR1ux2WiS1T2HSz6oanXZ5GhbYC0ZuisTt1d4vsl4iIDE9jTsO9CGCelPI2AKMBrKmeOoBIL7j728HUQo1cn1thnpoKbV5ei+zX08wTs91mwxa2eGrHU/hvwn9bZL9ERGRYGnMabpCUcm/142MAogAsbO1gRI1lZKSCV4gj0sscAZ2EKi6uxfZd04S3i7oLXjv4Ghb/tRg62byLyImIyDA1ud2JlDIdVa1JiPSGb7gGZaUS+W6hsEhs3hQCdbEwssA092nobdYbK5NW4ultT6OskvOnEhF1FM3qDSelLGnpIEQ3wru6sW5e6B2wTDoJnbZl50kyEkYY7zweQ62GYsfFHXjop4eQU5rToscgIiL9pGQjXaIWY2KuhkegPS6Z+MKosBC6M2da/BhCCEQ5RuEh+4dwMu8kxv44Fil5KS1+HCIi0i8slqjd8A3ToKBIhWJLV5gei2+14/Sy6YVpTtOQV5aHcT+Nw5GMI612LCIiUh6LJWo3fMOrGuvmBN9RNZt3K/Z487Pww2zX2TCVppi0ZRI2nd7U8EZERGSQWCxRu2FlX9VY94omDGZpaajMad1ripxNnDHHbQ48VB54/o/n8dmRz9iEl4ioHWKxRO2Kb7gGV0osUKG2atEpBOpipbbCDI8ZCDMJw8fHPsZLu19iE14ionaGxRK1KzWn4rK8erfYbN4NMRbGmOQ6CYMsBmFj8kY89stjKCwvbJNjExFR62OxRO2Ko0dVY90c336wPNnyUwjURSVUuM/pPtxvez+OZB3BAxsfQHphepscm4iIWheLJWpXhBDwDdcgS6cBSrXQJbVtE9xIu0g85vgY0ovSMXbjWCRkJbTp8YmIqOWxWKJ2xzdcg0qdQLZjMEyPH2/z44dahWKGywxUaivx0C8PYWfKzjbPQERELYfFErU7btWNdbP9B8CqlacQqIunmSeecXsGDnDAjJ0z8G38t22egYiIWoaixZIQwk4IsVYIkSiEOCGEuFXJPNQ+1DTWzbLoAtML6ajMylIkh52xHWa5z4Kf2g9vHH4Db/75JpvwEhEZIKVHlt4H8KuUMghAOIATCuehdsI3XIMyrRHybDvDKLb1pxCoi5mRGaa6T8UtZrdg9cnVmL51Okq1pYrlISKiplOsWBJC2AKIBPAVAEgpy6WUuUrlofalprFuluctsGzji7yvZiSM8KDzgxhuNRy703fjoZ8fQnZptqKZiIio8ZQcWfIFkAlguRDibyHEUiGE5dUrCSEeF0IcEkIcyszMbPuUZJBMzNXoFGiPK87dYX7qFCrLyxXNI4TAXY534SH7h3Aq7xTG/jAW5/LOKZqJiIgaR8liSQ2gB4BPpZQ3ASgC8PzVK0kpv5BSRkgpI5ycnNo6Ixkw33ANinQWKFPZAYmJSscBAETYROBJpydRUF6AB356AAfTDyodiYiIGqBksZQGIE1Kub/6+7WoKp6IWoRPWNVs3pnO3WF6XH/mO+pi0QWzXGfBTJrh8a2PY+PJjUpHIiKieihWLEkpMwCcF0IEVi8aDEB/fqORwatprJvt2VuxKQTqUrsJ74t/vohPDn+iV/mIiOj/KX033FMAVgsh4gB0B/C6snGovfEN1yDXyAnILkblpUtKx/mXmia84Sbh+DT+U7yw8wVU6CqUjkVERFdRtFiSUh6tvh4pTEp5r5QyR8k81P74hjsBEMhyDFV0CoG61DThHWwxGJtSN+HRzY+ioLxA6VhERFSL0iNLRK3K0cMS1o5muOJxs+JTCNRFCIF7ne7FGNsxOHrlKB74kU14iYj0CYslatdqGutmW3WB6dlUVJbq74SQ/e3643HHx5FRnIExG8fgeGbb97UjIqJrsViids833Ak6qJBn1QVI0O97CEKsQvC0y9OQWomYX2KwI2WH0pGIiDo8FkvU7rn52cLE3AiZTt1hpufFEgB0MuuEOe5z4CgcMWPnDKw8tlLpSEREHRqLJWr3jIxU8OmmwRXnMFgknTaIW/Tt1HaY6T4TgcaBWHxkMV7f9zqb8BIRKYTFEnUIvuFOqBBmKCm3RuWFC0rHaRQzIzNMcZuCW81uxXenvsNTW55iE14iIgWwWKIOwSvEASojIEsTBvWxeKXjNJpKqPCA8wO4x/oe7MnYgwk/TcCVkitKxyIi6lBYLFGHYGKmRqcgB2S59oBFkn70iWssIQTucLgDMfYxOJN/BmN+HIOzuWeVjkVE1GGwWKIOwzfcCSXG9sCFQmiLi5WO02Q9bXriSecnUVRehAd/fhAHLh5QOhIRUYfAYok6DJ9uVY11r9iHQBw3zDmMOpt3xhy3OTCX5nhi6xP44eQPSkciImr3WCxRh2FlbwonTytkOXWHecIJpeM0m8ZYgznuc+Cp9sS8P+fhw0MfGsQdfkREhorFEnUonW9yQr61N4zPXIDUGe6t+JZGlpjuPh03mdyEL45/ged3Ps8mvERErYTFEnUoVY11gTwjT2jPn1c4zY1RCzUmuk7E7Ra3Y3PqZkzaNAn55flKxyIiandYLFGH4uBuCWs7Y2RpwmASd0zpODdMCIERTiMwznYcYrNj8cCPD+BCgWHMI0VEZChYLFGHIoRA5x6uyHEIgtnJ9nP7fV+7vpismYzLxZcxbuM4HMs0/EKQiEhfsFiiDscnXAOdUKM0zwyVRUVKx2kxXS27YqbrTKASePiXh7E9ebvSkYiI2gUWS9ThuPvZwsQEyHIIBY61rxEYd1N3zHGfAyeVE2bumokVx1YoHYmIyOCxWKIOR2Wkgk+YE7I03WB+wrBm824MW7UtZrrPRJBxEN468hYW/rEQlbpKpWMRERksFkvUIfne5AKt2hLatDKDnkKgLqYqU0x2m4y+5n2x5vQaTNsyDSXaEqVjEREZJBZL1CF5hThAJSRyzTqjMjlZ6TitQiVUGOc8DiOsR2DfpX2I3hiNrJIspWMRERkcxYslIYSREOJvIcTPSmehjsPETA0PP2tkacJg3A6mEKjP7Q634xGHR3Cu4BzG/DgGZ3LOKB2JiMigKF4sAZgBwHB7T5DB6tzLAyXmTlCdbf+jLd2tu+Mp56dQUl6CB39+EH9d+EvpSEREBkPRYkkI0QnAMABLlcxBHZNvWFVj3YIyDbT57X/ma19zX8x2mw1LWGLytslYn7Re6UhERAZB6ZGl9wA8C6DOK2yFEI8LIQ4JIQ5lZma2WTBq/yztTKFxMsIVx25QxcUpHadNaIw1mO0+G95qb8z/az7eP/g+m/ASETVAsWJJCDEcwGUp5eH61pNSfiGljJBSRjg5ObVROuooOvf2RL6ND9RJKUpHaTOWRpZ4yv0p9DTtiaUJS/HM78+gopJNeImI6qLkyFJfAPcIIZIB/BfAICHEKgXzUAfU+SZnAEBJlil0Wq3CadqOWqgR4xKDOy3vxG9pv2HipolswktEVAfFiiUp5QtSyk5SSh8A4wD8LqWMVioPdUwO7pawMtchxyoAurPtp1dcYwghcLfmbjxo+yDic+Ix9oexSCtIUzoWEZHeUfqaJSJFCSHge5MzcuwDYXSs/c3m3Ri32t2KyZrJyCrJwtiNYxF3uWNcv0VE1Fh6USxJKXdKKYcrnYM6pi69PaFTGUObpu2wFzsHWQZhputMGFUaYeKvE7H13FalIxER6Q29KJaIlOTmZwsTIy3ypBsqc3OVjqOYmia8zipnzN49G8tjlysdiYhIL7BYog5PZaSCZxdLXHEMgYjt2KegbNQ2mOk+E12Nu+Kdo+/glb2vsAkvEXV4LJaIAPgN8IPW2Aq603lKR1GcicoET7g9gf7m/fG/M//D1N+moriiWOlYRESKYbFEBMArxBEq6FBUaNOhphCoi0qoMMZ5DO6zvg9/Xv4T438aj8xiTgpLRB0TiyUiVDXWdXWWuGLbFbqTp5SOozcGOQzCJIdJSClIwdgfx+JUDt8bIup4WCwRVfPr64NScyfI+FSlo+iVcOtwzHCZgZKKEoz/eTz2pe1TOhIRUZtisURUrXNvLwBASaZxh51CoC7eZt6Y4zYH1rDGlO1TsPbEWqUjERG1GRZLRNUs7UzhYFGCXGMfVF65onQcveNo7IjZ7rPhq/bFywdexrsH3mVRSUQdAoslolp8w51QYOMD3d8dczbvhlgYWeAp96cQYRqBZSeWYfb22SivLFc6FhFRq2KxRFSL/+3BAIDyVN4RVxcjYYSHXB7CEMsh2HphKyZumoi8Mk65QETtF4sloloc3C1hoSpGQYUTdBUVSsfRW0IIDNMMQ7RdNI7nHMfYH8fifP55pWMREbUKFktEtQgh4O1rhhwbP2iP8zb5hvS27Y2pTlORXZKNcT+Nw9FLR5WORETU4lgsEV3F/46ukCpjlCdmKx3FIARYBPzThPeR3x7Br2d/VToSEVGLYrFEdBWPbm4wlqUozrPm3V6N5Gbqhjnuc+CqcsWze57F0qNL+d4RUbvBYonoKiojFTw0Fcix6AxtxmWl4xgMG7UNnnZ/GiHGIXg/9n0s2LsAWh0vlCciw8diieg6uvT1gdbYEmV/czbvpjBRmeAxt8cwwHwA1p9djym/TmETXiIyeCyWiK6j88BgqHRalGaolY5icFRChdHOozHSZiT2Z+7HgxsfxKWiS0rHIiJqNhZLRNdhYm4MJ7M85Kk6QVtapnQcgzTQfiAedXwU5wvPY+zGsUjKTlI6EhFRs7BYIqqDbzdHlJo5ouzoOaWjGKwwqzDMcJmB8opyTNg0AXvT9iodiYioyVgsEdUh4O4eAIDSs6UKJzFsXmZemOM2BzawwbTt0/D9ie+VjkRE1CSKFUtCCE8hxA4hRIIQ4rgQYoZSWYiux9rVDna6TBSWOfI2+BvkYOyAWe6z0EXdBa8eeBVL9i/he0pEBkPJkSUtgNlSymAAtwCYJoQIVjAP0TW8fIxRaO6BknO8QPlGWRhZYJr7NNxsejO+TvwaM7fNZBNeIjIIit3qI6VMB5Be/bhACHECgAeAhDo3yjoFLB/WNgGJAPjDBnF4DNb7dqNbXqzScdqFHpBYbWqCzy9ux6MrbsEHcIYdjJSORURUJ724L1oI4QPgJgD7r/Pc4wAeB4Awd/O2DUYdnrNLHsxPZeJiZTC6ag8rHafdGKdVw1krscimAtG4hE+lEzxhrHQsIqLrEkpfNyCEsAKwC8BrUsr19a0bEREhDx061DbBiKptmbMKp/OdMXFxX5jZWigdp105cukIZuycARVU+GDQB+ju3F3pSO2SEOKwlDJC6RxEhkrRu+GEEMYA1gFY3VChRKSUzrd4QqrUOPPzYQgh+NWCXz1de2L10NWwNrHGpN8mYUvyFqX/u4mIrqHk3XACwFcATkgp31EqB1FDfKJuhnFFEc4eSVc6SrvkbeONVUNXIdgxGLN3zcby+OW8U46I9IqSI0t9AUwAMEgIcbT6a6iCeYiuS21pDlf1ZaQXWKOyUqd0nHbJ3sweS+9airt87sI7h9/Bwr8WsgkvEekNJe+G2wtAKHV8oqbwDrHD+QQznN+bBJ8BXZWO0y6ZGpliceRieFh5YFn8MqQXpeOtAW/B0thS6WhE1MFxBm+iRvAb3gsqXQVO7TypdJR2TSVUmNlzJubfOh/7Lu7Dw78+zCa8RKQ4FktEjWDZ2QuOZak4f1Hwepo2MDpgND4e/DFS81Px4OYH2YSXiBTFYomokTw7qVAirJB1JkvpKB1CX4++WBG1AgAQ82sM/rjwh8KJiKijYrFE1Eh+g7sCUoeTvx5TOkqHEegQiG+HfgtPa09M2z4N/zv5P6UjEVEHxGKJqJEc+0XAtug8kpMKlI7SobhYuuDrIV/jVvdb8cqfr+C9w+9BJ3lXIhG1HRZLRI2kMjGBu00BciusUZBTqnScDsXS2BIfDvoQYwLG4Kv4r/Dc7udQVlmmdCwi6iBYLBE1QedeHgCA09tPKJyk41Gr1Hjplpcwq+cs/Jr8Kx7b8hhySnOUjkVEHQCLJaImcB/SB+bFl3H2wEWlo3RIQghMDJ2Itwe8jeNZxxG9ORop+SlKxyKido7FElETmLi5wVWXhkt5Jigv4QzTSrnL5y58dddXKCgvQPTmaPx9+W+lIxFRO8ZiiaiJvIOsIYURzh2+oHSUDq27c3esHroatqa2ePS3R/HruV+VjkRE7RSLJaIm8r6zB4wrCnFm1ymlo3R4njaeWBW1CqGaUDyz+xl8dewrThpKRC2OxRJRE1n2uAmavCSkpVWysa4esDOzwxd3foEo3yi8d+Q9vPzny6jQVSgdi4jaERZLRE0k1Gp0ctOhQhrj4slcpeMQqprwvtn/TTzW7TGsO7UOT21/CoXlhUrHIqJ2gsUSUTN07h8AVWU5TvNUnN5QCRWm95iOl/u8jL/S/0LMrzHIKMpQOhYRtQMsloiawW5gP9jnJCE5IZfXyOiZkf4j8cngT3Ch8ALGbxqPxOxEpSMRkYFjsUTUDGonJ7ibZqG43BhXLvB0j77p49EHK6JWQKVSIeaXGOxJ26N0JCIyYCyWiJrJt6crIHU4u59TCOijAPsArB66Gt423njq96fwfdL3SkciIgPFYomomTSD+sImPxlnDqQpHYXq4GzhjK+HfI2+Hn3x6l+v4p1D77AJLxE1GYslomYy69YNzkWnkJ2nQiEb6+otC2MLvD/wfYwNHIvlx5fjmV3PoFTL/y8iajwWS0TNJIyM4O1nAQA4dzRT4TRUH7VKjRd7v4g5EXOwNWUrHt3yKLJLs5WORUQGQtFiSQgxRAiRJIQ4LYR4XsksRM3heltPmBdfwpl9yUpHoQYIIRATEoN3bnsHidmJGL9pPJLzkpWORUQGQLFiSQhhBOBjAFEAggE8IIQIVioPUXNY9e8LpyvHkJ5WjjI21jUIt3vfjq/u+grF2mJE/xKNw5cOKx2JiPSckiNLNwM4LaU8K6UsB/BfACMUzEPUZGp7e3jYFUMnBVKPX1E6DjVSuFM4Vg1dBXtTezy25TFsOrtJ6UhEpMfUCh7bA8D5Wt+nAeh99UpCiMcBPF79bZkQIr4Nst0oDYAspUM0wBAyAgaT830NPjeEnIbyfrZtzuEY3txNDeX9DFQ6AJEhU7JYahQp5RcAvgAAIcQhKWWEwpEaZAg5DSEjwJwtjTlbliHlVDoDkSFT8jTcBQCetb7vVL2MiIiISG8oWSwdBOAvhPAVQpgAGAdgo4J5iIiIiK6h2Gk4KaVWCPEkgN8AGAFYJqU83sBmX7R+shZhCDkNISPAnC2NOVsWcxJ1AIId04mIiIjqxhm8iYiIiOrBYomIiIioHnpZLDXUBkUIYSqEWFP9/H4hhE8b5/MUQuwQQiQIIY4LIWZcZ53bhBB5Qoij1V//acuMtXIkCyGOVWe45vZhUeWD6vcyTgjRQ4GMgbXep6NCiHwhxNNXraPI+ymEWCaEuFx7fi8hhIMQYqsQ4lT1v/Z1bBtTvc4pIUSMAjnfEkIkVv+/bhBC2NWxbb2fkTbIuUAIcaHW/+3QOrZts/ZIdeRcUytjshDiaB3btsn7WdfPIX38fBIZPCmlXn2h6mLvMwA6AzABEAsg+Kp1pgL4rPrxOABr2jijG4Ae1Y+tAZy8TsbbAPysB+9nMgBNPc8PBfALAAHgFgD79eD/PwOAtz68nwAiAfQAEF9r2WIAz1c/fh7Aouts5wDgbPW/9tWP7ds4550A1NWPF10vZ2M+I22QcwGAOY34XNT7c6G1c171/BIA/1Hy/azr55A+fj75xS9D/9LHkaXGtEEZAeCb6sdrAQwWQoi2CiilTJdSHql+XADgBKpmJDdEIwCskFX+AmAnhHBTMM9gAGeklCkKZviHlHI3gKvb09f+/H0D4N7rbHoXgK1SymwpZQ6ArQCGtGVOKeUWKWVNw7q/UDWXmaLqeD8bo03bI9WXs/pnzRgA37XW8Rujnp9Devf5JDJ0+lgsXa8NytWFyD/rVP8yyAPg2CbprlJ9CvAmAPuv8/StQohYIcQvQoiQtk32DwlgixDisKhqHXO1xrzfbWkc6v4lpA/vJwC4SCnTqx9nAHC5zjr69r4+gqoRxOtp6DPSFp6sPl24rI7TRvr0fvYHcElKeaqO59v8/bzq55Ahfj6J9Jo+FksGQwhhBWAdgKellPlXPX0EVaeSwgF8COCHNo5Xo5+UsgeAKADThBCRCuVokKianPQeAP+7ztP68n7+i5RSouqXo94SQrwIQAtgdR2rKP0Z+RRAFwDdAaSj6hSXPnsA9Y8qten7Wd/PIUP4fBIZAn0slhrTBuWfdYQQagC2ANq05bsQwhhVP6BWSynXX/28lDJfSllY/XgzAGMhhKYtM1Yf+0L1v5cBbEDV6Yza9KntTBSAI1LKS1c/oS/vZ7VLNacqq/+9fJ119OJ9FUI8DGA4gPHVvziv0YjPSKuSUl6SUlZKKXUAvqzj+PryfqoBjASwpq512vL9rOPnkMF8PokMhT4WS41pg7IRQM3dG6MB/F7XL4LWUH3NwlcATkgp36ljHdea66iEEDej6r1u64LOUghhXfMYVRf8xl+12kYAD4kqtwDIqzWE39bq/ItdH97PWmp//mIA/HiddX4DcKcQwr76tNKd1cvajBBiCIBnAdwjpSyuY53GfEZa1VXXyN1Xx/H1pT3S7QASpZRp13uyLd/Pen4OGcTnk8igKH2F+fW+UHWH1klU3f3yYvWyV1D1Qx8AzFB1quY0gAMAOrdxvn6oGtqOA3C0+msogMkAJlev8ySA46i6a+cvAH0UeB87Vx8/tjpLzXtZO6cA8HH1e30MQIRC/+eWqCp+bGstU/z9RFXxlg6gAlXXdUxC1fVx2wGcArANgEP1uhEAltba9pHqz+hpABMVyHkaVdel1HxGa+4gdQewub7PSBvnXFn92YtD1S96t6tzVn9/zc+FtsxZvfzrms9krXUVeT/r+Tmkd59PfvHL0L/Y7oSIiIioHvp4Go6IiIhIb7BYIiIiIqoHiyUiIiKierBYIiIiIqoHiyUiIiKierBYIiIiIqoHiyWiZhBC7BBC3FH9eKEQ4kOlMxERUetQKx2AyEDNB/CKEMIZVQ1M71E4DxERtRJOSknUTEKIXQCsANwmpSwQQnQG8CKqZiEfrWw6IiJqKTwNR9QMQohuANwAlEspCwBASnlWSjlJ2WRERNTSWCwRNVF149fVAEYAKKxuWEtERO0UiyWiJhBCWABYD2C2lPIEgFdRdf0SERG1U7xmiaiFCCEcAbwG4A5UdXd/Q+FIRETUAlgsEREREdWDp+GIiIiI6sFiiYiIiKgeLJaIiIiI6sFiiYiIiKgeLJaIiIiI6sFiiYiIiKgeLJaIiIiI6sFiiYiIiKgeLJaIiIiI6vF/QVtip7/OoicAAAAASUVORK5CYII=\n" }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Construct lines, x represents our decision variable x1 and y represents our decision variable x2\n", "# x > 0\n", "x = np.linspace(0, 100, 2000) #2000 numbers from 0 to 100\n", "\n", "# y1 represents the physical constraint x + y <= 100\n", "y1 = 100 - x\n", "\n", "# y2 represents the line of constraint y >= 2\n", "y2 = x*0+2\n", "\n", "# y3 represents the constraint 3x + 3y <= 50\n", "y3 = (50-3*x)/3.0\n", "\n", "# y4 represents the line of the constraint 6x + 2y >= 4 \n", "y4 = (80 - 8*x)/2.0\n", "\n", "y6 = (451.5 - 45*x)/12\n", "\n", "#1. Make plot\n", "plt.plot(x, y1, label=r'$x_{1}+x_{2} \\leq 100$') #y4\n", "plt.plot(x, y2, label=r'$x_{2}\\geq2$') #y1\n", "plt.plot(x, y3, label=r'$3x_{1} + 3x_{2} \\leq 50$') #y2\n", "plt.plot(x, y4, label=r'$8x_{1} + 2x_{2} \\geq 80$') #y3 \n", "plt.plot(x, y6, label=r'$45x_{1} + 12x_{2} = 451.5')\n", "\n", "#2. Adjust axis\n", "plt.xlim((0, 20))\n", "plt.ylim((0, 15))\n", "plt.xlabel(r'$x_{1}$')\n", "plt.ylabel(r'$x_{2}$')\n", "\n", "#3. Fill feasible region\n", "y5=np.maximum(y4, y3) #line representing the maximum between y4 and y3\n", "y6=np.maximum(y2,y4) #line representing the maximum between y2 and y4\n", "plt.fill_between(x, y5, y6, where=y5>y6, color='grey', alpha=0.5) #fill where y5 ys greater than y6\n", "\n", "#4. plot legend\n", "plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " We have successfully calculated that the minimum value for Z (451.5), when $x_{1}$ is 9.5 and $x_{2}$ is 2.\n", "\n", "This method of testing every vertex is only feasible for a small number of variables and constraints. As the numbers of constraints and variables increase, it becomes far more difficult to graph these problems and work out all the vertices. For example, if there were a third variable:\n", "\n", "Z = Ax + By + Cz\n", "\n", "We would have to graph in three dimensions (x, y and z).\n", "\n", "In the next few notebooks, we'll take a look at how we can use the graphical method to solve other CLP problems: \n", "\n", "- [Making Chappie solved with the graphical method](../solved/Making%20Chappie%20(Solved%20Graphic).ipynb)\n", "- [Making weapons solved with the graphical method](../solved/Making%20weapons%20(solved%20Graphic).ipynb)" ] } ], "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.4" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "nbformat": 4, "nbformat_minor": 2 }