{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "cGu8YmZbcInL", "pycharm": {} }, "source": [ "\n", "*This notebook contains course material from [CBE40455](https://jckantor.github.io/CBE40455) by\n", "Jeffrey Kantor (jeff at nd.edu); the content is available [on Github](https://github.com/jckantor/CBE40455.git).\n", "The text is released under the [CC-BY-NC-ND-4.0 license](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode),\n", "and code is released under the [MIT license](https://opensource.org/licenses/MIT).*" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "QXs9TPP4cInN", "pycharm": {} }, "source": [ "\n", "< [Economic Order Quantity](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/05.01-Economic-Order-Quantity.ipynb) | [Contents](toc.ipynb) | [Vehicle Routing](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/05.03-Vehicle-Routing.ipynb) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "J2VR97nfcInN", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "# Assignment Problems" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "m_WJH85ccInO", "pycharm": {} }, "source": [ "This Jupyter notebook demonstrates models for various types of assignment problems using GLPK/MathProg. Run the following cell to perform the necessary installations on Google Colaboratory." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 153 }, "colab_type": "code", "executionInfo": { "elapsed": 5544, "status": "ok", "timestamp": 1557235985089, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "2MCVgHNPcW1l", "outputId": "03fe8961-6f58-4f01-cb0a-c0d036d89731" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reading package lists...\n", "Building dependency tree...\n", "Reading state information...\n", "glpk-utils is already the newest version (4.65-1).\n", "The following package was automatically installed and is no longer required:\n", " libnvidia-common-410\n", "Use 'apt autoremove' to remove it.\n", "0 upgraded, 0 newly installed, 0 to remove and 11 not upgraded.\n" ] } ], "source": [ "!pip install -q pyomo\n", "!apt-get install glpk-utils -q\n", "!pip install -q cvxpy" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1sre1WppcInP", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Example Problem" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "rak60NvZcInQ", "pycharm": {} }, "source": [ "You work as a logistics manager for a toy manufacturer, and you currently have five delivery trucks on the road. Your trucks are in Austin, Boston, Chicago, Denver, Edmonton, and Fargo. You need them to drive to five other cities: Atlanta, Boise, Charlotte, Dallas, and Fresno. The table below shows the distance in miles between these cities.\n", "\n", "| From\\To | Atlanta | Boise | Charlotte | Dallas | Fresno |\n", "| : -----: | :-----: | :------: | :-------: | :----: | :----: |\n", "| Austin | 921 | 1627 | 1166 | 196 | 1594 |\n", "| Boston | 1078 | 2661 | 837 | 1767 | 3107 |\n", "| Chicago | 716 | 1693 | 756 | 925 | 2140 |\n", "| Denver | 1400 | 815 | 1561 | 788 | 1142 |\n", "| Edmonton | 3764 | 1718 | 3848 | 3310 | 2835 |\n", "\n", "Where should you send each of your trucks in order to minimize travel distance?" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "39mlo9TgcInR", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "### Combinatorial Complexity" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Ampm5ASKcInS", "pycharm": {} }, "source": [ "How many ways are there to assign destinations to each truck?\n", "\n", "$N = 5 \\times 4 \\times 3 \\times 2 \\times 1 = 120$\n", "\n", "In general there are \n", "\n", "$N = n!$ \n", "\n", "ways to assign $n$ resources to $n$ tasks." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "colab_type": "code", "executionInfo": { "elapsed": 5672, "status": "ok", "timestamp": 1557235985225, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "M2kUCRP4cInT", "outputId": "736232f6-2b79-458e-d5d3-76f8cdec3142", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "

" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import math as math\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "n = np.arange(0,10)\n", "plt.plot(n,n);\n", "plt.xlabel('Number of Resources/Tasks');" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "colab_type": "code", "executionInfo": { "elapsed": 6048, "status": "ok", "timestamp": 1557235985627, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "_8udRkwgcInZ", "outputId": "eb690162-5df8-4e70-bd98-8d47568557e5", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "plt.xlabel('Number of Resources/Tasks')\n", "plt.plot(n,n,n,n**2)\n", "plt.legend(['n','n**2'],loc='best');" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "colab_type": "code", "executionInfo": { "elapsed": 6168, "status": "ok", "timestamp": 1557235985758, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "4gb1uT2UcInc", "outputId": "8684444f-0faa-4918-b263-f7a696038a50", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "plt.xlabel('Number of Resources/Tasks')\n", "plt.plot(n,n,n,n**2,n,np.exp(n))\n", "plt.legend(['n','n**2','exp(n)'],loc='best');" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "colab_type": "code", "executionInfo": { "elapsed": 6918, "status": "ok", "timestamp": 1557235986520, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "Vq-Ana28cIng", "outputId": "e7e71ed1-30db-4a8b-e405-05cc6ea7e327", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\nQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "plt.xlabel('Number of Resources/Tasks')\n", "plt.semilogy(n,n,n,n**2,n,np.exp(n),n,[math.factorial(i) for i in n])\n", "plt.legend(['n','n**2','exp(n)','n!'],loc='best');" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "EWAgJ_37cInj", "pycharm": {} }, "source": [ "### Types of Complexity\n", "\n", "$$ Combinatoric >> Exponential >> Geometric >> Linear $$\n", "\n", "Depending on the details, assignment problems can range from simple to very difficult to solve. The difficulty will depend on the exact details of the problem, the availability of specialized algorithms for a specific problem, and what features can be left out without compromising the utility of the solution." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "IRmHPDRycInk", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Formulation of a Basic Assignment Problem" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "eF0dOXxycInl", "pycharm": {} }, "source": [ "Let _x[R,T]_ be a binary variable where _x[R,T] = 1_ means resource _R_ is assigned to task _T_. " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "noBW93ghcInl", "pycharm": {}, "slideshow": { "slide_type": "fragment" } }, "source": [ "One resource must be assigned to each task. So for all $t\\in TASKS$\n", "\n", "$$\\sum_{r \\in RESOURCES} x[R,T] = 1$$ " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "OzEQqcTCcInn", "pycharm": {}, "slideshow": { "slide_type": "fragment" } }, "source": [ "Each resource must be assigned to one task. So for all $r\\in RESOURCES$\n", "\n", "$$\\sum_{t \\in TASKS} x[R,T] = 1$$ " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "colab_type": "code", "executionInfo": { "elapsed": 6896, "status": "ok", "timestamp": 1557235986521, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "O3CAXquBcIno", "outputId": "83c3fcfe-9a0c-4656-ed2f-9e8881d95d88", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting Assign.mod\n" ] } ], "source": [ "%%writefile Assign.mod\n", "\n", "set RESOURCES;\n", "set TASKS;\n", "\n", "param a {RESOURCES,TASKS} >= 0;\n", "\n", "var x {RESOURCES,TASKS} binary;\n", "\n", "minimize Cost: sum{r in RESOURCES, t in TASKS} a[r,t]*x[r,t];\n", "subject to R {r in RESOURCES}: sum {t in TASKS} x[r,t] = 1;\n", "subject to T {t in TASKS}: sum {r in RESOURCES} x[r,t] = 1;\n", "\n", "solve;\n", "\n", "printf \"\\n\\n\";\n", "for {r in RESOURCES} {\n", " for {t in TASKS : x[r,t] == 1} {\n", " printf \"Assign %10s to %10s Cost: %6.0f\\n\", r, t, a[r,t];\n", " }\n", "}\n", "printf \"\\n\\n\";\n", "\n", "end;\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "bZ4rjGMBcInr", "pycharm": {} }, "source": [ "## Solution" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 833 }, "colab_type": "code", "executionInfo": { "elapsed": 6889, "status": "ok", "timestamp": 1557235986522, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "2lkeYhiRcIns", "outputId": "a352da31-2280-4528-d546-672f732181a5", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GLPSOL: GLPK LP/MIP Solver, v4.65\n", "Parameter(s) specified in the command line:\n", " -m Assign.mod -d /dev/stdin\n", "Reading model section from Assign.mod...\n", "Assign.mod:23: warning: final NL missing before end of file\n", "23 lines were read\n", "Reading data section from /dev/stdin...\n", "12 lines were read\n", "Generating Cost...\n", "Generating R...\n", "Generating T...\n", "Model has been successfully generated\n", "GLPK Integer Optimizer, v4.65\n", "11 rows, 25 columns, 75 non-zeros\n", "25 integer variables, all of which are binary\n", "Preprocessing...\n", "10 rows, 25 columns, 50 non-zeros\n", "25 integer variables, all of which are binary\n", "Scaling...\n", " A: min|aij| = 1.000e+00 max|aij| = 1.000e+00 ratio = 1.000e+00\n", "Problem data seem to be well scaled\n", "Constructing initial basis...\n", "Size of triangular part is 9\n", "Solving LP relaxation...\n", "GLPK Simplex Optimizer, v4.65\n", "10 rows, 25 columns, 50 non-zeros\n", " 0: obj = 1.211800000e+04 inf = 3.000e+00 (1)\n", " 7: obj = 8.790000000e+03 inf = 0.000e+00 (0)\n", "* 16: obj = 4.609000000e+03 inf = 0.000e+00 (0)\n", "OPTIMAL LP SOLUTION FOUND\n", "Integer optimization begins...\n", "Long-step dual simplex will be used\n", "+ 16: mip = not found yet >= -inf (1; 0)\n", "+ 16: >>>>> 4.609000000e+03 >= 4.609000000e+03 0.0% (1; 0)\n", "+ 16: mip = 4.609000000e+03 >= tree is empty 0.0% (0; 1)\n", "INTEGER OPTIMAL SOLUTION FOUND\n", "Time used: 0.0 secs\n", "Memory used: 0.2 Mb (161972 bytes)\n", "\n", "\n", "Assign Austin to Dallas Cost: 196\n", "Assign Boston to Charlotte Cost: 837\n", "Assign Chicago to Atlanta Cost: 716\n", "Assign Denver to Fresno Cost: 1142\n", "Assign Edmonton to Boise Cost: 1718\n", "\n", "\n", "Model has been successfully processed\n" ] } ], "source": [ "%%script glpsol -m Assign.mod -d /dev/stdin\n", "\n", "set RESOURCES := Austin Boston Chicago Denver Edmonton ;\n", "set TASKS := Atlanta Boise Charlotte Dallas Fresno ;\n", " \n", "param a : Atlanta\t Boise Charlotte Dallas Fresno :=\n", "Austin 921 1627 1166 196 1594\n", "Boston 1078 2661 837 1767 3107\n", "Chicago 716 1693 756 925 2140\n", "Denver 1400 815 1561 788 1142\n", "Edmonton 3764 1718 3848 3310 2835 ;\n", "\n", "end;" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "R4ziPSQ4cInv", "pycharm": {} }, "source": [ "## Solution using CVXPY" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "colab_type": "code", "executionInfo": { "elapsed": 6883, "status": "ok", "timestamp": 1557235986523, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "9xNBNTjvcInv", "outputId": "dce724ba-78ad-4afc-f88e-647bc2687f51", "pycharm": {} }, "outputs": [ { "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AtlantaBoiseCharlotteDallasFresno
Austin921162711661961594
Boston1078266183717673107
Chicago71616937569252140
Denver140081515617881142
Edmonton37641718384833102835
\n", "
" ], "text/plain": [ " Atlanta Boise Charlotte Dallas Fresno\n", "Austin 921 1627 1166 196 1594\n", "Boston 1078 2661 837 1767 3107\n", "Chicago 716 1693 756 925 2140\n", "Denver 1400 815 1561 788 1142\n", "Edmonton 3764 1718 3848 3310 2835" ] }, "execution_count": 8, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "LOCATIONS = ['Austin','Boston','Chicago','Denver','Edmonton']\n", "\n", "distances = pd.DataFrame(index=LOCATIONS)\n", "distances['Atlanta'] = [921,1078,716,1400,3764]\n", "distances['Boise'] = [1627, 2661, 1693, 815, 1718]\n", "distances['Charlotte'] = [1166, 837, 756, 1561, 3848]\n", "distances['Dallas'] = [196, 1767, 925, 788, 3310]\n", "distances['Fresno'] = [1594, 3107, 2140, 1142, 2835]\n", "\n", "distances" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 119 }, "colab_type": "code", "executionInfo": { "elapsed": 7057, "status": "ok", "timestamp": 1557235986704, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "P7HgxT5tcIny", "outputId": "df80cdde-2130-420a-edc1-2d1b33ffcba7", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "optimal\n", "Assign Austin to Dallas Cost: 196\n", "Assign Boston to Charlotte Cost: 837\n", "Assign Chicago to Atlanta Cost: 716\n", "Assign Denver to Fresno Cost: 1142\n", "Assign Edmonton to Boise Cost: 1718\n" ] } ], "source": [ "import cvxpy as cvx\n", "import numpy as np\n", "\n", "RESOURCES = distances.index\n", "TASKS = distances.columns\n", "\n", "x = {r:{t:cvx.Variable(boolean=True) for t in TASKS} for r in RESOURCES}\n", "\n", "R = [sum([x[r][t] for t in TASKS]) == 1 for r in RESOURCES]\n", "T = [sum([x[r][t] for r in RESOURCES]) == 1 for t in TASKS]\n", "constraints = R + T\n", "\n", "cost = sum([distances.loc[r][t]*x[r][t] for t in TASKS for r in RESOURCES])\n", "prob = cvx.Problem(cvx.Minimize(cost), constraints)\n", "\n", "prob.solve()\n", "\n", "print(prob.status)\n", "\n", "for r in RESOURCES:\n", " for t in TASKS:\n", " if int(np.round(x[r][t].value)):\n", " print(\"Assign {0:10s} to {1:10s} Cost: {2:5.0f}\".format(r,t,distances.loc[r,t]))\n", " " ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "CaX2Z0trcIn1", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Example" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "nd-F7lDHcIn2", "pycharm": {} }, "source": [ "A foreman has five workers and five jobs to complete. The\n", "time in hours each worker needs to complete each job is shown in the following\n", "table.\n", "\n", "| Resource\\Task | Job 1 | Job 2 | Job 3 | Job 4 | Job 5 |\n", "| :-----------: | :---: | :---: | :---: | :---: | :---: |\n", "| Worker 1 | 3 | 4 | 8 | 7 | 8 |\n", "| Worker 2 | 2 | 5 | 3 | 2 | 6 |\n", "| Worker 3 | 7 | 9 | 1 | 8 | 3 |\n", "| Worker 4 | 5 | 3 | 4 | 6 | 6 |\n", "| Worker 5 | 8 | 9 | 7 | 5 | 8 |" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Nmid6M64cIn2", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "### What is the minimum time solution if one worker is assigned to each job?" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 833 }, "colab_type": "code", "executionInfo": { "elapsed": 7038, "status": "ok", "timestamp": 1557235986705, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "XRAXJpmIcIn3", "outputId": "aca33eb8-9c09-4961-fa14-accf4128559b", "pycharm": {}, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GLPSOL: GLPK LP/MIP Solver, v4.65\n", "Parameter(s) specified in the command line:\n", " -m Assign.mod -d /dev/stdin\n", "Reading model section from Assign.mod...\n", "Assign.mod:23: warning: final NL missing before end of file\n", "23 lines were read\n", "Reading data section from /dev/stdin...\n", "12 lines were read\n", "Generating Cost...\n", "Generating R...\n", "Generating T...\n", "Model has been successfully generated\n", "GLPK Integer Optimizer, v4.65\n", "11 rows, 25 columns, 75 non-zeros\n", "25 integer variables, all of which are binary\n", "Preprocessing...\n", "10 rows, 25 columns, 50 non-zeros\n", "25 integer variables, all of which are binary\n", "Scaling...\n", " A: min|aij| = 1.000e+00 max|aij| = 1.000e+00 ratio = 1.000e+00\n", "Problem data seem to be well scaled\n", "Constructing initial basis...\n", "Size of triangular part is 9\n", "Solving LP relaxation...\n", "GLPK Simplex Optimizer, v4.65\n", "10 rows, 25 columns, 50 non-zeros\n", " 0: obj = 2.800000000e+01 inf = 3.000e+00 (1)\n", " 7: obj = 2.000000000e+01 inf = 0.000e+00 (0)\n", "* 12: obj = 1.700000000e+01 inf = 0.000e+00 (0)\n", "OPTIMAL LP SOLUTION FOUND\n", "Integer optimization begins...\n", "Long-step dual simplex will be used\n", "+ 12: mip = not found yet >= -inf (1; 0)\n", "+ 12: >>>>> 1.700000000e+01 >= 1.700000000e+01 0.0% (1; 0)\n", "+ 12: mip = 1.700000000e+01 >= tree is empty 0.0% (0; 1)\n", "INTEGER OPTIMAL SOLUTION FOUND\n", "Time used: 0.0 secs\n", "Memory used: 0.2 Mb (161972 bytes)\n", "\n", "\n", "Assign Worker_1 to Job_1 Cost: 3\n", "Assign Worker_2 to Job_4 Cost: 2\n", "Assign Worker_3 to Job_3 Cost: 1\n", "Assign Worker_4 to Job_2 Cost: 3\n", "Assign Worker_5 to Job_5 Cost: 8\n", "\n", "\n", "Model has been successfully processed\n" ] } ], "source": [ "%%script glpsol -m Assign.mod -d /dev/stdin\n", "\n", "set RESOURCES := Worker_1 Worker_2 Worker_3 Worker_4 Worker_5 ;\n", "set TASKS := Job_1 Job_2 Job_3 Job_4 Job_5 ;\n", " \n", "param a : Job_1\tJob_2 Job_3\tJob_4 Job_5 :=\n", "Worker_1\t3\t4\t8\t7\t8\n", "Worker_2\t2\t5\t3\t2\t6\n", "Worker_3\t7\t9\t1\t8\t3\n", "Worker_4\t5\t3\t4\t6\t6\n", "Worker_5\t8\t9\t7\t5\t8 ;\n", "\n", "end;" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "1467PY69cIn6", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "### What is the minimum time solution if workers can be assigned multiple times?" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 765 }, "colab_type": "code", "executionInfo": { "elapsed": 7187, "status": "ok", "timestamp": 1557235986863, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "j4WR07q0cIn8", "outputId": "180cf16a-875f-4270-b05b-0105830c92ae", "pycharm": {}, "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GLPSOL: GLPK LP/MIP Solver, v4.65\n", "Parameter(s) specified in the command line:\n", " -m /dev/stdin\n", "Reading model section from /dev/stdin...\n", "Reading data section from /dev/stdin...\n", "35 lines were read\n", "Generating Cost...\n", "Generating T...\n", "Model has been successfully generated\n", "GLPK Integer Optimizer, v4.65\n", "6 rows, 25 columns, 50 non-zeros\n", "25 integer variables, all of which are binary\n", "Preprocessing...\n", "5 rows, 25 columns, 25 non-zeros\n", "25 integer variables, all of which are binary\n", "Scaling...\n", " A: min|aij| = 1.000e+00 max|aij| = 1.000e+00 ratio = 1.000e+00\n", "Problem data seem to be well scaled\n", "Constructing initial basis...\n", "Size of triangular part is 5\n", "Solving LP relaxation...\n", "GLPK Simplex Optimizer, v4.65\n", "5 rows, 25 columns, 25 non-zeros\n", "* 0: obj = 3.700000000e+01 inf = 0.000e+00 (4)\n", "* 3: obj = 4.100000000e+01 inf = 0.000e+00 (0)\n", "OPTIMAL LP SOLUTION FOUND\n", "Integer optimization begins...\n", "Long-step dual simplex will be used\n", "+ 3: mip = not found yet <= +inf (1; 0)\n", "+ 3: >>>>> 4.100000000e+01 <= 4.100000000e+01 0.0% (1; 0)\n", "+ 3: mip = 4.100000000e+01 <= tree is empty 0.0% (0; 1)\n", "INTEGER OPTIMAL SOLUTION FOUND\n", "Time used: 0.0 secs\n", "Memory used: 0.1 Mb (151392 bytes)\n", "\n", "\n", "Assign Worker_1 to Job_3 Cost: 8\n", "Assign Worker_3 to Job_4 Cost: 8\n", "Assign Worker_5 to Job_1 Cost: 8\n", "Assign Worker_5 to Job_2 Cost: 9\n", "Assign Worker_5 to Job_5 Cost: 8\n", "\n", "\n", "Model has been successfully processed\n" ] } ], "source": [ "%%script glpsol -m /dev/stdin\n", "\n", "set RESOURCES;\n", "set TASKS;\n", "\n", "param a {RESOURCES,TASKS} >= 0;\n", "\n", "var x {RESOURCES,TASKS} binary;\n", "\n", "maximize Cost: sum{r in RESOURCES, t in TASKS} a[r,t]*x[r,t];\n", "#subject to R {r in RESOURCES}: sum {t in TASKS} x[r,t] = 1;\n", "subject to T {t in TASKS}: sum {r in RESOURCES} x[r,t] = 1;\n", "\n", "solve;\n", "\n", "printf \"\\n\\n\";\n", "for {r in RESOURCES} {\n", " for {t in TASKS : x[r,t] == 1} {\n", " printf \"Assign %10s to %10s Cost: %6.0f\\n\", r, t, a[r,t];\n", " }\n", "}\n", "printf \"\\n\\n\";\n", "\n", "data;\n", "\n", "set RESOURCES := Worker_1 Worker_2 Worker_3 Worker_4 Worker_5 ;\n", "set TASKS := Job_1 Job_2 Job_3 Job_4 Job_5 ;\n", " \n", "param a : Job_1\tJob_2 Job_3\tJob_4 Job_5 :=\n", "Worker_1\t3\t4\t8\t7\t8\n", "Worker_2\t2\t5\t3\t2\t6\n", "Worker_3\t7\t9\t1\t8\t3\n", "Worker_4\t5\t3\t4\t6\t6\n", "Worker_5\t8\t9\t7\t5\t8 ;\n", "\n", "end;" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FDLw7s9QcIoB", "pycharm": {} }, "source": [ "### Exercise\n", "\n", "Suppose we want to assign just two workers. What is the minimum time solution using just two workers?" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WLYe3NIdcIoC", "pycharm": {} }, "source": [ "## Knapsack Problems" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "p3oMy30CcIoC", "pycharm": {} }, "source": [ "### Typical Applications\n", "\n", "* Resource allocations with financial constraints\n", "* Construction and scoring of a heterogenous test\n", "* Selection of Capital Investments" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "-H-nGMTKcIoD", "pycharm": {} }, "source": [ "### Example\n", "\n", "Need to complete a set of jobs\n", "\n", "\n", "| | A | B | C | D | E | F | G |\n", "|:-----:|:-:|:-:|:-:|:--:|:--:|:-:|:-:|\n", "| Value | 7 | 9 | 5 | 12 | 14 | 6 | 12 |\n", "| Time | 3 | 4 | 2 | 6 | 7 | 3 | 5 |\n", "\n" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 748 }, "colab_type": "code", "executionInfo": { "elapsed": 7181, "status": "ok", "timestamp": 1557235986865, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "hRBpXhyqcIoE", "outputId": "840c9cbe-50bf-49a1-d942-c57de154bb3b", "pycharm": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GLPSOL: GLPK LP/MIP Solver, v4.65\n", "Parameter(s) specified in the command line:\n", " -m /dev/stdin\n", "Reading model section from /dev/stdin...\n", "Reading data section from /dev/stdin...\n", "29 lines were read\n", "Generating Obj...\n", "Generating C...\n", "Model has been successfully generated\n", "GLPK Integer Optimizer, v4.65\n", "2 rows, 7 columns, 14 non-zeros\n", "7 integer variables, all of which are binary\n", "Preprocessing...\n", "1 row, 7 columns, 7 non-zeros\n", "7 integer variables, all of which are binary\n", "Scaling...\n", " A: min|aij| = 2.000e+00 max|aij| = 7.000e+00 ratio = 3.500e+00\n", "Problem data seem to be well scaled\n", "Constructing initial basis...\n", "Size of triangular part is 1\n", "Solving LP relaxation...\n", "GLPK Simplex Optimizer, v4.65\n", "1 row, 7 columns, 7 non-zeros\n", "* 0: obj = -0.000000000e+00 inf = 0.000e+00 (7)\n", "* 7: obj = 2.850000000e+01 inf = 0.000e+00 (0)\n", "OPTIMAL LP SOLUTION FOUND\n", "Integer optimization begins...\n", "Long-step dual simplex will be used\n", "+ 7: mip = not found yet <= +inf (1; 0)\n", "Solution found by heuristic: 26\n", "+ 9: >>>>> 2.800000000e+01 <= 2.800000000e+01 0.0% (4; 0)\n", "+ 9: mip = 2.800000000e+01 <= tree is empty 0.0% (0; 7)\n", "INTEGER OPTIMAL SOLUTION FOUND\n", "Time used: 0.0 secs\n", "Memory used: 0.1 Mb (148844 bytes)\n", " A 1\n", " B 1\n", " C 0\n", " D 0\n", " E 0\n", " F 0\n", " G 1\n", "Model has been successfully processed\n" ] } ], "source": [ "%%script glpsol -m /dev/stdin\n", "\n", "set ITEMS;\n", "\n", "param value{ITEMS};\n", "param cost{ITEMS};\n", "\n", "var x {ITEMS} binary;\n", "\n", "maximize Obj: sum{i in ITEMS} value[i]*x[i];\n", "subject to C: sum{i in ITEMS} cost[i]*x[i] <= 12 ;\n", "\n", "solve;\n", "\n", "for {i in ITEMS}{\n", " printf \"%3s %2d\\n\",i,x[i];\n", "}\n", "\n", "data;\n", "\n", "param : ITEMS : value cost :=\n", " A 7 3\n", " B 9 4\n", " C 5 2\n", " D 12 6\n", " E 14 7\n", " F 6 3\n", " G 12 5 ;\n", " \n", "end;\n" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "QfcR2Kg3cIoG", "pycharm": {} }, "source": [ "### Exercise\n", "\n", "| Investment | Location | Cost (millions) | Expected Profit |\n", "| :--------: | :------: | :-------------: | :-------------: |\n", "| 1 | Europe | 10 | 1.0 |\n", "| 2 | Europe | 8 | 0.9 |\n", "| 3 | Europe | 8 | 0.9 |\n", "| 4 | South America | 16 | 2.0 |\n", "| 5 | South America | 12 | 1.4 |\n", "| 6 | Africa | 4 | 0.2 |\n", "| 7 | Africa | 6 | 0.5 |\n", "| 8 | Africa | 16 | 2.1 |\n", "\n", "The objective is to maximize the total expected profits subject to:\n", "\n", "* Contractual commitments require at least 2 investments in Europe\n", "* There must be one South American Investment\n", "* No more than one African investment\n", "* Total cost must be less than $40 million\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "ga0bDdPIcIoG", "pycharm": {} }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "2eHByN7YcIoI", "pycharm": {} }, "source": [ "\n", "< [Economic Order Quantity](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/05.01-Economic-Order-Quantity.ipynb) | [Contents](toc.ipynb) | [Vehicle Routing](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/05.03-Vehicle-Routing.ipynb) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "05.02-Assignment-Problems.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python [default]", "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.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }