├── .gitignore ├── statistics ├── 2k center.xlsx ├── 4 factors.xlsx ├── datos-moneda.xlsx ├── problem 14-3.xlsx ├── table 11-1.xlsx ├── table 11-5.xlsx ├── table 12-14.xlsx ├── table 12-3.xlsx ├── table 12-6.xlsx ├── table 13-1.xlsx ├── table 13-12.xlsx ├── table 14-1.xlsx ├── problem 14-13.xlsx ├── problema 14-29.xlsx ├── interarrival_times.xlsx ├── anova_block_design.ipynb ├── linear_regression_indicator_vars.ipynb ├── 2k_design_center_point.ipynb ├── goodness_of_fit.ipynb └── anova_one_factor.ipynb └── optimization ├── ejemplo dea.xlsx ├── cvrp-anf-addresses.xlsx ├── dea.ipynb ├── tsp-gurobi.ipynb └── scheduling.ipynb /.gitignore: -------------------------------------------------------------------------------- 1 | statistics/.ipynb_checkpoints/ 2 | optimization/.ipynb_checkpoints/ 3 | optimization/gurobi.log 4 | -------------------------------------------------------------------------------- /statistics/2k center.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/2k center.xlsx -------------------------------------------------------------------------------- /statistics/4 factors.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/4 factors.xlsx -------------------------------------------------------------------------------- /statistics/datos-moneda.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/datos-moneda.xlsx -------------------------------------------------------------------------------- /statistics/problem 14-3.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/problem 14-3.xlsx -------------------------------------------------------------------------------- /statistics/table 11-1.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 11-1.xlsx -------------------------------------------------------------------------------- /statistics/table 11-5.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 11-5.xlsx -------------------------------------------------------------------------------- /statistics/table 12-14.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 12-14.xlsx -------------------------------------------------------------------------------- /statistics/table 12-3.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 12-3.xlsx -------------------------------------------------------------------------------- /statistics/table 12-6.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 12-6.xlsx -------------------------------------------------------------------------------- /statistics/table 13-1.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 13-1.xlsx -------------------------------------------------------------------------------- /statistics/table 13-12.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 13-12.xlsx -------------------------------------------------------------------------------- /statistics/table 14-1.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/table 14-1.xlsx -------------------------------------------------------------------------------- /optimization/ejemplo dea.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/optimization/ejemplo dea.xlsx -------------------------------------------------------------------------------- /statistics/problem 14-13.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/problem 14-13.xlsx -------------------------------------------------------------------------------- /statistics/problema 14-29.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/problema 14-29.xlsx -------------------------------------------------------------------------------- /statistics/interarrival_times.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/statistics/interarrival_times.xlsx -------------------------------------------------------------------------------- /optimization/cvrp-anf-addresses.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/industrial-ucn/jupyter-examples/HEAD/optimization/cvrp-anf-addresses.xlsx -------------------------------------------------------------------------------- /optimization/dea.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "collapsed": true 8 | }, 9 | "outputs": [], 10 | "source": [ 11 | "import xlwings as xw\n", 12 | "import numpy as np\n", 13 | "from docplex.mp.model import Model" 14 | ] 15 | }, 16 | { 17 | "cell_type": "code", 18 | "execution_count": 2, 19 | "metadata": { 20 | "collapsed": true 21 | }, 22 | "outputs": [], 23 | "source": [ 24 | "x = xw.Range('B2:C7').value\n", 25 | "y = xw.Range('D2:E7').value\n", 26 | "unidades = xw.Range('A2:A7').value\n", 27 | "s = 2 # cantidad de output\n", 28 | "m = 2 # cantidad de input\n", 29 | "n = 6 # cantidad de unidades" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 3, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "name": "stdout", 39 | "output_type": "stream", 40 | "text": [ 41 | "Unidad A\n", 42 | "solution for: DEA\n", 43 | "objective: 0.989306\n", 44 | "u_0=0.047\n", 45 | "u_1=0.017\n", 46 | "v_0=0.001\n", 47 | "v_1=0.124\n", 48 | "\n", 49 | "Unidad B\n", 50 | "solution for: DEA\n", 51 | "objective: 1\n", 52 | "u_0=0.001\n", 53 | "u_1=0.023\n", 54 | "v_0=0.001\n", 55 | "v_1=0.066\n", 56 | "\n", 57 | "Unidad C\n", 58 | "solution for: DEA\n", 59 | "objective: 0.878357\n", 60 | "u_0=0.001\n", 61 | "u_1=0.029\n", 62 | "v_0=0.001\n", 63 | "v_1=0.082\n", 64 | "\n", 65 | "Unidad D\n", 66 | "solution for: DEA\n", 67 | "objective: 0.856125\n", 68 | "u_0=0.034\n", 69 | "u_1=0.001\n", 70 | "v_0=0.001\n", 71 | "v_1=0.076\n", 72 | "\n", 73 | "Unidad E\n", 74 | "solution for: DEA\n", 75 | "objective: 1\n", 76 | "u_0=0.024\n", 77 | "u_1=0.001\n", 78 | "v_0=0.089\n", 79 | "v_1=0.001\n", 80 | "\n", 81 | "Unidad F\n", 82 | "solution for: DEA\n", 83 | "objective: 0.64883\n", 84 | "u_0=0.019\n", 85 | "u_1=0.007\n", 86 | "v_0=0.001\n", 87 | "v_1=0.049\n", 88 | "\n" 89 | ] 90 | } 91 | ], 92 | "source": [ 93 | "for k in range(n):\n", 94 | " mdl = Model('DEA')\n", 95 | " # Variables\n", 96 | " u = mdl.continuous_var_dict([r for r in range(s)], name='u', lb=1e-3)\n", 97 | " v = mdl.continuous_var_dict([i for i in range(m)], name='v', lb=1e-3)\n", 98 | " # Objetivo\n", 99 | " mdl.maximize(mdl.sum(u[r]*y[k][r] for r in range(s)))\n", 100 | " # Restricción de normalidad\n", 101 | " mdl.add_constraint(mdl.sum(v[i]*x[k][i] for i in range(m))==1)\n", 102 | " # Restricción de todas las unidades\n", 103 | " for j in range(n):\n", 104 | " mdl.add_constraint(\n", 105 | " mdl.sum(u[r]*y[j][r] for r in range(s)) <=\n", 106 | " mdl.sum(v[i]*x[j][i] for i in range(m))\n", 107 | " )\n", 108 | " mdl.solve()\n", 109 | " print('Unidad', unidades[k])\n", 110 | " print(mdl.solution)" 111 | ] 112 | } 113 | ], 114 | "metadata": { 115 | "kernelspec": { 116 | "display_name": "Python 3", 117 | "language": "python", 118 | "name": "python3" 119 | }, 120 | "language_info": { 121 | "codemirror_mode": { 122 | "name": "ipython", 123 | "version": 3 124 | }, 125 | "file_extension": ".py", 126 | "mimetype": "text/x-python", 127 | "name": "python", 128 | "nbconvert_exporter": "python", 129 | "pygments_lexer": "ipython3", 130 | "version": "3.5.4" 131 | } 132 | }, 133 | "nbformat": 4, 134 | "nbformat_minor": 2 135 | } 136 | -------------------------------------------------------------------------------- /statistics/anova_block_design.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Randomized Complete Block Design\n", 8 | "## Example 13-5: Fabric Strength" 9 | ] 10 | }, 11 | { 12 | "cell_type": "code", 13 | "execution_count": 4, 14 | "metadata": {}, 15 | "outputs": [], 16 | "source": [ 17 | "import pandas as pd\n", 18 | "import statsmodels.formula.api as smf\n", 19 | "from statsmodels.stats.anova import anova_lm\n", 20 | "import matplotlib.pyplot as plt\n", 21 | "import scipy.stats as st\n", 22 | "%matplotlib inline" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 5, 28 | "metadata": {}, 29 | "outputs": [ 30 | { 31 | "data": { 32 | "text/html": [ 33 | "
\n", 34 | "\n", 47 | "\n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | "
ChemicalFabricStrength
0111.3
1121.6
2130.5
3141.2
4151.1
\n", 89 | "
" 90 | ], 91 | "text/plain": [ 92 | " Chemical Fabric Strength\n", 93 | "0 1 1 1.3\n", 94 | "1 1 2 1.6\n", 95 | "2 1 3 0.5\n", 96 | "3 1 4 1.2\n", 97 | "4 1 5 1.1" 98 | ] 99 | }, 100 | "execution_count": 5, 101 | "metadata": {}, 102 | "output_type": "execute_result" 103 | } 104 | ], 105 | "source": [ 106 | "df = pd.read_excel('table 13-12.xlsx')\n", 107 | "df.head()" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 6, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stderr", 117 | "output_type": "stream", 118 | "text": [ 119 | "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in greater\n", 120 | " return (self.a < x) & (x < self.b)\n", 121 | "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in less\n", 122 | " return (self.a < x) & (x < self.b)\n", 123 | "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:1818: RuntimeWarning: invalid value encountered in less_equal\n", 124 | " cond2 = cond0 & (x <= self.a)\n" 125 | ] 126 | }, 127 | { 128 | "data": { 129 | "text/html": [ 130 | "
\n", 131 | "\n", 144 | "\n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | " \n", 177 | " \n", 178 | " \n", 179 | " \n", 180 | " \n", 181 | "
dfsum_sqmean_sqFPR(>F)
C(Chemical)3.018.0446.01466775.8948484.518310e-08
C(Fabric)4.06.6931.67325021.1135652.318913e-05
Residual12.00.9510.079250NaNNaN
\n", 182 | "
" 183 | ], 184 | "text/plain": [ 185 | " df sum_sq mean_sq F PR(>F)\n", 186 | "C(Chemical) 3.0 18.044 6.014667 75.894848 4.518310e-08\n", 187 | "C(Fabric) 4.0 6.693 1.673250 21.113565 2.318913e-05\n", 188 | "Residual 12.0 0.951 0.079250 NaN NaN" 189 | ] 190 | }, 191 | "execution_count": 6, 192 | "metadata": {}, 193 | "output_type": "execute_result" 194 | } 195 | ], 196 | "source": [ 197 | "res = smf.ols('Strength ~ C(Chemical) + C(Fabric)', data=df).fit()\n", 198 | "anova_lm(res)" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": null, 204 | "metadata": {}, 205 | "outputs": [], 206 | "source": [] 207 | } 208 | ], 209 | "metadata": { 210 | "kernelspec": { 211 | "display_name": "Python 3", 212 | "language": "python", 213 | "name": "python3" 214 | }, 215 | "language_info": { 216 | "codemirror_mode": { 217 | "name": "ipython", 218 | "version": 3 219 | }, 220 | "file_extension": ".py", 221 | "mimetype": "text/x-python", 222 | "name": "python", 223 | "nbconvert_exporter": "python", 224 | "pygments_lexer": "ipython3", 225 | "version": "3.6.3" 226 | } 227 | }, 228 | "nbformat": 4, 229 | "nbformat_minor": 2 230 | } 231 | -------------------------------------------------------------------------------- /statistics/linear_regression_indicator_vars.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Problemas 12-11 y 12-89" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import pandas as pd\n", 17 | "import statsmodels.formula.api as smf\n", 18 | "import matplotlib.pyplot as plt\n", 19 | "import numpy as np\n", 20 | "%matplotlib inline" 21 | ] 22 | }, 23 | { 24 | "cell_type": "code", 25 | "execution_count": 2, 26 | "metadata": {}, 27 | "outputs": [ 28 | { 29 | "data": { 30 | "text/html": [ 31 | "
\n", 32 | "\n", 45 | "\n", 46 | " \n", 47 | " \n", 48 | " \n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | " \n", 141 | " \n", 142 | " \n", 143 | " \n", 144 | " \n", 145 | " \n", 146 | " \n", 147 | " \n", 148 | " \n", 149 | " \n", 150 | " \n", 151 | " \n", 152 | " \n", 153 | " \n", 154 | " \n", 155 | " \n", 156 | " \n", 157 | " \n", 158 | " \n", 159 | " \n", 160 | " \n", 161 | " \n", 162 | " \n", 163 | " \n", 164 | " \n", 165 | " \n", 166 | " \n", 167 | " \n", 168 | " \n", 169 | " \n", 170 | " \n", 171 | " \n", 172 | " \n", 173 | " \n", 174 | " \n", 175 | " \n", 176 | "
mfrcarlinecartruckcidrhptrnsdrvodetwcmpaxlen/va/chccoco2mpgnv
020300C/SRT-8C215253L54245009.93.0730.9Y0.0110.0928830.830.9
120CARAVAN2WDT201180L4F245009.32.4932.3Y0.0140.1127432.532.3
220CROSSFIREROADSTERC196168L5R2337510.03.2737.1Y0.0010.0225035.437.1
320DAKOTAPICKUP2WDT226210L4R245009.23.5529.6Y0.0120.0431628.129.6
420DAKOTAPICKUP4WDT226210L44250009.23.5529.6Y0.0110.0536524.429.6
\n", 177 | "
" 178 | ], 179 | "text/plain": [ 180 | " mfr carline cartruck cid rhp trns drv od etw cmp axle \\\n", 181 | "0 20 300C/SRT-8 C 215 253 L5 4 2 4500 9.9 3.07 \n", 182 | "1 20 CARAVAN2WD T 201 180 L4 F 2 4500 9.3 2.49 \n", 183 | "2 20 CROSSFIREROADSTER C 196 168 L5 R 2 3375 10.0 3.27 \n", 184 | "3 20 DAKOTAPICKUP2WD T 226 210 L4 R 2 4500 9.2 3.55 \n", 185 | "4 20 DAKOTAPICKUP4WD T 226 210 L4 4 2 5000 9.2 3.55 \n", 186 | "\n", 187 | " n/v a/c hc co co2 mpg nv \n", 188 | "0 30.9 Y 0.011 0.09 288 30.8 30.9 \n", 189 | "1 32.3 Y 0.014 0.11 274 32.5 32.3 \n", 190 | "2 37.1 Y 0.001 0.02 250 35.4 37.1 \n", 191 | "3 29.6 Y 0.012 0.04 316 28.1 29.6 \n", 192 | "4 29.6 Y 0.011 0.05 365 24.4 29.6 " 193 | ] 194 | }, 195 | "execution_count": 2, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | } 199 | ], 200 | "source": [ 201 | "df = pd.read_excel('table 12-3.xlsx')\n", 202 | "df['nv'] = df['n/v']\n", 203 | "df.head()" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 3, 209 | "metadata": {}, 210 | "outputs": [ 211 | { 212 | "data": { 213 | "text/html": [ 214 | "\n", 215 | "\n", 216 | "\n", 217 | " \n", 218 | "\n", 219 | "\n", 220 | " \n", 221 | "\n", 222 | "\n", 223 | " \n", 224 | "\n", 225 | "\n", 226 | " \n", 227 | "\n", 228 | "\n", 229 | " \n", 230 | "\n", 231 | "\n", 232 | " \n", 233 | "\n", 234 | "\n", 235 | " \n", 236 | "\n", 237 | "\n", 238 | " \n", 239 | "\n", 240 | "\n", 241 | " \n", 242 | "\n", 243 | "
OLS Regression Results
Dep. Variable: mpg R-squared: 0.911
Model: OLS Adj. R-squared: 0.852
Method: Least Squares F-statistic: 15.38
Date: Thu, 09 Nov 2017 Prob (F-statistic): 3.26e-05
Time: 15:10:29 Log-Likelihood: -40.441
No. Observations: 21 AIC: 98.88
Df Residuals: 12 BIC: 108.3
Df Model: 8
Covariance Type: nonrobust
\n", 244 | "\n", 245 | "\n", 246 | " \n", 247 | "\n", 248 | "\n", 249 | " \n", 250 | "\n", 251 | "\n", 252 | " \n", 253 | "\n", 254 | "\n", 255 | " \n", 256 | "\n", 257 | "\n", 258 | " \n", 259 | "\n", 260 | "\n", 261 | " \n", 262 | "\n", 263 | "\n", 264 | " \n", 265 | "\n", 266 | "\n", 267 | " \n", 268 | "\n", 269 | "\n", 270 | " \n", 271 | "\n", 272 | "\n", 273 | " \n", 274 | "\n", 275 | "
coef std err t P>|t| [0.025 0.975]
Intercept 40.1560 21.300 1.885 0.084 -6.253 86.566
C(trns)[T.L5] 0.2290 1.519 0.151 0.883 -3.082 3.540
C(trns)[T.M6] -3.0605 2.479 -1.235 0.241 -8.462 2.340
cid -0.0012 0.028 -0.044 0.965 -0.062 0.059
rhp 0.0009 0.017 0.051 0.960 -0.036 0.038
etw -0.0041 0.001 -3.749 0.003 -0.006 -0.002
cmp 0.6537 1.755 0.373 0.716 -3.169 4.477
axle -2.5755 1.606 -1.604 0.135 -6.075 0.924
nv 0.3060 0.304 1.005 0.335 -0.357 0.969
\n", 276 | "\n", 277 | "\n", 278 | " \n", 279 | "\n", 280 | "\n", 281 | " \n", 282 | "\n", 283 | "\n", 284 | " \n", 285 | "\n", 286 | "\n", 287 | " \n", 288 | "\n", 289 | "
Omnibus: 5.036 Durbin-Watson: 1.873
Prob(Omnibus): 0.081 Jarque-Bera (JB): 3.370
Skew: -0.391 Prob(JB): 0.185
Kurtosis: 4.800 Cond. No. 1.97e+05
" 290 | ], 291 | "text/plain": [ 292 | "\n", 293 | "\"\"\"\n", 294 | " OLS Regression Results \n", 295 | "==============================================================================\n", 296 | "Dep. Variable: mpg R-squared: 0.911\n", 297 | "Model: OLS Adj. R-squared: 0.852\n", 298 | "Method: Least Squares F-statistic: 15.38\n", 299 | "Date: Thu, 09 Nov 2017 Prob (F-statistic): 3.26e-05\n", 300 | "Time: 15:10:29 Log-Likelihood: -40.441\n", 301 | "No. Observations: 21 AIC: 98.88\n", 302 | "Df Residuals: 12 BIC: 108.3\n", 303 | "Df Model: 8 \n", 304 | "Covariance Type: nonrobust \n", 305 | "=================================================================================\n", 306 | " coef std err t P>|t| [0.025 0.975]\n", 307 | "---------------------------------------------------------------------------------\n", 308 | "Intercept 40.1560 21.300 1.885 0.084 -6.253 86.566\n", 309 | "C(trns)[T.L5] 0.2290 1.519 0.151 0.883 -3.082 3.540\n", 310 | "C(trns)[T.M6] -3.0605 2.479 -1.235 0.241 -8.462 2.340\n", 311 | "cid -0.0012 0.028 -0.044 0.965 -0.062 0.059\n", 312 | "rhp 0.0009 0.017 0.051 0.960 -0.036 0.038\n", 313 | "etw -0.0041 0.001 -3.749 0.003 -0.006 -0.002\n", 314 | "cmp 0.6537 1.755 0.373 0.716 -3.169 4.477\n", 315 | "axle -2.5755 1.606 -1.604 0.135 -6.075 0.924\n", 316 | "nv 0.3060 0.304 1.005 0.335 -0.357 0.969\n", 317 | "==============================================================================\n", 318 | "Omnibus: 5.036 Durbin-Watson: 1.873\n", 319 | "Prob(Omnibus): 0.081 Jarque-Bera (JB): 3.370\n", 320 | "Skew: -0.391 Prob(JB): 0.185\n", 321 | "Kurtosis: 4.800 Cond. No. 1.97e+05\n", 322 | "==============================================================================\n", 323 | "\n", 324 | "Warnings:\n", 325 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", 326 | "[2] The condition number is large, 1.97e+05. This might indicate that there are\n", 327 | "strong multicollinearity or other numerical problems.\n", 328 | "\"\"\"" 329 | ] 330 | }, 331 | "execution_count": 3, 332 | "metadata": {}, 333 | "output_type": "execute_result" 334 | } 335 | ], 336 | "source": [ 337 | "modelo = smf.ols('mpg ~ cid + rhp + etw + cmp + axle + nv + C(trns)', data=df)\n", 338 | "resultado = modelo.fit()\n", 339 | "resultado.summary()" 340 | ] 341 | }, 342 | { 343 | "cell_type": "code", 344 | "execution_count": 4, 345 | "metadata": {}, 346 | "outputs": [], 347 | "source": [ 348 | "predic = resultado.get_prediction(exog={'cid': 215,\n", 349 | " 'rhp': 253,\n", 350 | " 'etw': 4500,\n", 351 | " 'cmp': 9.9,\n", 352 | " 'axle': 3.07,\n", 353 | " 'nv': 30.9,\n", 354 | " 'trns': 'M6'})" 355 | ] 356 | }, 357 | { 358 | "cell_type": "code", 359 | "execution_count": 5, 360 | "metadata": {}, 361 | "outputs": [ 362 | { 363 | "data": { 364 | "text/html": [ 365 | "
\n", 366 | "\n", 379 | "\n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | " \n", 392 | " \n", 393 | " \n", 394 | " \n", 395 | " \n", 396 | " \n", 397 | " \n", 398 | " \n", 399 | " \n", 400 | " \n", 401 | " \n", 402 | "
meanmean_semean_ci_lowermean_ci_upperobs_ci_lowerobs_ci_upper
026.6556692.85018920.44564132.86569718.81615134.495187
\n", 403 | "
" 404 | ], 405 | "text/plain": [ 406 | " mean mean_se mean_ci_lower mean_ci_upper obs_ci_lower \\\n", 407 | "0 26.655669 2.850189 20.445641 32.865697 18.816151 \n", 408 | "\n", 409 | " obs_ci_upper \n", 410 | "0 34.495187 " 411 | ] 412 | }, 413 | "execution_count": 5, 414 | "metadata": {}, 415 | "output_type": "execute_result" 416 | } 417 | ], 418 | "source": [ 419 | "predic.summary_frame()" 420 | ] 421 | } 422 | ], 423 | "metadata": { 424 | "kernelspec": { 425 | "display_name": "Python 3", 426 | "language": "python", 427 | "name": "python3" 428 | }, 429 | "language_info": { 430 | "codemirror_mode": { 431 | "name": "ipython", 432 | "version": 3 433 | }, 434 | "file_extension": ".py", 435 | "mimetype": "text/x-python", 436 | "name": "python", 437 | "nbconvert_exporter": "python", 438 | "pygments_lexer": "ipython3", 439 | "version": "3.6.2" 440 | } 441 | }, 442 | "nbformat": 4, 443 | "nbformat_minor": 2 444 | } 445 | -------------------------------------------------------------------------------- /statistics/2k_design_center_point.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Para ocultar los warnings\n", 10 | "import warnings\n", 11 | "warnings.filterwarnings('ignore')" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 2, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import pandas as pd\n", 21 | "import statsmodels.formula.api as smf\n", 22 | "from statsmodels.stats.anova import anova_lm\n", 23 | "from statsmodels.graphics.factorplots import interaction_plot\n", 24 | "import matplotlib.pyplot as plt\n", 25 | "import numpy as np\n", 26 | "import scipy.stats as st\n", 27 | "%matplotlib inline" 28 | ] 29 | }, 30 | { 31 | "cell_type": "markdown", 32 | "metadata": {}, 33 | "source": [ 34 | "# Example 14-6\n", 35 | "A chemical engineer is studying the percentage of conversion or yield of a process. \n", 36 | "There are two variables of interest, reaction time and reaction temperature. Because she is uncertain \n", 37 | "about the assumption of linearity over the region of exploration, the engineer decides to conduct a $2^2$ design (with a single \n", 38 | "replicate of each factorial run) augmented with five center points. The design and the yield data are shown in Fig. 14-27.\n", 39 | "Table 14-22 summarizes the analysis for this experiment. The mean square error is calculated from the center points \n", 40 | "as follows:" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 3, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "data": { 50 | "text/html": [ 51 | "
\n", 52 | "\n", 65 | "\n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | " \n", 134 | " \n", 135 | " \n", 136 | " \n", 137 | " \n", 138 | " \n", 139 | " \n", 140 | "
ABCurResp
000center40.3
100center40.5
200center40.7
300center40.2
400center40.6
511not41.5
61-1not40.9
7-11not40.0
8-1-1not39.3
\n", 141 | "
" 142 | ], 143 | "text/plain": [ 144 | " A B Cur Resp\n", 145 | "0 0 0 center 40.3\n", 146 | "1 0 0 center 40.5\n", 147 | "2 0 0 center 40.7\n", 148 | "3 0 0 center 40.2\n", 149 | "4 0 0 center 40.6\n", 150 | "5 1 1 not 41.5\n", 151 | "6 1 -1 not 40.9\n", 152 | "7 -1 1 not 40.0\n", 153 | "8 -1 -1 not 39.3" 154 | ] 155 | }, 156 | "execution_count": 3, 157 | "metadata": {}, 158 | "output_type": "execute_result" 159 | } 160 | ], 161 | "source": [ 162 | "df = pd.read_excel('2k center.xlsx')\n", 163 | "df" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 4, 169 | "metadata": {}, 170 | "outputs": [ 171 | { 172 | "data": { 173 | "text/html": [ 174 | "\n", 175 | "\n", 176 | "\n", 177 | " \n", 178 | "\n", 179 | "\n", 180 | " \n", 181 | "\n", 182 | "\n", 183 | " \n", 184 | "\n", 185 | "\n", 186 | " \n", 187 | "\n", 188 | "\n", 189 | " \n", 190 | "\n", 191 | "\n", 192 | " \n", 193 | "\n", 194 | "\n", 195 | " \n", 196 | "\n", 197 | "\n", 198 | " \n", 199 | "\n", 200 | "\n", 201 | " \n", 202 | "\n", 203 | "
OLS Regression Results
Dep. Variable: Resp R-squared: 0.943
Model: OLS Adj. R-squared: 0.885
Method: Least Squares F-statistic: 16.45
Date: Thu, 14 Dec 2017 Prob (F-statistic): 0.00947
Time: 13:39:52 Log-Likelihood: 5.0382
No. Observations: 9 AIC: -0.07647
Df Residuals: 4 BIC: 0.9096
Df Model: 4
Covariance Type: nonrobust
\n", 204 | "\n", 205 | "\n", 206 | " \n", 207 | "\n", 208 | "\n", 209 | " \n", 210 | "\n", 211 | "\n", 212 | " \n", 213 | "\n", 214 | "\n", 215 | " \n", 216 | "\n", 217 | "\n", 218 | " \n", 219 | "\n", 220 | "\n", 221 | " \n", 222 | "\n", 223 | "
coef std err t P>|t| [0.025 0.975]
Intercept 40.4600 0.093 436.291 0.000 40.203 40.717
C(Cur)[T.not] -0.0350 0.139 -0.252 0.814 -0.421 0.351
A 0.7750 0.104 7.475 0.002 0.487 1.063
B 0.3250 0.104 3.135 0.035 0.037 0.613
A:B -0.0250 0.104 -0.241 0.821 -0.313 0.263
\n", 224 | "\n", 225 | "\n", 226 | " \n", 227 | "\n", 228 | "\n", 229 | " \n", 230 | "\n", 231 | "\n", 232 | " \n", 233 | "\n", 234 | "\n", 235 | " \n", 236 | "\n", 237 | "
Omnibus: 0.506 Durbin-Watson: 2.963
Prob(Omnibus): 0.777 Jarque-Bera (JB): 0.098
Skew: -0.212 Prob(JB): 0.952
Kurtosis: 2.717 Cond. No. 2.51
" 238 | ], 239 | "text/plain": [ 240 | "\n", 241 | "\"\"\"\n", 242 | " OLS Regression Results \n", 243 | "==============================================================================\n", 244 | "Dep. Variable: Resp R-squared: 0.943\n", 245 | "Model: OLS Adj. R-squared: 0.885\n", 246 | "Method: Least Squares F-statistic: 16.45\n", 247 | "Date: Thu, 14 Dec 2017 Prob (F-statistic): 0.00947\n", 248 | "Time: 13:39:52 Log-Likelihood: 5.0382\n", 249 | "No. Observations: 9 AIC: -0.07647\n", 250 | "Df Residuals: 4 BIC: 0.9096\n", 251 | "Df Model: 4 \n", 252 | "Covariance Type: nonrobust \n", 253 | "=================================================================================\n", 254 | " coef std err t P>|t| [0.025 0.975]\n", 255 | "---------------------------------------------------------------------------------\n", 256 | "Intercept 40.4600 0.093 436.291 0.000 40.203 40.717\n", 257 | "C(Cur)[T.not] -0.0350 0.139 -0.252 0.814 -0.421 0.351\n", 258 | "A 0.7750 0.104 7.475 0.002 0.487 1.063\n", 259 | "B 0.3250 0.104 3.135 0.035 0.037 0.613\n", 260 | "A:B -0.0250 0.104 -0.241 0.821 -0.313 0.263\n", 261 | "==============================================================================\n", 262 | "Omnibus: 0.506 Durbin-Watson: 2.963\n", 263 | "Prob(Omnibus): 0.777 Jarque-Bera (JB): 0.098\n", 264 | "Skew: -0.212 Prob(JB): 0.952\n", 265 | "Kurtosis: 2.717 Cond. No. 2.51\n", 266 | "==============================================================================\n", 267 | "\n", 268 | "Warnings:\n", 269 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", 270 | "\"\"\"" 271 | ] 272 | }, 273 | "execution_count": 4, 274 | "metadata": {}, 275 | "output_type": "execute_result" 276 | } 277 | ], 278 | "source": [ 279 | "re = smf.ols('Resp ~ A*B + C(Cur)', data=df).fit()\n", 280 | "re.summary()" 281 | ] 282 | }, 283 | { 284 | "cell_type": "code", 285 | "execution_count": 5, 286 | "metadata": {}, 287 | "outputs": [ 288 | { 289 | "data": { 290 | "text/html": [ 291 | "
\n", 292 | "\n", 305 | "\n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | "
dfsum_sqmean_sqFPR(>F)
C(Cur)1.00.0027220.0027220.0633070.813741
A1.02.4025002.40250055.8720930.001713
B1.00.4225000.4225009.8255810.035030
A:B1.00.0025000.0025000.0581400.821316
Residual4.00.1720000.043000NaNNaN
\n", 359 | "
" 360 | ], 361 | "text/plain": [ 362 | " df sum_sq mean_sq F PR(>F)\n", 363 | "C(Cur) 1.0 0.002722 0.002722 0.063307 0.813741\n", 364 | "A 1.0 2.402500 2.402500 55.872093 0.001713\n", 365 | "B 1.0 0.422500 0.422500 9.825581 0.035030\n", 366 | "A:B 1.0 0.002500 0.002500 0.058140 0.821316\n", 367 | "Residual 4.0 0.172000 0.043000 NaN NaN" 368 | ] 369 | }, 370 | "execution_count": 5, 371 | "metadata": {}, 372 | "output_type": "execute_result" 373 | } 374 | ], 375 | "source": [ 376 | "anova_lm(re)" 377 | ] 378 | }, 379 | { 380 | "cell_type": "code", 381 | "execution_count": 6, 382 | "metadata": {}, 383 | "outputs": [ 384 | { 385 | "data": { 386 | "text/html": [ 387 | "\n", 388 | "\n", 389 | "\n", 390 | " \n", 391 | "\n", 392 | "\n", 393 | " \n", 394 | "\n", 395 | "\n", 396 | " \n", 397 | "\n", 398 | "\n", 399 | " \n", 400 | "\n", 401 | "\n", 402 | " \n", 403 | "\n", 404 | "\n", 405 | " \n", 406 | "\n", 407 | "\n", 408 | " \n", 409 | "\n", 410 | "\n", 411 | " \n", 412 | "\n", 413 | "\n", 414 | " \n", 415 | "\n", 416 | "
OLS Regression Results
Dep. Variable: Resp R-squared: 0.941
Model: OLS Adj. R-squared: 0.921
Method: Least Squares F-statistic: 47.82
Date: Thu, 14 Dec 2017 Prob (F-statistic): 0.000206
Time: 13:39:52 Log-Likelihood: 4.9036
No. Observations: 9 AIC: -3.807
Df Residuals: 6 BIC: -3.216
Df Model: 2
Covariance Type: nonrobust
\n", 417 | "\n", 418 | "\n", 419 | " \n", 420 | "\n", 421 | "\n", 422 | " \n", 423 | "\n", 424 | "\n", 425 | " \n", 426 | "\n", 427 | "\n", 428 | " \n", 429 | "\n", 430 | "
coef std err t P>|t| [0.025 0.975]
Intercept 40.4444 0.057 705.987 0.000 40.304 40.585
A 0.7750 0.086 9.019 0.000 0.565 0.985
B 0.3250 0.086 3.782 0.009 0.115 0.535
\n", 431 | "\n", 432 | "\n", 433 | " \n", 434 | "\n", 435 | "\n", 436 | " \n", 437 | "\n", 438 | "\n", 439 | " \n", 440 | "\n", 441 | "\n", 442 | " \n", 443 | "\n", 444 | "
Omnibus: 0.188 Durbin-Watson: 3.019
Prob(Omnibus): 0.910 Jarque-Bera (JB): 0.098
Skew: 0.114 Prob(JB): 0.952
Kurtosis: 2.543 Cond. No. 1.50
" 445 | ], 446 | "text/plain": [ 447 | "\n", 448 | "\"\"\"\n", 449 | " OLS Regression Results \n", 450 | "==============================================================================\n", 451 | "Dep. Variable: Resp R-squared: 0.941\n", 452 | "Model: OLS Adj. R-squared: 0.921\n", 453 | "Method: Least Squares F-statistic: 47.82\n", 454 | "Date: Thu, 14 Dec 2017 Prob (F-statistic): 0.000206\n", 455 | "Time: 13:39:52 Log-Likelihood: 4.9036\n", 456 | "No. Observations: 9 AIC: -3.807\n", 457 | "Df Residuals: 6 BIC: -3.216\n", 458 | "Df Model: 2 \n", 459 | "Covariance Type: nonrobust \n", 460 | "==============================================================================\n", 461 | " coef std err t P>|t| [0.025 0.975]\n", 462 | "------------------------------------------------------------------------------\n", 463 | "Intercept 40.4444 0.057 705.987 0.000 40.304 40.585\n", 464 | "A 0.7750 0.086 9.019 0.000 0.565 0.985\n", 465 | "B 0.3250 0.086 3.782 0.009 0.115 0.535\n", 466 | "==============================================================================\n", 467 | "Omnibus: 0.188 Durbin-Watson: 3.019\n", 468 | "Prob(Omnibus): 0.910 Jarque-Bera (JB): 0.098\n", 469 | "Skew: 0.114 Prob(JB): 0.952\n", 470 | "Kurtosis: 2.543 Cond. No. 1.50\n", 471 | "==============================================================================\n", 472 | "\n", 473 | "Warnings:\n", 474 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", 475 | "\"\"\"" 476 | ] 477 | }, 478 | "execution_count": 6, 479 | "metadata": {}, 480 | "output_type": "execute_result" 481 | } 482 | ], 483 | "source": [ 484 | "re = smf.ols('Resp ~ A + B', data=df).fit()\n", 485 | "re.summary()" 486 | ] 487 | }, 488 | { 489 | "cell_type": "code", 490 | "execution_count": 7, 491 | "metadata": {}, 492 | "outputs": [ 493 | { 494 | "data": { 495 | "text/html": [ 496 | "
\n", 497 | "\n", 510 | "\n", 511 | " \n", 512 | " \n", 513 | " \n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | " \n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | "
dfsum_sqmean_sqFPR(>F)
A1.02.4025002.40250081.3385580.000104
B1.00.4225000.42250014.3040750.009158
Residual6.00.1772220.029537NaNNaN
\n", 548 | "
" 549 | ], 550 | "text/plain": [ 551 | " df sum_sq mean_sq F PR(>F)\n", 552 | "A 1.0 2.402500 2.402500 81.338558 0.000104\n", 553 | "B 1.0 0.422500 0.422500 14.304075 0.009158\n", 554 | "Residual 6.0 0.177222 0.029537 NaN NaN" 555 | ] 556 | }, 557 | "execution_count": 7, 558 | "metadata": {}, 559 | "output_type": "execute_result" 560 | } 561 | ], 562 | "source": [ 563 | "anova_lm(re)" 564 | ] 565 | } 566 | ], 567 | "metadata": { 568 | "kernelspec": { 569 | "display_name": "Python 3", 570 | "language": "python", 571 | "name": "python3" 572 | }, 573 | "language_info": { 574 | "codemirror_mode": { 575 | "name": "ipython", 576 | "version": 3 577 | }, 578 | "file_extension": ".py", 579 | "mimetype": "text/x-python", 580 | "name": "python", 581 | "nbconvert_exporter": "python", 582 | "pygments_lexer": "ipython3", 583 | "version": "3.5.4" 584 | } 585 | }, 586 | "nbformat": 4, 587 | "nbformat_minor": 2 588 | } 589 | -------------------------------------------------------------------------------- /optimization/tsp-gurobi.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# TSP: Traveling Salesman Problem\n", 8 | "## El problema del vendedor viajero (usando GUROBI)\n", 9 | "- Sea $C$ el conjunto de ciudades que se deben visitar, con $C=\\{0,...,n-1\\}$.\n", 10 | "- Sea $E$ el conjunto de arcos o links que unen a las ciudades, con $E=\\{(i,j)\\in C^2 : i\\neq j\\}$.\n", 11 | "- Sea $x_{(i,j)}$ una variable binaria que es igual a 1 cuando se viaja de forma directa desde la ciudad $i$ a la ciudad $j$, con $(i,j)\\in E$, y es igual cero en caso contrario.\n", 12 | "- Sea $d_e$ la distancia del arco $e\\in E$.\n", 13 | "\n", 14 | "Luego, el problema a optimizar es el siguiente:\n", 15 | "$$\\begin{align}\n", 16 | "\\min \\quad & \\sum_{e\\in E} d_e x_e \\\\\n", 17 | "\\text{s.t.} \\quad & \\sum_{e=(i,j)\\in E} x_e = 1 &&\\forall i \\in C \\\\\n", 18 | " & \\sum_{e=(i,j)\\in E} x_e = 1 && \\forall j \\in C \\\\\n", 19 | " & u_i + 1 \\leq u_j + M(1-x_{ij})&& \\forall (i,j)\\in E : j\\neq 0 \\\\\n", 20 | " & x_e \\in \\{0,1\\} && \\forall (i,j)\\in E\\\\\n", 21 | " & u_i \\geq 0 && \\forall i \\in C\n", 22 | "\\end{align}$$" 23 | ] 24 | }, 25 | { 26 | "cell_type": "code", 27 | "execution_count": 1, 28 | "metadata": {}, 29 | "outputs": [], 30 | "source": [ 31 | "import numpy as np\n", 32 | "import gurobipy as gu\n", 33 | "from gurobipy import Model, GRB, quicksum\n", 34 | "import matplotlib.pyplot as plt\n", 35 | "%matplotlib inline" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "execution_count": 2, 41 | "metadata": {}, 42 | "outputs": [], 43 | "source": [ 44 | "n = 10\n", 45 | "ciudades = [i for i in range(n)]" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 3, 51 | "metadata": {}, 52 | "outputs": [], 53 | "source": [ 54 | "arcos = [(i, j) for i in ciudades for j in ciudades if i != j]" 55 | ] 56 | }, 57 | { 58 | "cell_type": "code", 59 | "execution_count": 4, 60 | "metadata": {}, 61 | "outputs": [], 62 | "source": [ 63 | "rnd = np.random\n", 64 | "rnd.seed(1)\n", 65 | "coord_x = rnd.rand(n) * 100\n", 66 | "coord_y = rnd.rand(n) * 100\n", 67 | "distancia = {(i, j): np.hypot(coord_x[i] - coord_x[j], coord_y[i] - coord_y[j])\n", 68 | " for i, j in arcos}" 69 | ] 70 | }, 71 | { 72 | "cell_type": "code", 73 | "execution_count": 5, 74 | "metadata": {}, 75 | "outputs": [], 76 | "source": [ 77 | "mdl = Model('TSP')" 78 | ] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "execution_count": 6, 83 | "metadata": {}, 84 | "outputs": [], 85 | "source": [ 86 | "x = mdl.addVars(arcos, vtype=GRB.BINARY, name='x')\n", 87 | "u = mdl.addVars(ciudades, vtype=GRB.CONTINUOUS, name='u')" 88 | ] 89 | }, 90 | { 91 | "cell_type": "markdown", 92 | "metadata": {}, 93 | "source": [ 94 | "$$\\min \\sum_{e\\in E} d_e x_e$$" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 7, 100 | "metadata": {}, 101 | "outputs": [], 102 | "source": [ 103 | "mdl.setObjective(quicksum(distancia[e] * x[e] for e in arcos), GRB.MINIMIZE)" 104 | ] 105 | }, 106 | { 107 | "cell_type": "markdown", 108 | "metadata": {}, 109 | "source": [ 110 | "$$\\sum_{e=(i,j)\\in E} x_e = 1 \\quad \\forall i \\in C$$" 111 | ] 112 | }, 113 | { 114 | "cell_type": "code", 115 | "execution_count": 8, 116 | "metadata": {}, 117 | "outputs": [], 118 | "source": [ 119 | "for c in ciudades:\n", 120 | " mdl.addConstr(quicksum(x[(i,j)] for i,j in arcos if i==c)==1, name='out_%d'%c)" 121 | ] 122 | }, 123 | { 124 | "cell_type": "markdown", 125 | "metadata": {}, 126 | "source": [ 127 | "$$\\sum_{e=(i,j)\\in E} x_e = 1 \\quad \\forall j \\in C $$" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 9, 133 | "metadata": {}, 134 | "outputs": [], 135 | "source": [ 136 | "for c in ciudades:\n", 137 | " mdl.addConstr(quicksum(x[(i,j)] for i,j in arcos if j==c)==1, name='in_%d'%c)" 138 | ] 139 | }, 140 | { 141 | "cell_type": "markdown", 142 | "metadata": {}, 143 | "source": [ 144 | "$$u_i + 1 \\leq u_j + M(1-x_{ij}) \\quad \\forall (i,j)\\in E : j\\neq 0$$" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 10, 150 | "metadata": {}, 151 | "outputs": [], 152 | "source": [ 153 | "for i, j in arcos:\n", 154 | " if j!=0:\n", 155 | " mdl.addConstr((x[(i, j)] == 1) >> (u[i] + 1 == u[j]), name='order_(%d,_%d)'%(i, j))" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 11, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "data": { 165 | "text/plain": [ 166 | "[0, 7, 6, 5, 3, 1, 9, 8, 4, 2]" 167 | ] 168 | }, 169 | "execution_count": 11, 170 | "metadata": {}, 171 | "output_type": "execute_result" 172 | } 173 | ], 174 | "source": [ 175 | "tour = [0]\n", 176 | "while len(tour) < n:\n", 177 | " k = tour[-1]\n", 178 | " new_dist = {(i, j): d for (i,j), d in distancia.items()\n", 179 | " if i==k and j not in tour}\n", 180 | " (i, j) = min(new_dist, key=new_dist.get)\n", 181 | " tour.append(j)\n", 182 | "tour" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 12, 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [ 191 | "for g in range(n):\n", 192 | " i = tour[g - 1]\n", 193 | " j = tour[g]\n", 194 | " x[(i,j)].start = 1" 195 | ] 196 | }, 197 | { 198 | "cell_type": "code", 199 | "execution_count": 13, 200 | "metadata": {}, 201 | "outputs": [ 202 | { 203 | "name": "stdout", 204 | "output_type": "stream", 205 | "text": [ 206 | "Changed value of parameter timeLimit to 60.0\n", 207 | " Prev: 1e+100 Min: 0.0 Max: 1e+100 Default: 1e+100\n", 208 | "Changed value of parameter MIPGap to 0.2\n", 209 | " Prev: 0.0001 Min: 0.0 Max: 1e+100 Default: 0.0001\n", 210 | "Optimize a model with 20 rows, 100 columns and 180 nonzeros\n", 211 | "Model has 81 general constraints\n", 212 | "Variable types: 10 continuous, 90 integer (90 binary)\n", 213 | "Coefficient statistics:\n", 214 | " Matrix range [1e+00, 1e+00]\n", 215 | " Objective range [2e+01, 9e+01]\n", 216 | " Bounds range [1e+00, 1e+00]\n", 217 | " RHS range [1e+00, 1e+00]\n", 218 | "\n", 219 | "Loaded MIP start with objective 304.182 (0.02s)\n", 220 | "MIP start did not produce a new incumbent solution\n", 221 | "\n", 222 | "Presolve added 81 rows and 81 columns\n", 223 | "Presolve time: 0.00s\n", 224 | "Presolved: 101 rows, 181 columns, 423 nonzeros\n", 225 | "Presolved model has 81 SOS constraint(s)\n", 226 | "Variable types: 91 continuous, 90 integer (90 binary)\n", 227 | "\n", 228 | "Root relaxation: objective 2.540685e+02, 15 iterations, 0.00 seconds\n", 229 | "\n", 230 | " Nodes | Current Node | Objective Bounds | Work\n", 231 | " Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time\n", 232 | "\n", 233 | " 0 0 254.06854 0 9 304.18208 254.06854 16.5% - 0s\n", 234 | "\n", 235 | "Explored 1 nodes (15 simplex iterations) in 0.05 seconds\n", 236 | "Thread count was 4 (of 4 available processors)\n", 237 | "\n", 238 | "Solution count 1: 304.182 \n", 239 | "\n", 240 | "Optimal solution found (tolerance 2.00e-01)\n", 241 | "Best objective 3.041820789791e+02, best bound 2.540685436003e+02, gap 16.4748%\n" 242 | ] 243 | } 244 | ], 245 | "source": [ 246 | "mdl.Params.timeLimit = 60\n", 247 | "mdl.Params.MIPGap = 0.2\n", 248 | "mdl.optimize()" 249 | ] 250 | }, 251 | { 252 | "cell_type": "code", 253 | "execution_count": 14, 254 | "metadata": { 255 | "scrolled": true 256 | }, 257 | "outputs": [ 258 | { 259 | "data": { 260 | "text/plain": [ 261 | "({(0, 1): ,\n", 262 | " (0, 2): ,\n", 263 | " (0, 3): ,\n", 264 | " (0, 4): ,\n", 265 | " (0, 5): ,\n", 266 | " (0, 6): ,\n", 267 | " (0, 7): ,\n", 268 | " (0, 8): ,\n", 269 | " (0, 9): ,\n", 270 | " (1, 0): ,\n", 271 | " (1, 2): ,\n", 272 | " (1, 3): ,\n", 273 | " (1, 4): ,\n", 274 | " (1, 5): ,\n", 275 | " (1, 6): ,\n", 276 | " (1, 7): ,\n", 277 | " (1, 8): ,\n", 278 | " (1, 9): ,\n", 279 | " (2, 0): ,\n", 280 | " (2, 1): ,\n", 281 | " (2, 3): ,\n", 282 | " (2, 4): ,\n", 283 | " (2, 5): ,\n", 284 | " (2, 6): ,\n", 285 | " (2, 7): ,\n", 286 | " (2, 8): ,\n", 287 | " (2, 9): ,\n", 288 | " (3, 0): ,\n", 289 | " (3, 1): ,\n", 290 | " (3, 2): ,\n", 291 | " (3, 4): ,\n", 292 | " (3, 5): ,\n", 293 | " (3, 6): ,\n", 294 | " (3, 7): ,\n", 295 | " (3, 8): ,\n", 296 | " (3, 9): ,\n", 297 | " (4, 0): ,\n", 298 | " (4, 1): ,\n", 299 | " (4, 2): ,\n", 300 | " (4, 3): ,\n", 301 | " (4, 5): ,\n", 302 | " (4, 6): ,\n", 303 | " (4, 7): ,\n", 304 | " (4, 8): ,\n", 305 | " (4, 9): ,\n", 306 | " (5, 0): ,\n", 307 | " (5, 1): ,\n", 308 | " (5, 2): ,\n", 309 | " (5, 3): ,\n", 310 | " (5, 4): ,\n", 311 | " (5, 6): ,\n", 312 | " (5, 7): ,\n", 313 | " (5, 8): ,\n", 314 | " (5, 9): ,\n", 315 | " (6, 0): ,\n", 316 | " (6, 1): ,\n", 317 | " (6, 2): ,\n", 318 | " (6, 3): ,\n", 319 | " (6, 4): ,\n", 320 | " (6, 5): ,\n", 321 | " (6, 7): ,\n", 322 | " (6, 8): ,\n", 323 | " (6, 9): ,\n", 324 | " (7, 0): ,\n", 325 | " (7, 1): ,\n", 326 | " (7, 2): ,\n", 327 | " (7, 3): ,\n", 328 | " (7, 4): ,\n", 329 | " (7, 5): ,\n", 330 | " (7, 6): ,\n", 331 | " (7, 8): ,\n", 332 | " (7, 9): ,\n", 333 | " (8, 0): ,\n", 334 | " (8, 1): ,\n", 335 | " (8, 2): ,\n", 336 | " (8, 3): ,\n", 337 | " (8, 4): ,\n", 338 | " (8, 5): ,\n", 339 | " (8, 6): ,\n", 340 | " (8, 7): ,\n", 341 | " (8, 9): ,\n", 342 | " (9, 0): ,\n", 343 | " (9, 1): ,\n", 344 | " (9, 2): ,\n", 345 | " (9, 3): ,\n", 346 | " (9, 4): ,\n", 347 | " (9, 5): ,\n", 348 | " (9, 6): ,\n", 349 | " (9, 7): ,\n", 350 | " (9, 8): },\n", 351 | " {0: ,\n", 352 | " 1: ,\n", 353 | " 2: ,\n", 354 | " 3: ,\n", 355 | " 4: ,\n", 356 | " 5: ,\n", 357 | " 6: ,\n", 358 | " 7: ,\n", 359 | " 8: ,\n", 360 | " 9: })" 361 | ] 362 | }, 363 | "execution_count": 14, 364 | "metadata": {}, 365 | "output_type": "execute_result" 366 | } 367 | ], 368 | "source": [ 369 | "x, u" 370 | ] 371 | }, 372 | { 373 | "cell_type": "code", 374 | "execution_count": 15, 375 | "metadata": {}, 376 | "outputs": [ 377 | { 378 | "data": { 379 | "image/png": "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\nYII=\n", 380 | "text/plain": [ 381 | "" 382 | ] 383 | }, 384 | "metadata": {}, 385 | "output_type": "display_data" 386 | } 387 | ], 388 | "source": [ 389 | "arcos_activos = [e for e in arcos if x[e].x > 0.9]\n", 390 | "for i,j in arcos_activos:\n", 391 | " plt.plot([coord_x[i],coord_x[j]],[coord_y[i],coord_y[j]],\n", 392 | " color='b', alpha=0.4, zorder=0)\n", 393 | "plt.scatter(x=coord_x, y=coord_y, color='r', zorder=1)\n", 394 | "for i in ciudades:\n", 395 | " plt.annotate(i,(coord_x[i]+1,coord_y[i]+1))\n", 396 | "plt.xlim((0,100))\n", 397 | "plt.ylim((0,100))\n", 398 | "plt.show()" 399 | ] 400 | } 401 | ], 402 | "metadata": { 403 | "kernelspec": { 404 | "display_name": "Python 3", 405 | "language": "python", 406 | "name": "python3" 407 | }, 408 | "language_info": { 409 | "codemirror_mode": { 410 | "name": "ipython", 411 | "version": 3 412 | }, 413 | "file_extension": ".py", 414 | "mimetype": "text/x-python", 415 | "name": "python", 416 | "nbconvert_exporter": "python", 417 | "pygments_lexer": "ipython3", 418 | "version": "3.6.2" 419 | } 420 | }, 421 | "nbformat": 4, 422 | "nbformat_minor": 2 423 | } 424 | -------------------------------------------------------------------------------- /statistics/goodness_of_fit.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Pruebas de Bondad de Ajuste" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 12, 13 | "metadata": { 14 | "collapsed": true 15 | }, 16 | "outputs": [], 17 | "source": [ 18 | "import scipy.stats as st\n", 19 | "import pandas as pd\n", 20 | "import numpy as np\n", 21 | "%matplotlib inline" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 13, 27 | "metadata": { 28 | "scrolled": true 29 | }, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "text/html": [ 34 | "
\n", 35 | "\n", 48 | "\n", 49 | " \n", 50 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | "
obstiempo
010.25
120.10
230.08
340.01
451.17
\n", 84 | "
" 85 | ], 86 | "text/plain": [ 87 | " obs tiempo\n", 88 | "0 1 0.25\n", 89 | "1 2 0.10\n", 90 | "2 3 0.08\n", 91 | "3 4 0.01\n", 92 | "4 5 1.17" 93 | ] 94 | }, 95 | "execution_count": 13, 96 | "metadata": {}, 97 | "output_type": "execute_result" 98 | } 99 | ], 100 | "source": [ 101 | "excel_data = pd.read_excel('interarrival_times.xlsx')\n", 102 | "excel_data.head()" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 14, 108 | "metadata": {}, 109 | "outputs": [ 110 | { 111 | "data": { 112 | "text/plain": [ 113 | "[]" 114 | ] 115 | }, 116 | "execution_count": 14, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | }, 120 | { 121 | "data": { 122 | "image/png": "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\n", 123 | "text/plain": [ 124 | "" 125 | ] 126 | }, 127 | "metadata": {}, 128 | "output_type": "display_data" 129 | } 130 | ], 131 | "source": [ 132 | "times = excel_data['tiempo']\n", 133 | "histogram = times.hist(normed=True)\n", 134 | "val = np.linspace(times.min(),times.max(),1000)\n", 135 | "histogram.plot(val,st.expon(scale=times.mean()).pdf(val))" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "metadata": {}, 141 | "source": [ 142 | "## $\\chi^2$ test" 143 | ] 144 | }, 145 | { 146 | "cell_type": "code", 147 | "execution_count": 15, 148 | "metadata": {}, 149 | "outputs": [ 150 | { 151 | "data": { 152 | "text/plain": [ 153 | "[0.0,\n", 154 | " 0.053254026629341568,\n", 155 | " 0.11473128862072392,\n", 156 | " 0.18744345652202071,\n", 157 | " 0.27643595776303931,\n", 158 | " 0.39116724638376321,\n", 159 | " 0.55287191552607862,\n", 160 | " 0.82930787328911781,\n", 161 | " inf]" 162 | ] 163 | }, 164 | "execution_count": 15, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "x = st.expon(scale=times.mean())\n", 171 | "k = 8\n", 172 | "a = [x.ppf(0)]\n", 173 | "for j in range(1, k + 1):\n", 174 | " a.append(x.ppf(j / k))\n", 175 | "a" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 16, 181 | "metadata": {}, 182 | "outputs": [ 183 | { 184 | "data": { 185 | "text/plain": [ 186 | "array([29, 34, 18, 29, 22, 34, 23, 30], dtype=int64)" 187 | ] 188 | }, 189 | "execution_count": 16, 190 | "metadata": {}, 191 | "output_type": "execute_result" 192 | } 193 | ], 194 | "source": [ 195 | "frec_obs, _ = np.histogram(times, bins=a)\n", 196 | "frec_obs" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 17, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "data": { 206 | "text/plain": [ 207 | "Power_divergenceResult(statistic=8.6164383561643838, pvalue=0.28137921388956866)" 208 | ] 209 | }, 210 | "execution_count": 17, 211 | "metadata": {}, 212 | "output_type": "execute_result" 213 | } 214 | ], 215 | "source": [ 216 | "st.chisquare(frec_obs)" 217 | ] 218 | }, 219 | { 220 | "cell_type": "markdown", 221 | "metadata": {}, 222 | "source": [ 223 | "## K-S Test" 224 | ] 225 | }, 226 | { 227 | "cell_type": "code", 228 | "execution_count": 18, 229 | "metadata": {}, 230 | "outputs": [ 231 | { 232 | "data": { 233 | "text/plain": [ 234 | "[]" 235 | ] 236 | }, 237 | "execution_count": 18, 238 | "metadata": {}, 239 | "output_type": "execute_result" 240 | }, 241 | { 242 | "data": { 243 | "image/png": "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\nfoBeOFLoAAAAAElFTkSuQmCC\n", 244 | "text/plain": [ 245 | "" 246 | ] 247 | }, 248 | "metadata": {}, 249 | "output_type": "display_data" 250 | } 251 | ], 252 | "source": [ 253 | "cum_hist = times.hist(normed=True, cumulative=1, bins=200)\n", 254 | "cum_hist.plot(val,x.cdf(val))" 255 | ] 256 | }, 257 | { 258 | "cell_type": "code", 259 | "execution_count": 19, 260 | "metadata": {}, 261 | "outputs": [ 262 | { 263 | "data": { 264 | "text/plain": [ 265 | "KstestResult(statistic=0.047253060906787214, pvalue=0.7291757713333693)" 266 | ] 267 | }, 268 | "execution_count": 19, 269 | "metadata": {}, 270 | "output_type": "execute_result" 271 | } 272 | ], 273 | "source": [ 274 | "st.kstest(times, x.cdf)" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 20, 280 | "metadata": { 281 | "scrolled": true 282 | }, 283 | "outputs": [ 284 | { 285 | "data": { 286 | "text/plain": [ 287 | "KstestResult(statistic=0.047253060906787214, pvalue=0.7291757713333693)" 288 | ] 289 | }, 290 | "execution_count": 20, 291 | "metadata": {}, 292 | "output_type": "execute_result" 293 | } 294 | ], 295 | "source": [ 296 | "st.kstest(times, 'expon', args=(0, times.mean()))" 297 | ] 298 | }, 299 | { 300 | "cell_type": "markdown", 301 | "metadata": {}, 302 | "source": [ 303 | "## A-D Test" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 21, 309 | "metadata": {}, 310 | "outputs": [ 311 | { 312 | "data": { 313 | "text/plain": [ 314 | "AndersonResult(statistic=0.55790820368821414, critical_values=array([ 0.919, 1.075, 1.337, 1.602, 1.952]), significance_level=array([ 15. , 10. , 5. , 2.5, 1. ]))" 315 | ] 316 | }, 317 | "execution_count": 21, 318 | "metadata": {}, 319 | "output_type": "execute_result" 320 | } 321 | ], 322 | "source": [ 323 | "st.anderson(times, 'expon')" 324 | ] 325 | } 326 | ], 327 | "metadata": { 328 | "kernelspec": { 329 | "display_name": "Python 3", 330 | "language": "python", 331 | "name": "python3" 332 | }, 333 | "language_info": { 334 | "codemirror_mode": { 335 | "name": "ipython", 336 | "version": 3 337 | }, 338 | "file_extension": ".py", 339 | "mimetype": "text/x-python", 340 | "name": "python", 341 | "nbconvert_exporter": "python", 342 | "pygments_lexer": "ipython3", 343 | "version": "3.6.2" 344 | } 345 | }, 346 | "nbformat": 4, 347 | "nbformat_minor": 2 348 | } 349 | -------------------------------------------------------------------------------- /statistics/anova_one_factor.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Completely Randomized Single-Factor Experiment\n", 8 | "## EXAMPLE: TENSILE STRENGTH\n", 9 | "A manufacturer of paper used for making grocery bags is interested in improving the prod-\n", 10 | "uct’s tensile strength. Product engineering believes that tensile strength is a function of the \n", 11 | "hardwood concentration in the pulp and that the range of hardwood concentrations of practi-\n", 12 | "cal interest is between 5 and 20%. A team of engineers responsible for the study decides to \n", 13 | "investigate four levels of hardwood concentration: 5%, 10%, 15%, and 20%. They decide to \n", 14 | "make up six test specimens at each concentration level by using a pilot plant. All 24 specimens \n", 15 | "are tested on a laboratory tensile tester in random order. The data from this experiment are \n", 16 | "shown in Table 13-1." 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import pandas as pd\n", 26 | "import statsmodels.formula.api as smf\n", 27 | "import matplotlib.pyplot as plt\n", 28 | "import scipy.stats as st\n", 29 | "%matplotlib inline" 30 | ] 31 | }, 32 | { 33 | "cell_type": "code", 34 | "execution_count": 2, 35 | "metadata": {}, 36 | "outputs": [ 37 | { 38 | "data": { 39 | "text/html": [ 40 | "
\n", 41 | "\n", 54 | "\n", 55 | " \n", 56 | " \n", 57 | " \n", 58 | " \n", 59 | " \n", 60 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | "
HardwoodStrength
057
158
2515
3511
459
\n", 90 | "
" 91 | ], 92 | "text/plain": [ 93 | " Hardwood Strength\n", 94 | "0 5 7\n", 95 | "1 5 8\n", 96 | "2 5 15\n", 97 | "3 5 11\n", 98 | "4 5 9" 99 | ] 100 | }, 101 | "execution_count": 2, 102 | "metadata": {}, 103 | "output_type": "execute_result" 104 | } 105 | ], 106 | "source": [ 107 | "df = pd.read_excel('table 13-1.xlsx')\n", 108 | "df.head()" 109 | ] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "execution_count": 3, 114 | "metadata": {}, 115 | "outputs": [ 116 | { 117 | "data": { 118 | "text/plain": [ 119 | "" 120 | ] 121 | }, 122 | "execution_count": 3, 123 | "metadata": {}, 124 | "output_type": "execute_result" 125 | }, 126 | { 127 | "data": { 128 | "image/png": "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\nQFkAAAAASUVORK5CYII=\n", 129 | "text/plain": [ 130 | "" 131 | ] 132 | }, 133 | "metadata": {}, 134 | "output_type": "display_data" 135 | } 136 | ], 137 | "source": [ 138 | "df.plot.scatter('Hardwood', 'Strength')" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 4, 144 | "metadata": {}, 145 | "outputs": [ 146 | { 147 | "data": { 148 | "text/html": [ 149 | "\n", 150 | "\n", 151 | "\n", 152 | " \n", 153 | "\n", 154 | "\n", 155 | " \n", 156 | "\n", 157 | "\n", 158 | " \n", 159 | "\n", 160 | "\n", 161 | " \n", 162 | "\n", 163 | "\n", 164 | " \n", 165 | "\n", 166 | "\n", 167 | " \n", 168 | "\n", 169 | "\n", 170 | " \n", 171 | "\n", 172 | "\n", 173 | " \n", 174 | "\n", 175 | "\n", 176 | " \n", 177 | "\n", 178 | "
OLS Regression Results
Dep. Variable: Strength R-squared: 0.746
Model: OLS Adj. R-squared: 0.708
Method: Least Squares F-statistic: 19.61
Date: Tue, 21 Nov 2017 Prob (F-statistic): 3.59e-06
Time: 10:25:37 Log-Likelihood: -54.344
No. Observations: 24 AIC: 116.7
Df Residuals: 20 BIC: 121.4
Df Model: 3
Covariance Type: nonrobust
\n", 179 | "\n", 180 | "\n", 181 | " \n", 182 | "\n", 183 | "\n", 184 | " \n", 185 | "\n", 186 | "\n", 187 | " \n", 188 | "\n", 189 | "\n", 190 | " \n", 191 | "\n", 192 | "\n", 193 | " \n", 194 | "\n", 195 | "
coef std err t P>|t| [0.025 0.975]
Intercept 10.0000 1.041 9.602 0.000 7.827 12.173
C(Hardwood)[T.10] 5.6667 1.473 3.847 0.001 2.594 8.739
C(Hardwood)[T.15] 7.0000 1.473 4.753 0.000 3.928 10.072
C(Hardwood)[T.20] 11.1667 1.473 7.581 0.000 8.094 14.239
\n", 196 | "\n", 197 | "\n", 198 | " \n", 199 | "\n", 200 | "\n", 201 | " \n", 202 | "\n", 203 | "\n", 204 | " \n", 205 | "\n", 206 | "\n", 207 | " \n", 208 | "\n", 209 | "
Omnibus: 0.929 Durbin-Watson: 2.181
Prob(Omnibus): 0.628 Jarque-Bera (JB): 0.861
Skew: 0.248 Prob(JB): 0.650
Kurtosis: 2.215 Cond. No. 4.79
" 210 | ], 211 | "text/plain": [ 212 | "\n", 213 | "\"\"\"\n", 214 | " OLS Regression Results \n", 215 | "==============================================================================\n", 216 | "Dep. Variable: Strength R-squared: 0.746\n", 217 | "Model: OLS Adj. R-squared: 0.708\n", 218 | "Method: Least Squares F-statistic: 19.61\n", 219 | "Date: Tue, 21 Nov 2017 Prob (F-statistic): 3.59e-06\n", 220 | "Time: 10:25:37 Log-Likelihood: -54.344\n", 221 | "No. Observations: 24 AIC: 116.7\n", 222 | "Df Residuals: 20 BIC: 121.4\n", 223 | "Df Model: 3 \n", 224 | "Covariance Type: nonrobust \n", 225 | "=====================================================================================\n", 226 | " coef std err t P>|t| [0.025 0.975]\n", 227 | "-------------------------------------------------------------------------------------\n", 228 | "Intercept 10.0000 1.041 9.602 0.000 7.827 12.173\n", 229 | "C(Hardwood)[T.10] 5.6667 1.473 3.847 0.001 2.594 8.739\n", 230 | "C(Hardwood)[T.15] 7.0000 1.473 4.753 0.000 3.928 10.072\n", 231 | "C(Hardwood)[T.20] 11.1667 1.473 7.581 0.000 8.094 14.239\n", 232 | "==============================================================================\n", 233 | "Omnibus: 0.929 Durbin-Watson: 2.181\n", 234 | "Prob(Omnibus): 0.628 Jarque-Bera (JB): 0.861\n", 235 | "Skew: 0.248 Prob(JB): 0.650\n", 236 | "Kurtosis: 2.215 Cond. No. 4.79\n", 237 | "==============================================================================\n", 238 | "\n", 239 | "Warnings:\n", 240 | "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", 241 | "\"\"\"" 242 | ] 243 | }, 244 | "execution_count": 4, 245 | "metadata": {}, 246 | "output_type": "execute_result" 247 | } 248 | ], 249 | "source": [ 250 | "res = smf.ols('Strength ~ C(Hardwood)', data=df).fit()\n", 251 | "res.summary()" 252 | ] 253 | }, 254 | { 255 | "cell_type": "markdown", 256 | "metadata": {}, 257 | "source": [ 258 | "## The Analysis of Variance" 259 | ] 260 | }, 261 | { 262 | "cell_type": "code", 263 | "execution_count": 5, 264 | "metadata": {}, 265 | "outputs": [], 266 | "source": [ 267 | "from statsmodels.stats.anova import anova_lm" 268 | ] 269 | }, 270 | { 271 | "cell_type": "code", 272 | "execution_count": 6, 273 | "metadata": {}, 274 | "outputs": [ 275 | { 276 | "name": "stderr", 277 | "output_type": "stream", 278 | "text": [ 279 | "D:\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in greater\n", 280 | " return (self.a < x) & (x < self.b)\n", 281 | "D:\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:879: RuntimeWarning: invalid value encountered in less\n", 282 | " return (self.a < x) & (x < self.b)\n", 283 | "D:\\Anaconda3\\lib\\site-packages\\scipy\\stats\\_distn_infrastructure.py:1818: RuntimeWarning: invalid value encountered in less_equal\n", 284 | " cond2 = cond0 & (x <= self.a)\n" 285 | ] 286 | }, 287 | { 288 | "data": { 289 | "text/html": [ 290 | "
\n", 291 | "\n", 304 | "\n", 305 | " \n", 306 | " \n", 307 | " \n", 308 | " \n", 309 | " \n", 310 | " \n", 311 | " \n", 312 | " \n", 313 | " \n", 314 | " \n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | "
dfsum_sqmean_sqFPR(>F)
C(Hardwood)3.0382.791667127.59722219.6052070.000004
Residual20.0130.1666676.508333NaNNaN
\n", 334 | "
" 335 | ], 336 | "text/plain": [ 337 | " df sum_sq mean_sq F PR(>F)\n", 338 | "C(Hardwood) 3.0 382.791667 127.597222 19.605207 0.000004\n", 339 | "Residual 20.0 130.166667 6.508333 NaN NaN" 340 | ] 341 | }, 342 | "execution_count": 6, 343 | "metadata": {}, 344 | "output_type": "execute_result" 345 | } 346 | ], 347 | "source": [ 348 | "anova_lm(res)" 349 | ] 350 | }, 351 | { 352 | "cell_type": "markdown", 353 | "metadata": {}, 354 | "source": [ 355 | "## Tukey’s Test" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "execution_count": 7, 361 | "metadata": {}, 362 | "outputs": [], 363 | "source": [ 364 | "from statsmodels.stats.multicomp import pairwise_tukeyhsd" 365 | ] 366 | }, 367 | { 368 | "cell_type": "code", 369 | "execution_count": 8, 370 | "metadata": {}, 371 | "outputs": [ 372 | { 373 | "data": { 374 | "text/html": [ 375 | "\n", 376 | "\n", 377 | "\n", 378 | " \n", 379 | "\n", 380 | "\n", 381 | " \n", 382 | "\n", 383 | "\n", 384 | " \n", 385 | "\n", 386 | "\n", 387 | " \n", 388 | "\n", 389 | "\n", 390 | " \n", 391 | "\n", 392 | "\n", 393 | " \n", 394 | "\n", 395 | "\n", 396 | " \n", 397 | "\n", 398 | "
Multiple Comparison of Means - Tukey HSD,FWER=0.05
group1 group2 meandiff lower upper reject
5 10 5.6667 1.5439 9.7894 True
5 15 7.0 2.8773 11.1227 True
5 20 11.1667 7.0439 15.2894 True
10 15 1.3333 -2.7894 5.4561 False
10 20 5.5 1.3773 9.6227 True
15 20 4.1667 0.0439 8.2894 True
" 399 | ], 400 | "text/plain": [ 401 | "" 402 | ] 403 | }, 404 | "execution_count": 8, 405 | "metadata": {}, 406 | "output_type": "execute_result" 407 | } 408 | ], 409 | "source": [ 410 | "comp = pairwise_tukeyhsd(df['Strength'], df['Hardwood'])\n", 411 | "comp.summary()" 412 | ] 413 | }, 414 | { 415 | "cell_type": "code", 416 | "execution_count": 9, 417 | "metadata": {}, 418 | "outputs": [ 419 | { 420 | "data": { 421 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAEICAYAAACOKIcAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGrdJREFUeJzt3XuUZGV97vHnmQwONhe5jMJwq5JAIBgIaAcnxKNt9Cgg\niJAchLRxiGM6ZBmXZukxJJyleEybqOegJsaDPRHBoUQIchdzBHSGGDOEHsIdlMuZygDDzHAdcHC4\n/c4f79tQU1PV9+56u/v7WatXV+3ae9fvrb13Pft9954eR4QAAEBnzet0AQAAgEAGAKAIBDIAAAUg\nkAEAKACBDABAAQhkAAAKQCDPQbbD9gHDvH6n7Z5RrmuN7XdOWnEzhO0f2F7S6Tog2a7mfXp+fr7C\n9oen4H1GfVyMYl0LbN9le9EkrOsC22dNQlmN61yU63vVZK4XwyOQZ5Acfs/ZXtg0/T/yF1J1HOs8\nz/ZfN06LiDdExIoJFTu6997Z9lds/6ftZ2zfn58vHHnpzoqIYyLi/E7XIb28XzybP8MnbH/f9r6j\nXLbH9oNTXeNkyLWG7b+YwDrOsv18/qyetP1T2789mmUn+bjok3RDRKzLJ3fP5J/n8zE+9PycSXq/\nMYmIdZJ+ImlpJ95/riKQZ57/J+nUoSe2D5XU1blyxiefeV8v6Q2Sjpa0s6TflvSopCM7WNqwnJR4\n3BwfETtKWiRpvaS/73A9U2GJpMclfXCC67kof1avVQqdS217Iisc6p2PwemSlksvn9ztmGuqSfri\n0POIOH0idU1QTdKfdPD955wSv1gwvOXa+gtpiaRvN87QPGRn+zTbP2leke0+Sb2SPpXPxq/K018e\nhs49iktsX2T7ads32/7NVoXZnmf7jNzTfcz2xbZ3a9OOD0raT9KJEXFXRLwUERsi4q8j4pq8vl/P\nbXkyDxe+t+G9zrP99Ybexb/a3jP3sJ+wfY/tIxrmX2P7L/Mw3BO2v2V7+/zarravtr0xv3a17X2a\nPs9+2/8qabOk/Rs/Y9sH2F5p+ynbj9q+qGHZo2zflF+7yfZRTev9XK79ads/HBodsL19Hop8LLf/\nJtt7tPksXxYRv5R0iaRDGt5nge3/lUci1ts+x/arbe8g6QeS9mroke2Ve9tDdZxp+wXbO+fnn7P9\nleHW2/C+x9m+paEneljT9vik7dvyZ3PR0PZoJdf6+5I+IulA290jfRaj+Kyel3S+pD0l7W77V23/\nKH/mj9qu2d6lqebm4+IC25sknWb7SNuDtjflz+PsNm3ZT9L+km4cTZ22P2x7RcPz+W4zIuY06nSD\n7S872d722bbX5pq+3rDf32P7mIZlF+T9/9A86d8kHWx779HUiYkjkGeeVZJ2dgqrX5F0iqQLxrOi\niBjQ1mfkx7eZ9QRJ/yRpN0nfkXS57e1azPdRSe+T9DZJe0l6QtI/tFnnOyX9c0Q80+rFvP6rJP1Q\n0uvyumu2D2qY7WRJ/0PSQklblL5Abs7PL5HU/IXYK+ndkn5V0q/lZaV0HHxLUkXpJOFZSV9rWvYP\nlYYZd5JUb3rtc7nOXSXto9w7dToZ+b6kv5O0e67n+7Z3b1j2DyT9UW7jqyR9Mk9fIuk1kvbNy56e\n6xqW7S5J71faT4b8bW7v4ZIOkLS3pE9HxC8kHSPp4YYe2cOSblLahsq/65J+p+H5yuHWm+s4QtK5\nSj2s3SV9Q9KVthc01HWy0ujI6yUdJum0YZp2kqRnlPbD/5s/nwnJtZwmaW1EPCrJkv5Gad/9daXP\n/qxhVnGC0n62i9Jx9FVJX42InZX2sYvbLHeopAci4oWJtqFRPon6saQfRcSfR/q7yF/SK5/vgZKq\nks7Mi3xb0gcaVnGcpDURcbskRcRzkh6Q1PIEHJOPQJ6ZhnrJ/1XS3ZIemuL3Wx0Rl+QexdmStpe0\nuMV8p0s6MyIejIgtSl9mv+/Ww3m7S1o3zHsulrSjpL+NiOci4keSrlbDcL2kyyJide4VXibplxHx\n7Yh4UdJFko5oWufXImJtRDwuqX9oXRHxWER8LyI2R8TT+bW3NS17XkTcGREv5M+h0fNKYb5XRPwy\nIoZGI94j6d6IWJ6Xu1DSPZIaT3y+FRE/j4hnlb7AD29Y5+6SDoiIF3M7Nw3zeV1u+0lJTyntF1+S\n0hC70onEn0fE47l9n1c6kWtnpaS35e12mNIJxdtyz+q3JN0wivX2SfpGRNyY6z9f6aSpcb/5u4h4\nOG+Pqxra3soSpaHmF5VOCk9pc1I4Gifnz2qtpDdJOlGSIuK+iLg2IrZExEalfb15P2j0bxFxeR7d\neVZpmx1ge2FEPBMRq9ost4ukp8dZezv7SLpB0gURcZaURqwk/bGkj0fEE3n/+Ru9so2WSzo+jz5I\n6aRzedN6n871YhoQyDPTcqWe1WlqGq6eImuHHkTES5IeVOpFNKtIuiwPUT6pdLLwoqRWQ62PKV3v\n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\n", 422 | "text/plain": [ 423 | "" 424 | ] 425 | }, 426 | "metadata": {}, 427 | "output_type": "display_data" 428 | } 429 | ], 430 | "source": [ 431 | "comp.plot_simultaneous(figsize=(8, 4));" 432 | ] 433 | } 434 | ], 435 | "metadata": { 436 | "kernelspec": { 437 | "display_name": "Python 3", 438 | "language": "python", 439 | "name": "python3" 440 | }, 441 | "language_info": { 442 | "codemirror_mode": { 443 | "name": "ipython", 444 | "version": 3 445 | }, 446 | "file_extension": ".py", 447 | "mimetype": "text/x-python", 448 | "name": "python", 449 | "nbconvert_exporter": "python", 450 | "pygments_lexer": "ipython3", 451 | "version": "3.6.2" 452 | } 453 | }, 454 | "nbformat": 4, 455 | "nbformat_minor": 2 456 | } 457 | -------------------------------------------------------------------------------- /optimization/scheduling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Scheduling Model\n", 8 | "### Conjuntos\n", 9 | "- $A$ es el conjunto de tareas\n", 10 | "- $O$ es el conjunto de órdenes\n", 11 | "- $M$ es el conjunto de máquinas\n", 12 | "\n", 13 | "### Parámetros\n", 14 | "- $d_i$ duración de la tarea $i\\in A$\n", 15 | "- $\\tau_i$ tiempo más temprano para comenzar la tarea $i\\in A$\n", 16 | "- $T_o$ tiempo de entrega de la orden $o\\in O$\n", 17 | "- $p(i)$ conjunto de tareas que preceden a $i\\in A$\n", 18 | "- $m(i)$ conjunto de máquinas en las que se puede realizar la tarea $i\\in A$\n", 19 | "- $r(k) = \\{i\\in A \\ | \\ k \\in m(i) \\}$ conjunto de tareas que se pueden realizar en la máquina $k\\in M$\n", 20 | "- $r_0(k) = r(k) \\cup \\{0\\}$\n", 21 | "- $w(o)$ conjunto de tareas que componen la orden $o\\in O$\n", 22 | "\n", 23 | "### Variables\n", 24 | "- $x_{ijk}$ variable binaria igual 1 cuando en la máquina $k\\in M$ la tarea $j\\in r_0(k)$ se programa despues de la tarea $i\\in r_0(k):i\\neq j$\n", 25 | "- $t_{ik}$ tiempo en el que se comienza a trabajar la tarea $i\\in A$ en la máquina $k\\in m(i)$\n", 26 | "\n", 27 | "### Modelo\n", 28 | "\\begin{align}\n", 29 | "\\min \\quad & \\max_{i\\in A, \\ k \\in m(i)} \\{ t_{ik}+d_i \\} \\\\\n", 30 | "\\text{s.t.} \\quad & \\sum_{k\\in m(j)} \\sum_{i\\in r_0(k)} x_{ijk} = 1 && j \\in A \\\\\n", 31 | "& \\sum_{k\\in m(i)} \\sum_{j\\in r_0(k)} x_{ijk} = 1 && i \\in A \\\\\n", 32 | "& \\sum_{i\\in r_0(k)} x_{ihk} = \\sum_{j\\in r_0(k)} x_{hjk} && h\\in A,\\ k\\in m(h) \\\\\n", 33 | "& \\sum_{j\\in r(k)} x_{0jk} \\leq 1 && k \\in M \\\\\n", 34 | "& \\sum_{i\\in r(k)} x_{i0k} \\leq 1 && k \\in M \\\\\n", 35 | "& x_{ijk} = 1 \\ \\Rightarrow \\ t_{ik} + d_i \\leq t_{jk} && k\\in M,\\ i\\in r(k),\\ j\\in r(k),\\ i\\neq j\\\\\n", 36 | "& t_{ik} \\geq \\tau_i && i\\in A,\\ k \\in m(i) \\\\\n", 37 | "& t_{ig} +d_i \\leq t_{jh} && j \\in A , \\ i \\in p(j) , \\ g \\in m(i), \\ h \\in m(j) \\\\\n", 38 | "& x_{ijk} \\in\\{0,1\\} && k\\in M,\\ i\\in r_0(k),\\ j\\in r_0(k),\\ i\\neq j\n", 39 | "\\end{align}" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "execution_count": 1, 45 | "metadata": { 46 | "collapsed": true 47 | }, 48 | "outputs": [], 49 | "source": [ 50 | "import collections\n", 51 | "from docplex.mp.model import Model" 52 | ] 53 | }, 54 | { 55 | "cell_type": "code", 56 | "execution_count": 2, 57 | "metadata": { 58 | "collapsed": true 59 | }, 60 | "outputs": [], 61 | "source": [ 62 | "Order = collections.namedtuple('Order', ['tasks', 'due_date'])\n", 63 | "Task = collections.namedtuple('Task',['machines','duration',\n", 64 | " 'earliest_start','precedence'])" 65 | ] 66 | }, 67 | { 68 | "cell_type": "code", 69 | "execution_count": 3, 70 | "metadata": { 71 | "collapsed": true 72 | }, 73 | "outputs": [], 74 | "source": [ 75 | "tasks = {1: Task([1, 2], 5, 3, []),\n", 76 | " 2: Task([2, 3], 7, 3, [1]),\n", 77 | " 3: Task([1, 4], 8, 3, [1]),\n", 78 | " 4: Task([5], 2, 3, []),\n", 79 | " 5: Task([1, 5, 3], 5, 0, [4]),\n", 80 | " 6: Task([5], 9, 10, []),\n", 81 | " 7: Task([5], 4, 10, [2, 3]),\n", 82 | " 8: Task([5], 4, 10, []),\n", 83 | " 9: Task([3, 4], 4, 10, [8]),\n", 84 | " 10:Task([5], 4, 10, [9])}" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 4, 90 | "metadata": { 91 | "collapsed": true 92 | }, 93 | "outputs": [], 94 | "source": [ 95 | "orders = {1: Order(tasks=[1, 2, 3, 7], due_date=5),\n", 96 | " 2: Order([4, 5], 10),\n", 97 | " 3: Order([6], 6),\n", 98 | " 4: Order([8, 9, 10], 5)}" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 5, 104 | "metadata": { 105 | "collapsed": true 106 | }, 107 | "outputs": [], 108 | "source": [ 109 | "machines = [1, 2, 3, 4, 5]" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 6, 115 | "metadata": {}, 116 | "outputs": [ 117 | { 118 | "data": { 119 | "text/plain": [ 120 | "{1: [1, 3, 5], 2: [1, 2], 3: [2, 5, 9], 4: [3, 9], 5: [4, 5, 6, 7, 8, 10]}" 121 | ] 122 | }, 123 | "execution_count": 6, 124 | "metadata": {}, 125 | "output_type": "execute_result" 126 | } 127 | ], 128 | "source": [ 129 | "tasks_per_machine = {}\n", 130 | "for k in machines:\n", 131 | " tasks_this_machine = []\n", 132 | " for i, task in tasks.items():\n", 133 | " if k in task.machines:\n", 134 | " tasks_this_machine.append(i)\n", 135 | " tasks_per_machine[k] = tasks_this_machine\n", 136 | "tasks_per_machine" 137 | ] 138 | }, 139 | { 140 | "cell_type": "code", 141 | "execution_count": 7, 142 | "metadata": { 143 | "collapsed": true 144 | }, 145 | "outputs": [], 146 | "source": [ 147 | "tuples = [(i,j,k) for k in machines \n", 148 | " for i in tasks_per_machine[k]+[0] \n", 149 | " for j in tasks_per_machine[k]+[0]\n", 150 | " if i!=j]" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 8, 156 | "metadata": { 157 | "collapsed": true 158 | }, 159 | "outputs": [], 160 | "source": [ 161 | "mdl = Model('Scheduling')" 162 | ] 163 | }, 164 | { 165 | "cell_type": "code", 166 | "execution_count": 9, 167 | "metadata": { 168 | "collapsed": true 169 | }, 170 | "outputs": [], 171 | "source": [ 172 | "x = mdl.binary_var_dict(tuples, name='x')\n", 173 | "t = mdl.continuous_var_dict([(i,k) for i, task in tasks.items() \n", 174 | " for k in task.machines],name='t')\n", 175 | "y = mdl.continuous_var(name='y')" 176 | ] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "execution_count": 10, 181 | "metadata": { 182 | "collapsed": true 183 | }, 184 | "outputs": [], 185 | "source": [ 186 | "mdl.minimize(y)" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "$$\\sum_{k\\in m(j)} \\sum_{i\\in r_0(k)} x_{ijk} = 1 \\qquad j \\in A$$" 194 | ] 195 | }, 196 | { 197 | "cell_type": "code", 198 | "execution_count": 11, 199 | "metadata": { 200 | "collapsed": true 201 | }, 202 | "outputs": [], 203 | "source": [ 204 | "for j, task_j in tasks.items():\n", 205 | " mdl.add_constraint(mdl.sum(x[(i,j,k)] for k in task_j.machines \n", 206 | " for i in tasks_per_machine[k]+[0]\n", 207 | " if i!=j)==1,ctname='in_%d'%j)" 208 | ] 209 | }, 210 | { 211 | "cell_type": "markdown", 212 | "metadata": {}, 213 | "source": [ 214 | "$$\\sum_{k\\in m(i)} \\sum_{j\\in r_0(k)} x_{ijk} = 1 \\qquad i \\in A$$" 215 | ] 216 | }, 217 | { 218 | "cell_type": "code", 219 | "execution_count": 12, 220 | "metadata": { 221 | "collapsed": true 222 | }, 223 | "outputs": [], 224 | "source": [ 225 | "for i, task_i in tasks.items():\n", 226 | " mdl.add_constraint(mdl.sum(x[(i,j,k)] for k in task_i.machines\n", 227 | " for j in tasks_per_machine[k]+[0]\n", 228 | " if j!=i)==1,ctname='out_%d'%i)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "markdown", 233 | "metadata": {}, 234 | "source": [ 235 | "$$\\sum_{i\\in r_0(k)} x_{ihk} = \\sum_{j\\in r_0(k)} x_{hjk} \\qquad h\\in A,\\ k\\in m(h)$$" 236 | ] 237 | }, 238 | { 239 | "cell_type": "code", 240 | "execution_count": 13, 241 | "metadata": { 242 | "collapsed": true 243 | }, 244 | "outputs": [], 245 | "source": [ 246 | "for h, task_h in tasks.items():\n", 247 | " for k in task_h.machines:\n", 248 | " mdl.add_constraint(\n", 249 | " mdl.sum(x[(i,h,k)] for i in tasks_per_machine[k]+[0] if i!=h)==\n", 250 | " mdl.sum(x[(h,j,k)] for j in tasks_per_machine[k]+[0] if j!=h),\n", 251 | " ctname='flow_%d_%d'%(h,k)\n", 252 | " )" 253 | ] 254 | }, 255 | { 256 | "cell_type": "markdown", 257 | "metadata": {}, 258 | "source": [ 259 | "$$\\sum_{j\\in r(k)} x_{0jk} \\leq 1 \\qquad k \\in M$$\n", 260 | "$$\\sum_{i\\in r(k)} x_{i0k} \\leq 1 \\qquad k \\in M $$" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 14, 266 | "metadata": { 267 | "collapsed": true 268 | }, 269 | "outputs": [], 270 | "source": [ 271 | "for k in machines:\n", 272 | " mdl.add_constraint(mdl.sum(x[(0,j,k)] for j in tasks_per_machine[k])<=1,\n", 273 | " ctname='start_%d'%k)\n", 274 | " mdl.add_constraint(mdl.sum(x[(i,0,k)] for i in tasks_per_machine[k])<=1,\n", 275 | " ctname='end_%d'%k)" 276 | ] 277 | }, 278 | { 279 | "cell_type": "markdown", 280 | "metadata": {}, 281 | "source": [ 282 | "$$ x_{ijk} = 1 \\ \\Rightarrow \\ t_{ik} + d_i \\leq t_{jk} \\qquad k\\in M,\\ i\\in r(k),\\ j\\in r(k),\\ i\\neq j$$" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 15, 288 | "metadata": { 289 | "collapsed": true 290 | }, 291 | "outputs": [], 292 | "source": [ 293 | "for i,j,k in tuples:\n", 294 | " if i!=0 and j!=0:\n", 295 | " mdl.add_indicator(x[(i,j,k)],\n", 296 | " t[(i,k)] + tasks[i].duration <= t[(j,k)],\n", 297 | " name='order_%d_%d_%d'%(i,j,k))" 298 | ] 299 | }, 300 | { 301 | "cell_type": "markdown", 302 | "metadata": {}, 303 | "source": [ 304 | "$$ t_{ig} +d_i \\leq t_{jh} \\qquad j \\in A , \\ i \\in p(j) , \\ g \\in m(i), \\ h \\in m(j) $$" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 16, 310 | "metadata": { 311 | "collapsed": true 312 | }, 313 | "outputs": [], 314 | "source": [ 315 | "for j, task_j in tasks.items():\n", 316 | " for i in task_j.precedence:\n", 317 | " task_i = tasks[i]\n", 318 | " for g in task_i.machines:\n", 319 | " for h in task_j.machines:\n", 320 | " mdl.add_constraint(t[(i,g)] + tasks[i].duration <= t[(j,h)],\n", 321 | " ctname='pre_%d<%d_%d.%d'%(i,j,g,h))" 322 | ] 323 | }, 324 | { 325 | "cell_type": "markdown", 326 | "metadata": {}, 327 | "source": [ 328 | "$$ t_{ik} \\geq \\tau_i \\qquad i\\in A,\\ k \\in m(i) $$\n", 329 | "$$ t_{ik} +d_i \\leq y \\qquad i\\in A,\\ k \\in m(i) $$" 330 | ] 331 | }, 332 | { 333 | "cell_type": "code", 334 | "execution_count": 17, 335 | "metadata": { 336 | "collapsed": true 337 | }, 338 | "outputs": [], 339 | "source": [ 340 | "for i, task_i in tasks.items():\n", 341 | " for k in task_i.machines:\n", 342 | " mdl.add_constraint(t[(i,k)] >= task_i.earliest_start,\n", 343 | " ctname='earliest_start%d_%d'%(i,k))\n", 344 | " mdl.add_constraint(t[(i,k)] + task_i.duration <= y,\n", 345 | " ctname='makespan_%d_%d'%(i,k))" 346 | ] 347 | }, 348 | { 349 | "cell_type": "code", 350 | "execution_count": 18, 351 | "metadata": {}, 352 | "outputs": [ 353 | { 354 | "name": "stdout", 355 | "output_type": "stream", 356 | "text": [ 357 | "CPXPARAM_Read_DataCheck 1\n", 358 | "CPXPARAM_Read_APIEncoding \"UTF-8\"\n", 359 | "CPXPARAM_MIP_Strategy_CallbackReducedLP 0\n", 360 | "Tried aggregator 2 times.\n", 361 | "MIP Presolve eliminated 28 rows and 10 columns.\n", 362 | "MIP Presolve modified 80 coefficients.\n", 363 | "Aggregator did 23 substitutions.\n", 364 | "Reduced MIP has 87 rows, 108 columns, and 323 nonzeros.\n", 365 | "Reduced MIP has 73 binaries, 0 generals, 0 SOSs, and 40 indicators.\n", 366 | "Presolve time = 0.02 sec. (0.52 ticks)\n", 367 | "Probing time = 0.00 sec. (0.11 ticks)\n", 368 | "Tried aggregator 1 time.\n", 369 | "Reduced MIP has 87 rows, 108 columns, and 323 nonzeros.\n", 370 | "Reduced MIP has 73 binaries, 0 generals, 0 SOSs, and 40 indicators.\n", 371 | "Presolve time = 0.00 sec. (0.22 ticks)\n", 372 | "Probing time = 0.00 sec. (0.11 ticks)\n", 373 | "Clique table members: 163.\n", 374 | "MIP emphasis: balance optimality and feasibility.\n", 375 | "MIP search method: dynamic search.\n", 376 | "Parallel mode: deterministic, using up to 4 threads.\n", 377 | "Root relaxation solution time = 0.02 sec. (0.16 ticks)\n", 378 | "\n", 379 | " Nodes Cuts/\n", 380 | " Node Left Objective IInf Best Integer Best Bound ItCnt Gap\n", 381 | "\n", 382 | " 0 0 22.0000 5 22.0000 27 \n", 383 | "* 0+ 0 41.0000 22.0000 46.34%\n", 384 | " 0 0 22.0000 18 41.0000 Cuts: 3 34 46.34%\n", 385 | " 0 0 22.0000 3 41.0000 Impl Bds: 1 38 46.34%\n", 386 | "* 0+ 0 35.0000 22.0000 37.14%\n", 387 | " 0 0 22.0000 3 35.0000 Impl Bds: 1 39 37.14%\n", 388 | " 0 2 22.0000 3 35.0000 22.0000 39 37.14%\n", 389 | "Elapsed time = 0.06 sec. (3.82 ticks, tree = 0.01 MB, solutions = 2)\n", 390 | "* 23+ 10 33.0000 22.0000 33.33%\n", 391 | "* 49+ 13 31.0000 22.0000 29.03%\n", 392 | "\n", 393 | "Clique cuts applied: 1\n", 394 | "Implied bound cuts applied: 7\n", 395 | "\n", 396 | "Root node processing (before b&c):\n", 397 | " Real time = 0.06 sec. (3.78 ticks)\n", 398 | "Parallel b&c, 4 threads:\n", 399 | " Real time = 0.13 sec. (6.61 ticks)\n", 400 | " Sync time (average) = 0.08 sec.\n", 401 | " Wait time (average) = 0.00 sec.\n", 402 | " ------------\n", 403 | "Total (root+branch&cut) = 0.19 sec. (10.39 ticks)\n" 404 | ] 405 | }, 406 | { 407 | "data": { 408 | "text/plain": [ 409 | "" 410 | ] 411 | }, 412 | "execution_count": 18, 413 | "metadata": {}, 414 | "output_type": "execute_result" 415 | } 416 | ], 417 | "source": [ 418 | "solucion = mdl.solve(log_output=True)\n", 419 | "mdl.get_solve_status()" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": 19, 425 | "metadata": {}, 426 | "outputs": [ 427 | { 428 | "data": { 429 | "text/plain": [ 430 | "31.0" 431 | ] 432 | }, 433 | "execution_count": 19, 434 | "metadata": {}, 435 | "output_type": "execute_result" 436 | } 437 | ], 438 | "source": [ 439 | "mdl.objective_value" 440 | ] 441 | }, 442 | { 443 | "cell_type": "code", 444 | "execution_count": 20, 445 | "metadata": {}, 446 | "outputs": [ 447 | { 448 | "name": "stdout", 449 | "output_type": "stream", 450 | "text": [ 451 | "solution for: Scheduling\n", 452 | "y: 31.000\n", 453 | "x_(3, 0, 1) = 1\n", 454 | "x_(10, 0, 5) = 1\n", 455 | "x_(0, 4, 5) = 1\n", 456 | "x_(0, 3, 1) = 1\n", 457 | "x_(1, 0, 2) = 1\n", 458 | "t_(1, 1) = 3.000\n", 459 | "t_(1, 2) = 3.000\n", 460 | "t_(2, 2) = 8.000\n", 461 | "t_(2, 3) = 10.000\n", 462 | "t_(3, 1) = 15.000\n", 463 | "t_(3, 4) = 8.000\n", 464 | "x_(2, 0, 3) = 1\n", 465 | "x_(5, 2, 3) = 1\n", 466 | "t_(5, 5) = 26.000\n", 467 | "t_(5, 3) = 5.000\n", 468 | "t_(6, 5) = 14.000\n", 469 | "t_(7, 5) = 23.000\n", 470 | "t_(8, 5) = 10.000\n", 471 | "t_(9, 3) = 14.000\n", 472 | "x_(0, 5, 3) = 1\n", 473 | "t_(10, 5) = 27.000\n", 474 | "y = 31.000\n", 475 | "x_(9, 0, 4) = 1\n", 476 | "x_(0, 9, 4) = 1\n", 477 | "x_(0, 1, 2) = 1\n", 478 | "x_(4, 8, 5) = 1\n", 479 | "t_(9, 4) = 14.000\n", 480 | "x_(6, 7, 5) = 1\n", 481 | "t_(4, 5) = 3.000\n", 482 | "x_(7, 10, 5) = 1\n", 483 | "x_(8, 6, 5) = 1\n", 484 | "t_(5, 1) = 26.000\n" 485 | ] 486 | } 487 | ], 488 | "source": [ 489 | "solucion.display()" 490 | ] 491 | }, 492 | { 493 | "cell_type": "code", 494 | "execution_count": 21, 495 | "metadata": { 496 | "collapsed": true 497 | }, 498 | "outputs": [], 499 | "source": [ 500 | "from bokeh.palettes import Spectral10\n", 501 | "import bokeh.palettes as bp\n", 502 | "from bokeh.plotting import figure, show, output_notebook, ColumnDataSource\n", 503 | "from bokeh.models import HoverTool" 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 22, 509 | "metadata": {}, 510 | "outputs": [ 511 | { 512 | "data": { 513 | "text/html": [ 514 | "\n", 515 | "
\n", 516 | " \n", 517 | " Loading BokehJS ...\n", 518 | "
" 519 | ] 520 | }, 521 | "metadata": {}, 522 | "output_type": "display_data" 523 | }, 524 | { 525 | "data": { 526 | "application/javascript": [ 527 | "\n", 528 | "(function(root) {\n", 529 | " function now() {\n", 530 | " return new Date();\n", 531 | " }\n", 532 | "\n", 533 | " var force = true;\n", 534 | "\n", 535 | " if (typeof (root._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", 536 | " root._bokeh_onload_callbacks = [];\n", 537 | " root._bokeh_is_loading = undefined;\n", 538 | " }\n", 539 | "\n", 540 | "\n", 541 | " \n", 542 | " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", 543 | " root._bokeh_timeout = Date.now() + 5000;\n", 544 | " root._bokeh_failed_load = false;\n", 545 | " }\n", 546 | "\n", 547 | " var NB_LOAD_WARNING = {'data': {'text/html':\n", 548 | " \"
\\n\"+\n", 549 | " \"

\\n\"+\n", 550 | " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", 551 | " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", 552 | " \"

\\n\"+\n", 553 | " \"
    \\n\"+\n", 554 | " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", 555 | " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", 556 | " \"
\\n\"+\n", 557 | " \"\\n\"+\n", 558 | " \"from bokeh.resources import INLINE\\n\"+\n", 559 | " \"output_notebook(resources=INLINE)\\n\"+\n", 560 | " \"\\n\"+\n", 561 | " \"
\"}};\n", 562 | "\n", 563 | " function display_loaded() {\n", 564 | " if (root.Bokeh !== undefined) {\n", 565 | " var el = document.getElementById(\"0aa20a03-63b4-43c3-ad2d-55eca23c9555\");\n", 566 | " if (el != null) {\n", 567 | " el.textContent = \"BokehJS \" + Bokeh.version + \" successfully loaded.\";\n", 568 | " }\n", 569 | " } else if (Date.now() < root._bokeh_timeout) {\n", 570 | " setTimeout(display_loaded, 100)\n", 571 | " }\n", 572 | " }\n", 573 | "\n", 574 | "\n", 575 | " function run_callbacks() {\n", 576 | " try {\n", 577 | " root._bokeh_onload_callbacks.forEach(function(callback) { callback() });\n", 578 | " }\n", 579 | " finally {\n", 580 | " delete root._bokeh_onload_callbacks\n", 581 | " }\n", 582 | " console.info(\"Bokeh: all callbacks have finished\");\n", 583 | " }\n", 584 | "\n", 585 | " function load_libs(js_urls, callback) {\n", 586 | " root._bokeh_onload_callbacks.push(callback);\n", 587 | " if (root._bokeh_is_loading > 0) {\n", 588 | " console.log(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 589 | " return null;\n", 590 | " }\n", 591 | " if (js_urls == null || js_urls.length === 0) {\n", 592 | " run_callbacks();\n", 593 | " return null;\n", 594 | " }\n", 595 | " console.log(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 596 | " root._bokeh_is_loading = js_urls.length;\n", 597 | " for (var i = 0; i < js_urls.length; i++) {\n", 598 | " var url = js_urls[i];\n", 599 | " var s = document.createElement('script');\n", 600 | " s.src = url;\n", 601 | " s.async = false;\n", 602 | " s.onreadystatechange = s.onload = function() {\n", 603 | " root._bokeh_is_loading--;\n", 604 | " if (root._bokeh_is_loading === 0) {\n", 605 | " console.log(\"Bokeh: all BokehJS libraries loaded\");\n", 606 | " run_callbacks()\n", 607 | " }\n", 608 | " };\n", 609 | " s.onerror = function() {\n", 610 | " console.warn(\"failed to load library \" + url);\n", 611 | " };\n", 612 | " console.log(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 613 | " document.getElementsByTagName(\"head\")[0].appendChild(s);\n", 614 | " }\n", 615 | " };var element = document.getElementById(\"0aa20a03-63b4-43c3-ad2d-55eca23c9555\");\n", 616 | " if (element == null) {\n", 617 | " console.log(\"Bokeh: ERROR: autoload.js configured with elementid '0aa20a03-63b4-43c3-ad2d-55eca23c9555' but no matching script tag was found. \")\n", 618 | " return false;\n", 619 | " }\n", 620 | "\n", 621 | " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.7.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.7.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.7.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-0.12.7.min.js\"];\n", 622 | "\n", 623 | " var inline_js = [\n", 624 | " function(Bokeh) {\n", 625 | " Bokeh.set_log_level(\"info\");\n", 626 | " },\n", 627 | " \n", 628 | " function(Bokeh) {\n", 629 | " \n", 630 | " },\n", 631 | " \n", 632 | " function(Bokeh) {\n", 633 | " \n", 634 | " document.getElementById(\"0aa20a03-63b4-43c3-ad2d-55eca23c9555\").textContent = \"BokehJS is loading...\";\n", 635 | " },\n", 636 | " function(Bokeh) {\n", 637 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-0.12.7.min.css\");\n", 638 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-0.12.7.min.css\");\n", 639 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.7.min.css\");\n", 640 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-widgets-0.12.7.min.css\");\n", 641 | " console.log(\"Bokeh: injecting CSS: https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.7.min.css\");\n", 642 | " Bokeh.embed.inject_css(\"https://cdn.pydata.org/bokeh/release/bokeh-tables-0.12.7.min.css\");\n", 643 | " }\n", 644 | " ];\n", 645 | "\n", 646 | " function run_inline_js() {\n", 647 | " \n", 648 | " if ((root.Bokeh !== undefined) || (force === true)) {\n", 649 | " for (var i = 0; i < inline_js.length; i++) {\n", 650 | " inline_js[i].call(root, root.Bokeh);\n", 651 | " }if (force === true) {\n", 652 | " display_loaded();\n", 653 | " }} else if (Date.now() < root._bokeh_timeout) {\n", 654 | " setTimeout(run_inline_js, 100);\n", 655 | " } else if (!root._bokeh_failed_load) {\n", 656 | " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", 657 | " root._bokeh_failed_load = true;\n", 658 | " } else if (force !== true) {\n", 659 | " var cell = $(document.getElementById(\"0aa20a03-63b4-43c3-ad2d-55eca23c9555\")).parents('.cell').data().cell;\n", 660 | " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", 661 | " }\n", 662 | "\n", 663 | " }\n", 664 | "\n", 665 | " if (root._bokeh_is_loading === 0) {\n", 666 | " console.log(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 667 | " run_inline_js();\n", 668 | " } else {\n", 669 | " load_libs(js_urls, function() {\n", 670 | " console.log(\"Bokeh: BokehJS plotting callback run at\", now());\n", 671 | " run_inline_js();\n", 672 | " });\n", 673 | " }\n", 674 | "}(window));" 675 | ] 676 | }, 677 | "metadata": {}, 678 | "output_type": "display_data" 679 | }, 680 | { 681 | "data": { 682 | "text/html": [ 683 | "\n", 684 | "\n", 685 | "
\n", 686 | "
\n", 687 | "
\n", 688 | "" 832 | ] 833 | }, 834 | "metadata": {}, 835 | "output_type": "display_data" 836 | } 837 | ], 838 | "source": [ 839 | "output_notebook()\n", 840 | "palette = bp.all_palettes['Spectral'][len(orders)]\n", 841 | "color = 0\n", 842 | "task_color = {}\n", 843 | "for o in orders.values():\n", 844 | " for i in o.tasks:\n", 845 | " task_color[i] = palette[color]\n", 846 | " color = color + 1\n", 847 | "graph_data = {'left': [], 'bottom': [], 'right': [],\n", 848 | " 'top': [], 'task': [], 'color': []}\n", 849 | "for k in machines:\n", 850 | " arcos_activos = [(i, j) for i in tasks_per_machine[k]+[0]\n", 851 | " for j in tasks_per_machine[k]+[0]\n", 852 | " if i!=j and x[i,j,k].solution_value > 0.9]\n", 853 | " for i, j in arcos_activos:\n", 854 | " if i!=0:\n", 855 | " graph_data['left'].append(t[(i, k)].solution_value)\n", 856 | " graph_data['right'].append(t[(i, k)].solution_value + \n", 857 | " tasks[i].duration)\n", 858 | " graph_data['bottom'].append(k - 0.25)\n", 859 | " graph_data['top'].append(k + 0.25)\n", 860 | " graph_data['task'].append(i)\n", 861 | " graph_data['color'].append(task_color[i])\n", 862 | "source = ColumnDataSource(data=graph_data)\n", 863 | "hover = HoverTool(tooltips = [(\"task\", \"@task\"),('start', '@left'),\n", 864 | " ('end', '@right')]) \n", 865 | "p = figure(plot_width=800, plot_height=400, \n", 866 | " tools=[hover, 'save,xzoom_in,xzoom_out,reset,xpan'])\n", 867 | "p.quad(left='left', bottom='bottom',right='right', top='top', \n", 868 | " color='color', line_color='black', alpha=0.8, source=source)\n", 869 | "show(p, notebook_handle=True)" 870 | ] 871 | } 872 | ], 873 | "metadata": { 874 | "kernelspec": { 875 | "display_name": "Python 3", 876 | "language": "python", 877 | "name": "python3" 878 | }, 879 | "language_info": { 880 | "codemirror_mode": { 881 | "name": "ipython", 882 | "version": 3 883 | }, 884 | "file_extension": ".py", 885 | "mimetype": "text/x-python", 886 | "name": "python", 887 | "nbconvert_exporter": "python", 888 | "pygments_lexer": "ipython3", 889 | "version": "3.5.4" 890 | } 891 | }, 892 | "nbformat": 4, 893 | "nbformat_minor": 2 894 | } 895 | --------------------------------------------------------------------------------