{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "HLEvRhX10Q3F", "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": "4uEPJGsQ0Q3G", "pycharm": {} }, "source": [ "\n", "< [Getting Started Guides](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/01.00-Getting-Started-Guides.ipynb) | [Contents](toc.ipynb) | [Getting Started with Gurobi](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/01.02-Getting-Started-with-Gurobi.ipynb) >

\"Open

\"Download\"" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WaSEnPcC0Q3H", "pycharm": {}, "slideshow": { "slide_type": "-" } }, "source": [ "# Getting Started with CVXPY" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "aBeww8An0Q3I", "pycharm": {}, "slideshow": { "slide_type": "skip" } }, "source": [ "This [Jupyter notebook](http://jupyter.org/notebook.html) demonstrates use of the [CVXPY](http://www.cvxpy.org/en/latest/) package for describing and solving convex optimization problems. CVXPY provides a modeling language embedded within Python that is well suited to linear and quadratic optimization problems with linear constraints. A limited set of solvers are distributed with CVXPY, and interfaces are available for others. Further documentation is available [here (.pdf)](https://media.readthedocs.org/pdf/cvxpy/latest/cvxpy.pdf)." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "r_BFRIGe0Q3J", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Installation\n", "\n", "It is necessary to install CVXPY before use. Instructions can be found [here](http://www.cvxpy.org/en/latest/install/). If you happen to be using the Anaconda distribution of Python, the following cell should be sufficient for installation.\n", "\n", " !conda install -c cvxgrp -y cvxpy\n", " \n", "CVXPY is already installed in Google Colaboratory, so no extra installation steps are required on that platform." ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "collapsed": true, "id": "VJehVC_o0Q3O", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Solving linear equations\n", "\n", "One of the simpliest use cases for cvxpy is solving a system of linear equations. For example, consider the pair of the equations\n", "\n", "\\begin{align*}\n", "3\\,x + 4\\,y & = 26 \\\\\n", "2\\,x - 3\\,y & = -11\n", "\\end{align*}\n", "\n", "where $x$ and $y$ are the unknowns. Each equation is a linear equality constraint. The problem is easily solved with a few simple cvxpy constructss." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "colab_type": "code", "executionInfo": { "elapsed": 872, "status": "ok", "timestamp": 1557239774334, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "KRXlD5uq0Q3P", "outputId": "9083c6e7-1a15-4355-da8d-f57ea6917af9", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "optimal\n", "2.0000000000000004\n", "4.999999999999999\n" ] } ], "source": [ "import numpy as np\n", "import cvxpy as cp\n", "\n", "# create the variables to solve for\n", "x = cp.Variable()\n", "y = cp.Variable()\n", "\n", "# create a list of equality constraints\n", "eqns = [\n", " 3*x + 4*y == 26,\n", " 2*x - 3*y == -11\n", "]\n", "\n", "# create a problem instance \n", "prob = cp.Problem(cp.Minimize(0), eqns)\n", "\n", "# solve\n", "prob.solve()\n", "print(prob.status)\n", "\n", "# display solution\n", "print(x.value)\n", "print(y.value)" ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": {}, "colab_type": "code", "id": "wXDQrUE__H4n" }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "fJINN-ai_G7D" }, "source": [ "### Using Matrix Parameters and Vector Variables" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 311, "status": "ok", "timestamp": 1557244162724, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "b1eL_yAL--BA", "outputId": "252d5394-4fb5-454c-a20d-5806ec06f902" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Problem Status: optimal\n", "Objective Value: 5.385164802505173\n", " Solution x[0]: 2.0\n", " Solution x[1]: 4.999999999999999\n" ] } ], "source": [ "import cvxpy as cp\n", "import numpy as np\n", "\n", "# specify problem data as numpy matrix and vectors\n", "A = np.array([[3, 4], [2, -3]])\n", "b = np.array([26, -11])\n", "\n", "# create a vector variables\n", "x = cp.Variable(2)\n", "\n", "# specify equality constraints\n", "constraints = [A*x == b]\n", "\n", "# form objective.\n", "objective = cp.Minimize(cp.norm(x))\n", "\n", "# form and solve problem.\n", "problem = cp.Problem(objective, constraints)\n", "problem.solve()\n", "\n", "# display the solution\n", "print(\" Problem Status:\", problem.status)\n", "print(\"Objective Value:\", problem.value)\n", "print(\" Solution x[0]:\", x[0].value)\n", "print(\" Solution x[1]:\", x[1].value)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "8biL-F7_0Q3S", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Regression: Evidence of Climate Change\n", "\n", "Get the historical record of ice out dates on Rainy Lake, Minnesota. Rainy Lake is a large lake, approximately 1000 sq. km., located on the Minnesota/Ontario border. Reliable records for ice-out date goes back to 1935, where for this lake ice-out is defined as the first day the lake can be navigated from one end to the other following a specified route.\n", "\n", "The next cell downloads and extracts the historical ice-out date from [Climatology office of the Minnesota Department of Natural Resources](https://www.dnr.state.mn.us/ice_out/index.html). The url needed to extract the historical information is found by clicking on a particular lake, then on the link labeled \"all ice-out data for this lake\"." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 312 }, "colab_type": "code", "executionInfo": { "elapsed": 1720, "status": "ok", "timestamp": 1557239775191, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "A_CC7v0l0Q3T", "outputId": "795bec27-9d76-4889-f3ce-ea3b047bfd3d", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data Download Status: OK\n" ] }, { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "

" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "from urllib.request import urlopen\n", "import json\n", "from dateutil.parser import parse\n", "import datetime\n", "\n", "# Lake ID for Rainy Lake\n", "lakeid = '69069400'\n", "\n", "# Get Ice-out Data\n", "url = 'https://maps1.dnr.state.mn.us/cgi-bin/climatology/ice_out_by_lake.cgi?id=' + lakeid\n", "response = urlopen(url).read().decode('utf8')\n", "data = json.loads(response) \n", "print('Data Download Status: ' + data['status'])\n", "\n", "# Calculate ice out 'day of year' for each date\n", "dates = [parse(d['date']) for d in data['result']['values']]\n", "\n", "year = np.array([d.year for d in dates])\n", "iceout = np.array([1 + datetime.date.toordinal(d) - datetime.date(d.year,1,1).toordinal()\n", " for d in dates ])\n", "\n", "plt.plot(year, iceout)\n", "plt.title('Ice Out Day on Rainy Lake, Minnesota')\n", "plt.ylabel('Julian Day of Year')\n", "plt.xlabel('Year');" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "brCAZNmR0Q3X", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "Create a regression model and fit using cvxpy." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 1708, "status": "ok", "timestamp": 1557239775194, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "wFG_HSr50Q3Y", "outputId": "9ec87f78-56a7-47a6-8101-6ae7d6eab1cc", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Slope: -0.0753\n", "Intercept: 126.7995\n" ] } ], "source": [ "# variables are slope, intercept, and predicted values\n", "\n", "slope = cp.Variable()\n", "intercept = cp.Variable()\n", "pred = cp.Variable(len(year))\n", "\n", "con = [pred == (intercept + slope*(year-1930))]\n", "obj = cp.Minimize(cp.norm(iceout-pred,2))\n", "\n", "prob = cp.Problem(obj,con)\n", "prob.solve()\n", "\n", "print(\" Slope: {0:8.4f}\".format(slope.value))\n", "print(\"Intercept: {0:8.4f}\".format(intercept.value))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Y8HFPC750Q3b", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "Plot the resulting fit and compare to the original data." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 295 }, "colab_type": "code", "executionInfo": { "elapsed": 1929, "status": "ok", "timestamp": 1557239775425, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "nv4P6Xo20Q3c", "outputId": "c11d3388-4ff3-4dba-8724-42e295fa761c", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "plt.plot(year, iceout, year, pred.value)\n", "plt.title('Ice Out Day on Rainy Lake, Minnesota')\n", "plt.ylabel('Day of Year')\n", "plt.xlabel('Year');" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "collapsed": true, "id": "77uJ0iFw0Q3f", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "## Integer Program\n", "\n", "Let's consider the problem\n", "\n", "\\begin{align*}\n", "\\text{Minimize}\\quad & 4 x + 6y \\\\\n", "\\text{subject to}\\quad & 2x + 2y \\geq 5 \\\\\n", "& x - y \\leq 1 \\\\\n", "& x,y \\geq 0 \\\\\n", "& x,y \\in \\text{Integer}\n", "\\end{align*}\n", "\n", "Let's first solve this problem ignoring the integer constraints on $x$ and $y$. This is known as the 'relaxation' of an integer or binary programming problem." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 1919, "status": "ok", "timestamp": 1557239775426, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "fnvHH2-j0Q3g", "outputId": "e2b248ac-20bc-4c17-8821-ad404586385c", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "status = optimal\n", "x = 1.7499999999999998\n", "y = 0.7499999999999998\n", "Obj = 11.499999999999998\n" ] } ], "source": [ "import numpy as np\n", "import cvxpy as cp\n", "\n", "# create the variables to solve for\n", "x = cp.Variable()\n", "y = cp.Variable()\n", "\n", "# create a list of equality constraints\n", "constraints = [\n", " 2*x + 2*y >= 5,\n", " x - y <= 1,\n", " x >= 0,\n", " y >= 0\n", "]\n", "\n", "obj = cp.Minimize(4*x + 6*y)\n", "\n", "# create a problem instance \n", "prob = cp.Problem(obj,constraints)\n", "\n", "# solve\n", "prob.solve()\n", "print(\"status = \", prob.status)\n", "\n", "# display solution\n", "print(\"x = \", x.value)\n", "print(\"y = \", y.value)\n", "print(\"Obj = \", prob.value)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "3G6YyyFW0Q3j", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "Since this is a minimization, the relaxed solution provides a lower bound on the solution of the integer problem. The next step is to define variables $x$ and $y$ as integer variables using `cvx.Variable(integer=True)` function." ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 85 }, "colab_type": "code", "executionInfo": { "elapsed": 1912, "status": "ok", "timestamp": 1557239775428, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "w8F7jJQ_0Q3k", "outputId": "969e4b30-9675-47be-cb33-fb6fd466f1c2", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "status = optimal_inaccurate\n", "x = 1.9999999888557622\n", "y = 1.0000000116464522\n", "Obj = 14.000000025301762\n" ] } ], "source": [ "import numpy as np\n", "import cvxpy as cp\n", "\n", "# create the variables to solve for\n", "x = cp.Variable(integer=True)\n", "y = cp.Variable(integer=True)\n", "\n", "# create a list of equality constraints\n", "constraints = [\n", " 2*x + 2*y >= 5,\n", " x - y <= 1,\n", " x >= 0,\n", " y >= 0\n", "]\n", "\n", "obj = cp.Minimize(4*x + 6*y)\n", "\n", "# create a problem instance \n", "prob = cp.Problem(obj, constraints)\n", "\n", "# solve\n", "prob.solve()\n", "print(\"status = \", prob.status)\n", "\n", "# display solution\n", "print(\"x = \", x.value)\n", "print(\"y = \", y.value)\n", "print(\"Obj = \", prob.value)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ofArDvA90Q3n", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "source": [ "The solvers distributed with CVXPY tyically employ interior-point algorithms augmented with a branch and bound strategy for integer or boolean variables. A consequence is that integer solutions are reported as floating point numbers that may need rounding for some applications. " ] }, { "cell_type": "code", "execution_count": 0, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "colab_type": "code", "executionInfo": { "elapsed": 2058, "status": "ok", "timestamp": 1557239775584, "user": { "displayName": "Jeffrey Kantor", "photoUrl": "https://lh5.googleusercontent.com/-8zK5aAW5RMQ/AAAAAAAAAAI/AAAAAAAAKB0/kssUQyz8DTQ/s64/photo.jpg", "userId": "09038942003589296665" }, "user_tz": 240 }, "id": "baO2rFO30Q3o", "outputId": "39ea9912-2460-498c-c5eb-99dda14f9a5b", "pycharm": {}, "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Integer Solution x = 2\n", "Integer Solution y = 1\n" ] } ], "source": [ "print('Integer Solution x = ', int(np.round(x.value)))\n", "print('Integer Solution y = ', int(np.round(y.value)))" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "s0CU1H0G0Q3s", "pycharm": {} }, "source": [ "\n", "< [Getting Started Guides](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/01.00-Getting-Started-Guides.ipynb) | [Contents](toc.ipynb) | [Getting Started with Gurobi](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/01.02-Getting-Started-with-Gurobi.ipynb) >

\"Open

\"Download\"" ] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "01.02-Doing-More-with-CVXPY.ipynb", "provenance": [], "version": "0.3.2" }, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "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 }