├── .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 | " Chemical | \n",
52 | " Fabric | \n",
53 | " Strength | \n",
54 | "
\n",
55 | " \n",
56 | " \n",
57 | " \n",
58 | " | 0 | \n",
59 | " 1 | \n",
60 | " 1 | \n",
61 | " 1.3 | \n",
62 | "
\n",
63 | " \n",
64 | " | 1 | \n",
65 | " 1 | \n",
66 | " 2 | \n",
67 | " 1.6 | \n",
68 | "
\n",
69 | " \n",
70 | " | 2 | \n",
71 | " 1 | \n",
72 | " 3 | \n",
73 | " 0.5 | \n",
74 | "
\n",
75 | " \n",
76 | " | 3 | \n",
77 | " 1 | \n",
78 | " 4 | \n",
79 | " 1.2 | \n",
80 | "
\n",
81 | " \n",
82 | " | 4 | \n",
83 | " 1 | \n",
84 | " 5 | \n",
85 | " 1.1 | \n",
86 | "
\n",
87 | " \n",
88 | "
\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 | " df | \n",
149 | " sum_sq | \n",
150 | " mean_sq | \n",
151 | " F | \n",
152 | " PR(>F) | \n",
153 | "
\n",
154 | " \n",
155 | " \n",
156 | " \n",
157 | " | C(Chemical) | \n",
158 | " 3.0 | \n",
159 | " 18.044 | \n",
160 | " 6.014667 | \n",
161 | " 75.894848 | \n",
162 | " 4.518310e-08 | \n",
163 | "
\n",
164 | " \n",
165 | " | C(Fabric) | \n",
166 | " 4.0 | \n",
167 | " 6.693 | \n",
168 | " 1.673250 | \n",
169 | " 21.113565 | \n",
170 | " 2.318913e-05 | \n",
171 | "
\n",
172 | " \n",
173 | " | Residual | \n",
174 | " 12.0 | \n",
175 | " 0.951 | \n",
176 | " 0.079250 | \n",
177 | " NaN | \n",
178 | " NaN | \n",
179 | "
\n",
180 | " \n",
181 | "
\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 | " mfr | \n",
50 | " carline | \n",
51 | " cartruck | \n",
52 | " cid | \n",
53 | " rhp | \n",
54 | " trns | \n",
55 | " drv | \n",
56 | " od | \n",
57 | " etw | \n",
58 | " cmp | \n",
59 | " axle | \n",
60 | " n/v | \n",
61 | " a/c | \n",
62 | " hc | \n",
63 | " co | \n",
64 | " co2 | \n",
65 | " mpg | \n",
66 | " nv | \n",
67 | "
\n",
68 | " \n",
69 | " \n",
70 | " \n",
71 | " | 0 | \n",
72 | " 20 | \n",
73 | " 300C/SRT-8 | \n",
74 | " C | \n",
75 | " 215 | \n",
76 | " 253 | \n",
77 | " L5 | \n",
78 | " 4 | \n",
79 | " 2 | \n",
80 | " 4500 | \n",
81 | " 9.9 | \n",
82 | " 3.07 | \n",
83 | " 30.9 | \n",
84 | " Y | \n",
85 | " 0.011 | \n",
86 | " 0.09 | \n",
87 | " 288 | \n",
88 | " 30.8 | \n",
89 | " 30.9 | \n",
90 | "
\n",
91 | " \n",
92 | " | 1 | \n",
93 | " 20 | \n",
94 | " CARAVAN2WD | \n",
95 | " T | \n",
96 | " 201 | \n",
97 | " 180 | \n",
98 | " L4 | \n",
99 | " F | \n",
100 | " 2 | \n",
101 | " 4500 | \n",
102 | " 9.3 | \n",
103 | " 2.49 | \n",
104 | " 32.3 | \n",
105 | " Y | \n",
106 | " 0.014 | \n",
107 | " 0.11 | \n",
108 | " 274 | \n",
109 | " 32.5 | \n",
110 | " 32.3 | \n",
111 | "
\n",
112 | " \n",
113 | " | 2 | \n",
114 | " 20 | \n",
115 | " CROSSFIREROADSTER | \n",
116 | " C | \n",
117 | " 196 | \n",
118 | " 168 | \n",
119 | " L5 | \n",
120 | " R | \n",
121 | " 2 | \n",
122 | " 3375 | \n",
123 | " 10.0 | \n",
124 | " 3.27 | \n",
125 | " 37.1 | \n",
126 | " Y | \n",
127 | " 0.001 | \n",
128 | " 0.02 | \n",
129 | " 250 | \n",
130 | " 35.4 | \n",
131 | " 37.1 | \n",
132 | "
\n",
133 | " \n",
134 | " | 3 | \n",
135 | " 20 | \n",
136 | " DAKOTAPICKUP2WD | \n",
137 | " T | \n",
138 | " 226 | \n",
139 | " 210 | \n",
140 | " L4 | \n",
141 | " R | \n",
142 | " 2 | \n",
143 | " 4500 | \n",
144 | " 9.2 | \n",
145 | " 3.55 | \n",
146 | " 29.6 | \n",
147 | " Y | \n",
148 | " 0.012 | \n",
149 | " 0.04 | \n",
150 | " 316 | \n",
151 | " 28.1 | \n",
152 | " 29.6 | \n",
153 | "
\n",
154 | " \n",
155 | " | 4 | \n",
156 | " 20 | \n",
157 | " DAKOTAPICKUP4WD | \n",
158 | " T | \n",
159 | " 226 | \n",
160 | " 210 | \n",
161 | " L4 | \n",
162 | " 4 | \n",
163 | " 2 | \n",
164 | " 5000 | \n",
165 | " 9.2 | \n",
166 | " 3.55 | \n",
167 | " 29.6 | \n",
168 | " Y | \n",
169 | " 0.011 | \n",
170 | " 0.05 | \n",
171 | " 365 | \n",
172 | " 24.4 | \n",
173 | " 29.6 | \n",
174 | "
\n",
175 | " \n",
176 | "
\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 | "OLS Regression Results\n",
216 | "\n",
217 | " | Dep. Variable: | mpg | R-squared: | 0.911 | \n",
218 | "
\n",
219 | "\n",
220 | " | Model: | OLS | Adj. R-squared: | 0.852 | \n",
221 | "
\n",
222 | "\n",
223 | " | Method: | Least Squares | F-statistic: | 15.38 | \n",
224 | "
\n",
225 | "\n",
226 | " | Date: | Thu, 09 Nov 2017 | Prob (F-statistic): | 3.26e-05 | \n",
227 | "
\n",
228 | "\n",
229 | " | Time: | 15:10:29 | Log-Likelihood: | -40.441 | \n",
230 | "
\n",
231 | "\n",
232 | " | No. Observations: | 21 | AIC: | 98.88 | \n",
233 | "
\n",
234 | "\n",
235 | " | Df Residuals: | 12 | BIC: | 108.3 | \n",
236 | "
\n",
237 | "\n",
238 | " | Df Model: | 8 | | | \n",
239 | "
\n",
240 | "\n",
241 | " | Covariance Type: | nonrobust | | | \n",
242 | "
\n",
243 | "
\n",
244 | "\n",
245 | "\n",
246 | " | coef | std err | t | P>|t| | [0.025 | 0.975] | \n",
247 | "
\n",
248 | "\n",
249 | " | Intercept | 40.1560 | 21.300 | 1.885 | 0.084 | -6.253 | 86.566 | \n",
250 | "
\n",
251 | "\n",
252 | " | C(trns)[T.L5] | 0.2290 | 1.519 | 0.151 | 0.883 | -3.082 | 3.540 | \n",
253 | "
\n",
254 | "\n",
255 | " | C(trns)[T.M6] | -3.0605 | 2.479 | -1.235 | 0.241 | -8.462 | 2.340 | \n",
256 | "
\n",
257 | "\n",
258 | " | cid | -0.0012 | 0.028 | -0.044 | 0.965 | -0.062 | 0.059 | \n",
259 | "
\n",
260 | "\n",
261 | " | rhp | 0.0009 | 0.017 | 0.051 | 0.960 | -0.036 | 0.038 | \n",
262 | "
\n",
263 | "\n",
264 | " | etw | -0.0041 | 0.001 | -3.749 | 0.003 | -0.006 | -0.002 | \n",
265 | "
\n",
266 | "\n",
267 | " | cmp | 0.6537 | 1.755 | 0.373 | 0.716 | -3.169 | 4.477 | \n",
268 | "
\n",
269 | "\n",
270 | " | axle | -2.5755 | 1.606 | -1.604 | 0.135 | -6.075 | 0.924 | \n",
271 | "
\n",
272 | "\n",
273 | " | nv | 0.3060 | 0.304 | 1.005 | 0.335 | -0.357 | 0.969 | \n",
274 | "
\n",
275 | "
\n",
276 | "\n",
277 | "\n",
278 | " | Omnibus: | 5.036 | Durbin-Watson: | 1.873 | \n",
279 | "
\n",
280 | "\n",
281 | " | Prob(Omnibus): | 0.081 | Jarque-Bera (JB): | 3.370 | \n",
282 | "
\n",
283 | "\n",
284 | " | Skew: | -0.391 | Prob(JB): | 0.185 | \n",
285 | "
\n",
286 | "\n",
287 | " | Kurtosis: | 4.800 | Cond. No. | 1.97e+05 | \n",
288 | "
\n",
289 | "
"
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 | " mean | \n",
384 | " mean_se | \n",
385 | " mean_ci_lower | \n",
386 | " mean_ci_upper | \n",
387 | " obs_ci_lower | \n",
388 | " obs_ci_upper | \n",
389 | "
\n",
390 | " \n",
391 | " \n",
392 | " \n",
393 | " | 0 | \n",
394 | " 26.655669 | \n",
395 | " 2.850189 | \n",
396 | " 20.445641 | \n",
397 | " 32.865697 | \n",
398 | " 18.816151 | \n",
399 | " 34.495187 | \n",
400 | "
\n",
401 | " \n",
402 | "
\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 | " A | \n",
70 | " B | \n",
71 | " Cur | \n",
72 | " Resp | \n",
73 | "
\n",
74 | " \n",
75 | " \n",
76 | " \n",
77 | " | 0 | \n",
78 | " 0 | \n",
79 | " 0 | \n",
80 | " center | \n",
81 | " 40.3 | \n",
82 | "
\n",
83 | " \n",
84 | " | 1 | \n",
85 | " 0 | \n",
86 | " 0 | \n",
87 | " center | \n",
88 | " 40.5 | \n",
89 | "
\n",
90 | " \n",
91 | " | 2 | \n",
92 | " 0 | \n",
93 | " 0 | \n",
94 | " center | \n",
95 | " 40.7 | \n",
96 | "
\n",
97 | " \n",
98 | " | 3 | \n",
99 | " 0 | \n",
100 | " 0 | \n",
101 | " center | \n",
102 | " 40.2 | \n",
103 | "
\n",
104 | " \n",
105 | " | 4 | \n",
106 | " 0 | \n",
107 | " 0 | \n",
108 | " center | \n",
109 | " 40.6 | \n",
110 | "
\n",
111 | " \n",
112 | " | 5 | \n",
113 | " 1 | \n",
114 | " 1 | \n",
115 | " not | \n",
116 | " 41.5 | \n",
117 | "
\n",
118 | " \n",
119 | " | 6 | \n",
120 | " 1 | \n",
121 | " -1 | \n",
122 | " not | \n",
123 | " 40.9 | \n",
124 | "
\n",
125 | " \n",
126 | " | 7 | \n",
127 | " -1 | \n",
128 | " 1 | \n",
129 | " not | \n",
130 | " 40.0 | \n",
131 | "
\n",
132 | " \n",
133 | " | 8 | \n",
134 | " -1 | \n",
135 | " -1 | \n",
136 | " not | \n",
137 | " 39.3 | \n",
138 | "
\n",
139 | " \n",
140 | "
\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 | "OLS Regression Results\n",
176 | "\n",
177 | " | Dep. Variable: | Resp | R-squared: | 0.943 | \n",
178 | "
\n",
179 | "\n",
180 | " | Model: | OLS | Adj. R-squared: | 0.885 | \n",
181 | "
\n",
182 | "\n",
183 | " | Method: | Least Squares | F-statistic: | 16.45 | \n",
184 | "
\n",
185 | "\n",
186 | " | Date: | Thu, 14 Dec 2017 | Prob (F-statistic): | 0.00947 | \n",
187 | "
\n",
188 | "\n",
189 | " | Time: | 13:39:52 | Log-Likelihood: | 5.0382 | \n",
190 | "
\n",
191 | "\n",
192 | " | No. Observations: | 9 | AIC: | -0.07647 | \n",
193 | "
\n",
194 | "\n",
195 | " | Df Residuals: | 4 | BIC: | 0.9096 | \n",
196 | "
\n",
197 | "\n",
198 | " | Df Model: | 4 | | | \n",
199 | "
\n",
200 | "\n",
201 | " | Covariance Type: | nonrobust | | | \n",
202 | "
\n",
203 | "
\n",
204 | "\n",
205 | "\n",
206 | " | coef | std err | t | P>|t| | [0.025 | 0.975] | \n",
207 | "
\n",
208 | "\n",
209 | " | Intercept | 40.4600 | 0.093 | 436.291 | 0.000 | 40.203 | 40.717 | \n",
210 | "
\n",
211 | "\n",
212 | " | C(Cur)[T.not] | -0.0350 | 0.139 | -0.252 | 0.814 | -0.421 | 0.351 | \n",
213 | "
\n",
214 | "\n",
215 | " | A | 0.7750 | 0.104 | 7.475 | 0.002 | 0.487 | 1.063 | \n",
216 | "
\n",
217 | "\n",
218 | " | B | 0.3250 | 0.104 | 3.135 | 0.035 | 0.037 | 0.613 | \n",
219 | "
\n",
220 | "\n",
221 | " | A:B | -0.0250 | 0.104 | -0.241 | 0.821 | -0.313 | 0.263 | \n",
222 | "
\n",
223 | "
\n",
224 | "\n",
225 | "\n",
226 | " | Omnibus: | 0.506 | Durbin-Watson: | 2.963 | \n",
227 | "
\n",
228 | "\n",
229 | " | Prob(Omnibus): | 0.777 | Jarque-Bera (JB): | 0.098 | \n",
230 | "
\n",
231 | "\n",
232 | " | Skew: | -0.212 | Prob(JB): | 0.952 | \n",
233 | "
\n",
234 | "\n",
235 | " | Kurtosis: | 2.717 | Cond. No. | 2.51 | \n",
236 | "
\n",
237 | "
"
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 | " df | \n",
310 | " sum_sq | \n",
311 | " mean_sq | \n",
312 | " F | \n",
313 | " PR(>F) | \n",
314 | "
\n",
315 | " \n",
316 | " \n",
317 | " \n",
318 | " | C(Cur) | \n",
319 | " 1.0 | \n",
320 | " 0.002722 | \n",
321 | " 0.002722 | \n",
322 | " 0.063307 | \n",
323 | " 0.813741 | \n",
324 | "
\n",
325 | " \n",
326 | " | A | \n",
327 | " 1.0 | \n",
328 | " 2.402500 | \n",
329 | " 2.402500 | \n",
330 | " 55.872093 | \n",
331 | " 0.001713 | \n",
332 | "
\n",
333 | " \n",
334 | " | B | \n",
335 | " 1.0 | \n",
336 | " 0.422500 | \n",
337 | " 0.422500 | \n",
338 | " 9.825581 | \n",
339 | " 0.035030 | \n",
340 | "
\n",
341 | " \n",
342 | " | A:B | \n",
343 | " 1.0 | \n",
344 | " 0.002500 | \n",
345 | " 0.002500 | \n",
346 | " 0.058140 | \n",
347 | " 0.821316 | \n",
348 | "
\n",
349 | " \n",
350 | " | Residual | \n",
351 | " 4.0 | \n",
352 | " 0.172000 | \n",
353 | " 0.043000 | \n",
354 | " NaN | \n",
355 | " NaN | \n",
356 | "
\n",
357 | " \n",
358 | "
\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 | "OLS Regression Results\n",
389 | "\n",
390 | " | Dep. Variable: | Resp | R-squared: | 0.941 | \n",
391 | "
\n",
392 | "\n",
393 | " | Model: | OLS | Adj. R-squared: | 0.921 | \n",
394 | "
\n",
395 | "\n",
396 | " | Method: | Least Squares | F-statistic: | 47.82 | \n",
397 | "
\n",
398 | "\n",
399 | " | Date: | Thu, 14 Dec 2017 | Prob (F-statistic): | 0.000206 | \n",
400 | "
\n",
401 | "\n",
402 | " | Time: | 13:39:52 | Log-Likelihood: | 4.9036 | \n",
403 | "
\n",
404 | "\n",
405 | " | No. Observations: | 9 | AIC: | -3.807 | \n",
406 | "
\n",
407 | "\n",
408 | " | Df Residuals: | 6 | BIC: | -3.216 | \n",
409 | "
\n",
410 | "\n",
411 | " | Df Model: | 2 | | | \n",
412 | "
\n",
413 | "\n",
414 | " | Covariance Type: | nonrobust | | | \n",
415 | "
\n",
416 | "
\n",
417 | "\n",
418 | "\n",
419 | " | coef | std err | t | P>|t| | [0.025 | 0.975] | \n",
420 | "
\n",
421 | "\n",
422 | " | Intercept | 40.4444 | 0.057 | 705.987 | 0.000 | 40.304 | 40.585 | \n",
423 | "
\n",
424 | "\n",
425 | " | A | 0.7750 | 0.086 | 9.019 | 0.000 | 0.565 | 0.985 | \n",
426 | "
\n",
427 | "\n",
428 | " | B | 0.3250 | 0.086 | 3.782 | 0.009 | 0.115 | 0.535 | \n",
429 | "
\n",
430 | "
\n",
431 | "\n",
432 | "\n",
433 | " | Omnibus: | 0.188 | Durbin-Watson: | 3.019 | \n",
434 | "
\n",
435 | "\n",
436 | " | Prob(Omnibus): | 0.910 | Jarque-Bera (JB): | 0.098 | \n",
437 | "
\n",
438 | "\n",
439 | " | Skew: | 0.114 | Prob(JB): | 0.952 | \n",
440 | "
\n",
441 | "\n",
442 | " | Kurtosis: | 2.543 | Cond. No. | 1.50 | \n",
443 | "
\n",
444 | "
"
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 | " df | \n",
515 | " sum_sq | \n",
516 | " mean_sq | \n",
517 | " F | \n",
518 | " PR(>F) | \n",
519 | "
\n",
520 | " \n",
521 | " \n",
522 | " \n",
523 | " | A | \n",
524 | " 1.0 | \n",
525 | " 2.402500 | \n",
526 | " 2.402500 | \n",
527 | " 81.338558 | \n",
528 | " 0.000104 | \n",
529 | "
\n",
530 | " \n",
531 | " | B | \n",
532 | " 1.0 | \n",
533 | " 0.422500 | \n",
534 | " 0.422500 | \n",
535 | " 14.304075 | \n",
536 | " 0.009158 | \n",
537 | "
\n",
538 | " \n",
539 | " | Residual | \n",
540 | " 6.0 | \n",
541 | " 0.177222 | \n",
542 | " 0.029537 | \n",
543 | " NaN | \n",
544 | " NaN | \n",
545 | "
\n",
546 | " \n",
547 | "
\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 | " obs | \n",
53 | " tiempo | \n",
54 | "
\n",
55 | " \n",
56 | " \n",
57 | " \n",
58 | " | 0 | \n",
59 | " 1 | \n",
60 | " 0.25 | \n",
61 | "
\n",
62 | " \n",
63 | " | 1 | \n",
64 | " 2 | \n",
65 | " 0.10 | \n",
66 | "
\n",
67 | " \n",
68 | " | 2 | \n",
69 | " 3 | \n",
70 | " 0.08 | \n",
71 | "
\n",
72 | " \n",
73 | " | 3 | \n",
74 | " 4 | \n",
75 | " 0.01 | \n",
76 | "
\n",
77 | " \n",
78 | " | 4 | \n",
79 | " 5 | \n",
80 | " 1.17 | \n",
81 | "
\n",
82 | " \n",
83 | "
\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 | " Hardwood | \n",
59 | " Strength | \n",
60 | "
\n",
61 | " \n",
62 | " \n",
63 | " \n",
64 | " | 0 | \n",
65 | " 5 | \n",
66 | " 7 | \n",
67 | "
\n",
68 | " \n",
69 | " | 1 | \n",
70 | " 5 | \n",
71 | " 8 | \n",
72 | "
\n",
73 | " \n",
74 | " | 2 | \n",
75 | " 5 | \n",
76 | " 15 | \n",
77 | "
\n",
78 | " \n",
79 | " | 3 | \n",
80 | " 5 | \n",
81 | " 11 | \n",
82 | "
\n",
83 | " \n",
84 | " | 4 | \n",
85 | " 5 | \n",
86 | " 9 | \n",
87 | "
\n",
88 | " \n",
89 | "
\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 | "OLS Regression Results\n",
151 | "\n",
152 | " | Dep. Variable: | Strength | R-squared: | 0.746 | \n",
153 | "
\n",
154 | "\n",
155 | " | Model: | OLS | Adj. R-squared: | 0.708 | \n",
156 | "
\n",
157 | "\n",
158 | " | Method: | Least Squares | F-statistic: | 19.61 | \n",
159 | "
\n",
160 | "\n",
161 | " | Date: | Tue, 21 Nov 2017 | Prob (F-statistic): | 3.59e-06 | \n",
162 | "
\n",
163 | "\n",
164 | " | Time: | 10:25:37 | Log-Likelihood: | -54.344 | \n",
165 | "
\n",
166 | "\n",
167 | " | No. Observations: | 24 | AIC: | 116.7 | \n",
168 | "
\n",
169 | "\n",
170 | " | Df Residuals: | 20 | BIC: | 121.4 | \n",
171 | "
\n",
172 | "\n",
173 | " | Df Model: | 3 | | | \n",
174 | "
\n",
175 | "\n",
176 | " | Covariance Type: | nonrobust | | | \n",
177 | "
\n",
178 | "
\n",
179 | "\n",
180 | "\n",
181 | " | coef | std err | t | P>|t| | [0.025 | 0.975] | \n",
182 | "
\n",
183 | "\n",
184 | " | Intercept | 10.0000 | 1.041 | 9.602 | 0.000 | 7.827 | 12.173 | \n",
185 | "
\n",
186 | "\n",
187 | " | C(Hardwood)[T.10] | 5.6667 | 1.473 | 3.847 | 0.001 | 2.594 | 8.739 | \n",
188 | "
\n",
189 | "\n",
190 | " | C(Hardwood)[T.15] | 7.0000 | 1.473 | 4.753 | 0.000 | 3.928 | 10.072 | \n",
191 | "
\n",
192 | "\n",
193 | " | C(Hardwood)[T.20] | 11.1667 | 1.473 | 7.581 | 0.000 | 8.094 | 14.239 | \n",
194 | "
\n",
195 | "
\n",
196 | "\n",
197 | "\n",
198 | " | Omnibus: | 0.929 | Durbin-Watson: | 2.181 | \n",
199 | "
\n",
200 | "\n",
201 | " | Prob(Omnibus): | 0.628 | Jarque-Bera (JB): | 0.861 | \n",
202 | "
\n",
203 | "\n",
204 | " | Skew: | 0.248 | Prob(JB): | 0.650 | \n",
205 | "
\n",
206 | "\n",
207 | " | Kurtosis: | 2.215 | Cond. No. | 4.79 | \n",
208 | "
\n",
209 | "
"
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 | " df | \n",
309 | " sum_sq | \n",
310 | " mean_sq | \n",
311 | " F | \n",
312 | " PR(>F) | \n",
313 | "
\n",
314 | " \n",
315 | " \n",
316 | " \n",
317 | " | C(Hardwood) | \n",
318 | " 3.0 | \n",
319 | " 382.791667 | \n",
320 | " 127.597222 | \n",
321 | " 19.605207 | \n",
322 | " 0.000004 | \n",
323 | "
\n",
324 | " \n",
325 | " | Residual | \n",
326 | " 20.0 | \n",
327 | " 130.166667 | \n",
328 | " 6.508333 | \n",
329 | " NaN | \n",
330 | " NaN | \n",
331 | "
\n",
332 | " \n",
333 | "
\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 | "Multiple Comparison of Means - Tukey HSD,FWER=0.05\n",
377 | "\n",
378 | " | group1 | group2 | meandiff | lower | upper | reject | \n",
379 | "
\n",
380 | "\n",
381 | " | 5 | 10 | 5.6667 | 1.5439 | 9.7894 | True | \n",
382 | "
\n",
383 | "\n",
384 | " | 5 | 15 | 7.0 | 2.8773 | 11.1227 | True | \n",
385 | "
\n",
386 | "\n",
387 | " | 5 | 20 | 11.1667 | 7.0439 | 15.2894 | True | \n",
388 | "
\n",
389 | "\n",
390 | " | 10 | 15 | 1.3333 | -2.7894 | 5.4561 | False | \n",
391 | "
\n",
392 | "\n",
393 | " | 10 | 20 | 5.5 | 1.3773 | 9.6227 | True | \n",
394 | "
\n",
395 | "\n",
396 | " | 15 | 20 | 4.1667 | 0.0439 | 8.2894 | True | \n",
397 | "
\n",
398 | "
"
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 |
--------------------------------------------------------------------------------