From a6326bcaf6b56bb173d34fd2d966abdb97603cae Mon Sep 17 00:00:00 2001 From: Ross Date: Sun, 24 May 2020 10:16:25 +0100 Subject: [PATCH] update --- .gitignore | 1 + .vscode/launch.json | 10 +- .~lock.trainees.csv# | 2 +- current.log | 252 ++++++------ extended proc nights only.log | 234 ++++++----- nights + proc twighlights + proc weekends.log | 121 ------ no nights.log | 252 +++++------- no twighlights.log | 259 ++++++------ no weekends.log | 178 ++++---- run.py | 26 +- s.js | 99 +++++ shifts.py | 382 +++++++++++++++--- test.py | 44 +- timetable.css | 81 ++++ workers.py | 6 +- 15 files changed, 1138 insertions(+), 809 deletions(-) delete mode 100644 nights + proc twighlights + proc weekends.log create mode 100644 s.js create mode 100644 timetable.css diff --git a/.gitignore b/.gitignore index 2ef41a4..2a60edd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ trainees.csv sample.txt *.csv *.html +*.log diff --git a/.vscode/launch.json b/.vscode/launch.json index 6206fe8..7e42e1c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,12 +4,20 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { "name": "Python: Test", "type": "python", "request": "launch", "program": "${workspaceFolder}/test.py", "console": "integratedTerminal" - } + }, + { + "name": "Python: Run", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/run.py", + "console": "integratedTerminal" + }, ] } \ No newline at end of file diff --git a/.~lock.trainees.csv# b/.~lock.trainees.csv# index 09ebca7..082f3b6 100644 --- a/.~lock.trainees.csv# +++ b/.~lock.trainees.csv# @@ -1 +1 @@ -,ross,maverick.fritz.box,16.05.2020 17:19,file:///home/ross/.config/libreoffice/4; \ No newline at end of file +,ross,maverick.fritz.box,22.05.2020 22:23,file:///home/ross/.config/libreoffice/4; \ No newline at end of file diff --git a/current.log b/current.log index 769bb33..4313bdf 100644 --- a/current.log +++ b/current.log @@ -1,140 +1,156 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmpgzf8zbpg.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpgzf8zbpg.pyomo.soln'] +Solver command line: ['/usr/bin/cbc', '-seconds', '10200', '-allow', '2000', '-printingOptions', 'all', '-import', '/tmp/tmpkbbun619.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpkbbun619.pyomo.soln'] Welcome to the CBC MILP Solver Version: 2.9.9 Build Date: Aug 7 2019 -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmpgzf8zbpg.pyomo.lp -stat=1 -solve -solu /tmp/tmpgzf8zbpg.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 +command line - /usr/bin/cbc -seconds 10200 -allow 2000 -printingOptions all -import /tmp/tmpkbbun619.pyomo.lp -stat=1 -solve -solu /tmp/tmpkbbun619.pyomo.soln (default strategy 1) +seconds was changed from 1e+100 to 10200 +allowableGap was changed from 1e-10 to 2000 Option for printingOptions changed from normal to all -Presolve 63617 (-74184) rows, 25986 (-83735) columns and 256502 (-851515) elements +Presolve 51518 (-72663) rows, 21211 (-76730) columns and 209445 (-787248) elements Statistics for presolved model -Original problem has 109096 integers (108160 of which binary) -Presolved problem has 25896 integers (25688 of which binary) -==== 21788 zero objective 4 different -21788 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -2638 variables have objective of 1000 +Original problem has 97028 integers (96096 of which binary) +Presolved problem has 20875 integers (20459 of which binary) +==== 19514 zero objective 4 different +19514 variables have objective of 0 +1233 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 ==== absolute objective values 4 different -21788 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -2638 variables have objective of 1000 -==== for integers 21788 zero objective 4 different -21788 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -2548 variables have objective of 1000 -==== for integers absolute objective values 4 different -21788 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -2548 variables have objective of 1000 +19514 variables have objective of 0 +1233 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== for integers 19322 zero objective 3 different +19322 variables have objective of 0 +1137 variables have objective of 1 +416 variables have objective of 20 +==== for integers absolute objective values 3 different +19322 variables have objective of 0 +1137 variables have objective of 1 +416 variables have objective of 20 ===== end objective counts -Problem has 63617 rows, 25986 columns (4198 with objective) and 256502 elements -There are 1650 singletons with objective +Problem has 51518 rows, 21211 columns (1697 with objective) and 209445 elements +There are 1649 singletons with objective Column breakdown: -298 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, +752 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, 0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 25688 of type 0.0->1.0 +0 of type -inf->0.0, 0 of type -inf->up, 20459 of type 0.0->1.0 Row breakdown: -2704 of type E 0.0, 676 of type E 1.0, 0 of type E -1.0, -279 of type E other, 0 of type G 0.0, 0 of type G 1.0, -418 of type G other, 5408 of type L 0.0, 49868 of type L 1.0, -1560 of type L other, 0 of type Range 0.0->1.0, 2704 of type Range other, +2273 of type E 0.0, 676 of type E 1.0, 208 of type E -1.0, +378 of type E other, 0 of type G 0.0, 52 of type G 1.0, +43 of type G other, 3411 of type L 0.0, 41843 of type L 1.0, +2634 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 0 of type Free -Continuous objective value is 178488 - 30.16 seconds -Cgl0002I 75712 variables fixed -Cgl0003I 0 fixed, 208 tightened bounds, 37490 strengthened rows, 47518 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1438 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions -Cgl0004I processed model has 24041 rows, 16522 columns (16432 integer (16224 of which binary)) and 124218 elements -Cbc0038I Initial state - 1405 integers unsatisfied sum - 471.24 -Cbc0038I Pass 1: (45.34 seconds) suminf. 304.35185 (762) obj. 223295 iterations 6320 -Cbc0038I Pass 2: (45.54 seconds) suminf. 259.90250 (677) obj. 229665 iterations 1456 -Cbc0038I Pass 3: (45.71 seconds) suminf. 237.42785 (612) obj. 231568 iterations 757 -Cbc0038I Pass 4: (45.76 seconds) suminf. 234.36193 (605) obj. 231838 iterations 256 -Cbc0038I Pass 5: (45.80 seconds) suminf. 233.19893 (597) obj. 232546 iterations 202 -Cbc0038I Pass 6: (45.83 seconds) suminf. 232.04656 (590) obj. 233310 iterations 71 -Cbc0038I Pass 7: (45.86 seconds) suminf. 231.54656 (589) obj. 233360 iterations 8 -Cbc0038I Pass 8: (45.89 seconds) suminf. 231.31610 (590) obj. 233360 iterations 40 -Cbc0038I Pass 9: (45.92 seconds) suminf. 229.14180 (587) obj. 233352 iterations 22 -Cbc0038I Pass 10: (45.94 seconds) suminf. 229.14180 (587) obj. 233352 iterations 1 -Cbc0038I Pass 11: (45.98 seconds) suminf. 219.44422 (557) obj. 231301 iterations 113 -Cbc0038I Pass 12: (46.02 seconds) suminf. 212.43029 (535) obj. 229437 iterations 116 -Cbc0038I Pass 13: (46.03 seconds) suminf. 212.43029 (535) obj. 229437 iterations 0 -Cbc0038I Pass 14: (46.06 seconds) suminf. 208.43029 (527) obj. 229837 iterations 31 -Cbc0038I Pass 15: (46.08 seconds) suminf. 208.43029 (527) obj. 229837 iterations 1 -Cbc0038I Pass 16: (46.11 seconds) suminf. 204.43029 (519) obj. 230237 iterations 18 -Cbc0038I Pass 17: (46.14 seconds) suminf. 204.43029 (519) obj. 230237 iterations 3 -Cbc0038I Pass 18: (46.17 seconds) suminf. 196.93029 (504) obj. 230987 iterations 35 -Cbc0038I Pass 19: (46.19 seconds) suminf. 196.93029 (504) obj. 230987 iterations 2 -Cbc0038I Pass 20: (46.22 seconds) suminf. 189.43029 (489) obj. 231737 iterations 25 -Cbc0038I Pass 21: (46.25 seconds) suminf. 189.43029 (489) obj. 231737 iterations 6 -Cbc0038I Pass 22: (46.27 seconds) suminf. 184.43029 (479) obj. 232237 iterations 25 -Cbc0038I Pass 23: (46.30 seconds) suminf. 184.43029 (479) obj. 232237 iterations 4 -Cbc0038I Pass 24: (46.33 seconds) suminf. 178.43029 (467) obj. 232837 iterations 25 -Cbc0038I Pass 25: (46.36 seconds) suminf. 178.43029 (467) obj. 232837 iterations 3 -Cbc0038I Pass 26: (46.38 seconds) suminf. 175.93029 (462) obj. 233087 iterations 16 -Cbc0038I Pass 27: (46.41 seconds) suminf. 175.93029 (462) obj. 233087 iterations 5 -Cbc0038I Pass 28: (46.44 seconds) suminf. 174.93029 (460) obj. 233187 iterations 7 -Cbc0038I Pass 29: (46.46 seconds) suminf. 174.93029 (460) obj. 233187 iterations 1 -Cbc0038I Pass 30: (46.49 seconds) suminf. 173.43029 (457) obj. 233337 iterations 6 +Continuous objective value is 2592.5 - 16.65 seconds +Cgl0002I 71445 variables fixed +Cgl0003I 0 fixed, 416 tightened bounds, 34673 strengthened rows, 40175 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 7041 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 2803 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 708 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 2 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions +Cgl0004I processed model has 18110 rows, 13274 columns (12938 integer (12522 of which binary)) and 109434 elements +Cbc0038I Initial state - 1221 integers unsatisfied sum - 351.402 +Cbc0038I Pass 1: (30.58 seconds) suminf. 155.95883 (336) obj. 5432.65 iterations 6635 +Cbc0038I Pass 2: (30.65 seconds) suminf. 142.79755 (306) obj. 5456.2 iterations 563 +Cbc0038I Pass 3: (30.69 seconds) suminf. 137.30963 (290) obj. 5386.89 iterations 259 +Cbc0038I Pass 4: (30.72 seconds) suminf. 137.30963 (290) obj. 5386.89 iterations 1 +Cbc0038I Pass 5: (30.75 seconds) suminf. 122.80963 (261) obj. 5401.39 iterations 61 +Cbc0038I Pass 6: (30.78 seconds) suminf. 109.80963 (235) obj. 5414.39 iterations 52 +Cbc0038I Pass 7: (30.82 seconds) suminf. 99.30963 (214) obj. 5424.89 iterations 76 +Cbc0038I Pass 8: (30.85 seconds) suminf. 94.30963 (204) obj. 5429.89 iterations 23 +Cbc0038I Pass 9: (30.88 seconds) suminf. 85.30963 (186) obj. 5438.89 iterations 44 +Cbc0038I Pass 10: (30.91 seconds) suminf. 78.30963 (172) obj. 5445.89 iterations 37 +Cbc0038I Pass 11: (30.94 seconds) suminf. 64.21464 (142) obj. 5454.39 iterations 83 +Cbc0038I Pass 12: (30.97 seconds) suminf. 63.71079 (139) obj. 5454.39 iterations 34 +Cbc0038I Pass 13: (31.00 seconds) suminf. 54.21079 (120) obj. 5454.89 iterations 81 +Cbc0038I Pass 14: (31.03 seconds) suminf. 54.21079 (120) obj. 5454.89 iterations 19 +Cbc0038I Pass 15: (31.07 seconds) suminf. 53.21079 (118) obj. 5455.39 iterations 30 +Cbc0038I Pass 16: (31.10 seconds) suminf. 53.21079 (118) obj. 5455.39 iterations 33 +Cbc0038I Pass 17: (31.13 seconds) suminf. 51.71079 (115) obj. 5455.39 iterations 30 +Cbc0038I Pass 18: (31.16 seconds) suminf. 51.71079 (115) obj. 5455.39 iterations 32 +Cbc0038I Pass 19: (31.19 seconds) suminf. 48.71079 (109) obj. 5455.39 iterations 67 +Cbc0038I Pass 20: (31.22 seconds) suminf. 48.71079 (109) obj. 5455.39 iterations 24 +Cbc0038I Pass 21: (31.25 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 47 +Cbc0038I Pass 22: (31.29 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 38 +Cbc0038I Pass 23: (31.32 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 33 +Cbc0038I Pass 24: (31.39 seconds) suminf. 34.01332 (85) obj. 6407.55 iterations 843 +Cbc0038I Pass 25: (31.45 seconds) suminf. 33.38400 (83) obj. 6693.38 iterations 513 +Cbc0038I Pass 26: (31.46 seconds) suminf. 33.38400 (83) obj. 6693.38 iterations 0 +Cbc0038I Pass 27: (31.49 seconds) suminf. 31.78323 (80) obj. 6694.38 iterations 61 +Cbc0038I Pass 28: (31.52 seconds) suminf. 31.78323 (80) obj. 6694.38 iterations 28 +Cbc0038I Pass 29: (31.55 seconds) suminf. 31.78323 (80) obj. 6694.38 iterations 6 +Cbc0038I Pass 30: (31.58 seconds) suminf. 31.78323 (80) obj. 6694.38 iterations 24 Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 14611 integers at bound fixed and 43 continuous -Cbc0038I Mini branch and bound did not improve solution (46.52 seconds) -Cbc0038I After 46.52 seconds - Feasibility pump exiting - took 3.36 seconds -Cbc0031I 552 added rows had average density of 29.197464 -Cbc0013I At root node, 552 cuts changed objective from 188237.94 to 222332.75 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 3440 row cuts average 3.4 elements, 0 column cuts (0 active) in 3.913 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 2373 row cuts average 245.7 elements, 0 column cuts (0 active) in 7.187 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 1879 row cuts average 2.3 elements, 0 column cuts (0 active) in 0.268 seconds - new frequency is 1 -Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.095 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 1177 row cuts average 13.5 elements, 0 column cuts (0 active) in 0.242 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.039 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 3221 row cuts average 43.5 elements, 0 column cuts (0 active) in 4.283 seconds - new frequency is 1 -Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 222332.75 (95.56 seconds) -Cbc0010I After 100 nodes, 58 on tree, 1e+50 best solution, best possible 222332.75 (140.65 seconds) -Cbc0010I After 200 nodes, 109 on tree, 1e+50 best solution, best possible 222332.75 (153.72 seconds) -Cbc0010I After 300 nodes, 159 on tree, 1e+50 best solution, best possible 222332.75 (166.84 seconds) -Cbc0010I After 400 nodes, 211 on tree, 1e+50 best solution, best possible 222332.75 (180.19 seconds) -Cbc0010I After 500 nodes, 260 on tree, 1e+50 best solution, best possible 222332.75 (194.37 seconds) -Cbc0010I After 600 nodes, 312 on tree, 1e+50 best solution, best possible 222332.75 (208.13 seconds) -Cbc0010I After 700 nodes, 363 on tree, 1e+50 best solution, best possible 222332.75 (223.59 seconds) -Cbc0010I After 800 nodes, 412 on tree, 1e+50 best solution, best possible 222332.75 (239.21 seconds) -Cbc0012I Integer solution of 225548.92 found by rounding after 83817 iterations and 877 nodes (249.96 seconds) -Cbc0038I Full problem 24041 rows 16522 columns, reduced to 0 rows 0 columns -Cbc0038I Full problem 24041 rows 16522 columns, reduced to 716 rows 543 columns -Cbc0012I Integer solution of 224493.06 found by RINS after 85051 iterations and 900 nodes (257.47 seconds) -Cbc0010I After 900 nodes, 38 on tree, 224493.06 best solution, best possible 222332.75 (257.55 seconds) -Cbc0011I Exiting as integer gap of 2160.3118 less than 2200 or 0%% -Cbc0001I Search completed - best objective 224493.0622792392, took 85147 iterations and 901 nodes (257.69 seconds) -Cbc0032I Strong branching done 3076 times (85272 iterations), fathomed 0 nodes and fixed 0 variables -Cbc0035I Maximum depth 178, 1114 variables fixed on reduced cost -Cuts at root node changed objective from 188238 to 222333 -Probing was tried 920 times and created 13923 cuts of which 0 were active after adding rounds of cuts (10.780 seconds) -Gomory was tried 920 times and created 4524 cuts of which 0 were active after adding rounds of cuts (24.789 seconds) -Knapsack was tried 920 times and created 9817 cuts of which 0 were active after adding rounds of cuts (12.716 seconds) -Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.095 seconds) -MixedIntegerRounding2 was tried 920 times and created 5513 cuts of which 0 were active after adding rounds of cuts (16.556 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.039 seconds) -TwoMirCuts was tried 920 times and created 9162 cuts of which 0 were active after adding rounds of cuts (11.763 seconds) -ImplicationCuts was tried 20 times and created 2198 cuts of which 0 were active after adding rounds of cuts (0.049 seconds) +Cbc0038I Before mini branch and bound, 11535 integers at bound fixed and 115 continuous of which 24 were internal integer and 0 internal continuous +Cbc0038I Mini branch and bound did not improve solution (31.61 seconds) +Cbc0038I After 31.61 seconds - Feasibility pump exiting - took 2.82 seconds +Cbc0031I 483 added rows had average density of 39.521739 +Cbc0013I At root node, 483 cuts changed objective from 2690 to 3117.1725 in 20 passes +Cbc0014I Cut generator 0 (Probing) - 5548 row cuts average 2.0 elements, 0 column cuts (0 active) in 8.493 seconds - new frequency is 1 +Cbc0014I Cut generator 1 (Gomory) - 2183 row cuts average 97.8 elements, 0 column cuts (0 active) in 6.516 seconds - new frequency is 1 +Cbc0014I Cut generator 2 (Knapsack) - 4111 row cuts average 2.2 elements, 0 column cuts (0 active) in 0.425 seconds - new frequency is 1 +Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.432 seconds - new frequency is -100 +Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 2790 row cuts average 23.5 elements, 0 column cuts (0 active) in 0.577 seconds - new frequency is 1 +Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.116 seconds - new frequency is -100 +Cbc0014I Cut generator 6 (TwoMirCuts) - 2887 row cuts average 32.5 elements, 0 column cuts (0 active) in 4.257 seconds - new frequency is 1 +Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 3117.1725 (161.21 seconds) +Cbc0010I After 100 nodes, 60 on tree, 1e+50 best solution, best possible 3117.1725 (568.76 seconds) +Cbc0010I After 200 nodes, 111 on tree, 1e+50 best solution, best possible 3117.1725 (847.95 seconds) +Cbc0010I After 300 nodes, 163 on tree, 1e+50 best solution, best possible 3117.1725 (1116.36 seconds) +Cbc0010I After 400 nodes, 215 on tree, 1e+50 best solution, best possible 3117.1725 (1357.97 seconds) +Cbc0010I After 500 nodes, 266 on tree, 1e+50 best solution, best possible 3117.1725 (1525.26 seconds) +Cbc0010I After 600 nodes, 316 on tree, 1e+50 best solution, best possible 3117.1725 (1671.45 seconds) +Cbc0010I After 700 nodes, 367 on tree, 1e+50 best solution, best possible 3117.1725 (1874.27 seconds) +Cbc0010I After 800 nodes, 419 on tree, 1e+50 best solution, best possible 3117.1725 (2033.39 seconds) +Cbc0010I After 900 nodes, 466 on tree, 1e+50 best solution, best possible 3117.1725 (2189.03 seconds) +Cbc0010I After 1000 nodes, 518 on tree, 1e+50 best solution, best possible 3117.1725 (2327.79 seconds) +Cbc0010I After 1100 nodes, 616 on tree, 1e+50 best solution, best possible 3126.9955 (2600.73 seconds) +Cbc0010I After 1200 nodes, 716 on tree, 1e+50 best solution, best possible 3126.9955 (2639.75 seconds) +Cbc0010I After 1300 nodes, 816 on tree, 1e+50 best solution, best possible 3126.9955 (2703.37 seconds) +Cbc0010I After 1400 nodes, 916 on tree, 1e+50 best solution, best possible 3126.9955 (2795.95 seconds) +Cbc0010I After 1500 nodes, 1016 on tree, 1e+50 best solution, best possible 3126.9955 (2869.50 seconds) +Cbc0010I After 1600 nodes, 1116 on tree, 1e+50 best solution, best possible 3126.9955 (2933.50 seconds) +Cbc0010I After 1700 nodes, 1216 on tree, 1e+50 best solution, best possible 3126.9955 (2989.15 seconds) +Cbc0010I After 1800 nodes, 1316 on tree, 1e+50 best solution, best possible 3126.9955 (3039.58 seconds) +Cbc0010I After 1900 nodes, 1416 on tree, 1e+50 best solution, best possible 3126.9955 (3051.57 seconds) +Cbc0010I After 2000 nodes, 1516 on tree, 1e+50 best solution, best possible 3126.9955 (3075.06 seconds) +Cbc0010I After 2100 nodes, 1616 on tree, 1e+50 best solution, best possible 3126.9955 (3088.92 seconds) +Cbc0010I After 2200 nodes, 1716 on tree, 1e+50 best solution, best possible 3126.9955 (3129.25 seconds) +Cbc0004I Integer solution of 3274.7611 found after 1698960 iterations and 2300 nodes (3165.29 seconds) +Cbc0010I After 2300 nodes, 1812 on tree, 3274.7611 best solution, best possible 3126.9955 (3165.30 seconds) +Cbc0038I Full problem 18110 rows 13274 columns, reduced to 2471 rows 1761 columns +Cbc0011I Exiting as integer gap of 147.76564 less than 2000 or 0%% +Cbc0001I Search completed - best objective 3274.761142346083, took 1699719 iterations and 2301 nodes (3188.36 seconds) +Cbc0032I Strong branching done 20596 times (1700881 iterations), fathomed 0 nodes and fixed 0 variables +Cbc0035I Maximum depth 1298, 0 variables fixed on reduced cost +Cuts at root node changed objective from 2690 to 3117.17 +Probing was tried 2476 times and created 106374 cuts of which 0 were active after adding rounds of cuts (31.229 seconds) +Gomory was tried 2476 times and created 6574 cuts of which 0 were active after adding rounds of cuts (116.921 seconds) +Knapsack was tried 2476 times and created 68190 cuts of which 0 were active after adding rounds of cuts (36.017 seconds) +Clique was tried 20 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.432 seconds) +MixedIntegerRounding2 was tried 2476 times and created 30603 cuts of which 0 were active after adding rounds of cuts (48.780 seconds) +FlowCover was tried 20 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.116 seconds) +TwoMirCuts was tried 2476 times and created 22706 cuts of which 0 were active after adding rounds of cuts (28.675 seconds) +ImplicationCuts was tried 65 times and created 19542 cuts of which 0 were active after adding rounds of cuts (0.166 seconds) Result - Optimal solution found (within gap tolerance) -Objective value: 224493.06227924 -Lower bound: 222332.750 -Gap: 0.01 -Enumerated nodes: 901 -Total iterations: 85147 -Time (CPU seconds): 258.90 -Time (Wallclock seconds): 259.64 +Objective value: 3274.76114235 +Lower bound: 3126.996 +Gap: 0.05 +Enumerated nodes: 2301 +Total iterations: 1699719 +Time (CPU seconds): 3189.68 +Time (Wallclock seconds): 3193.13 -Total time (CPU seconds): 261.09 (Wallclock seconds): 262.01 +Total time (CPU seconds): 3191.71 (Wallclock seconds): 3195.33 diff --git a/extended proc nights only.log b/extended proc nights only.log index bd39384..aaf4c5d 100644 --- a/extended proc nights only.log +++ b/extended proc nights only.log @@ -1,133 +1,143 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmpm0xkmuez.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpm0xkmuez.pyomo.soln'] +Solver command line: ['/usr/bin/cbc', '-seconds', '10200', '-allow', '2000', '-printingOptions', 'all', '-import', '/tmp/tmpkbdsvsfl.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpkbdsvsfl.pyomo.soln'] Welcome to the CBC MILP Solver Version: 2.9.9 Build Date: Aug 7 2019 -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmpm0xkmuez.pyomo.lp -stat=1 -solve -solu /tmp/tmpm0xkmuez.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 +command line - /usr/bin/cbc -seconds 10200 -allow 2000 -printingOptions all -import /tmp/tmpkbdsvsfl.pyomo.lp -stat=1 -solve -solu /tmp/tmpkbdsvsfl.pyomo.soln (default strategy 1) +seconds was changed from 1e+100 to 10200 +allowableGap was changed from 1e-10 to 2000 Option for printingOptions changed from normal to all -Presolve 19601 (-110296) rows, 15178 (-12903) columns and 97892 (-209117) elements +Presolve 15576 (-101189) rows, 12120 (-10453) columns and 82539 (-204706) elements Statistics for presolved model -Original problem has 27872 integers (27040 of which binary) -Presolved problem has 15088 integers (14872 of which binary) -==== 13606 zero objective 3 different -13606 variables have objective of 0 -208 variables have objective of 20 -1364 variables have objective of 1000 -==== absolute objective values 3 different -13606 variables have objective of 0 -208 variables have objective of 20 -1364 variables have objective of 1000 -==== for integers 13606 zero objective 3 different -13606 variables have objective of 0 -208 variables have objective of 20 -1274 variables have objective of 1000 -==== for integers absolute objective values 3 different -13606 variables have objective of 0 -208 variables have objective of 20 -1274 variables have objective of 1000 +Original problem has 22044 integers (21216 of which binary) +Presolved problem has 11784 integers (11360 of which binary) +==== 11560 zero objective 4 different +11560 variables have objective of 0 +96 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== absolute objective values 4 different +11560 variables have objective of 0 +96 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== for integers 11368 zero objective 2 different +11368 variables have objective of 0 +416 variables have objective of 20 +==== for integers absolute objective values 2 different +11368 variables have objective of 0 +416 variables have objective of 20 ===== end objective counts -Problem has 19601 rows, 15178 columns (1572 with objective) and 97892 elements -There are 298 singletons with objective +Problem has 15576 rows, 12120 columns (560 with objective) and 82539 elements +There are 512 singletons with objective Column breakdown: -306 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, +760 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, 0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 14872 of type 0.0->1.0 +0 of type -inf->0.0, 0 of type -inf->up, 11360 of type 0.0->1.0 Row breakdown: -2712 of type E 0.0, 0 of type E 1.0, 0 of type E -1.0, -227 of type E other, 0 of type G 0.0, 0 of type G 1.0, -334 of type G other, 4056 of type L 0.0, 10816 of type L 1.0, -1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, +2281 of type E 0.0, 0 of type E 1.0, 208 of type E -1.0, +326 of type E other, 0 of type G 0.0, 52 of type G 1.0, +0 of type G other, 2270 of type L 0.0, 9030 of type L 1.0, +1409 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 0 of type Free -Continuous objective value is 307977 - 1.79 seconds -Cgl0002I 9464 variables fixed -Cgl0003I 0 fixed, 208 tightened bounds, 12068 strengthened rows, 72112 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 3874 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 2414 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 913 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 472 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 426 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 419 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 416 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 394 strengthened rows, 0 substitutions -Cgl0004I processed model has 3557 rows, 3002 columns (2912 integer (2704 of which binary)) and 27294 elements -Cbc0038I Initial state - 203 integers unsatisfied sum - 48.1942 -Cbc0038I Pass 1: (4.31 seconds) suminf. 25.79319 (98) obj. 308847 iterations 1030 -Cbc0038I Pass 2: (4.31 seconds) suminf. 20.95041 (81) obj. 308850 iterations 75 -Cbc0038I Pass 3: (4.32 seconds) suminf. 19.51710 (76) obj. 308846 iterations 18 -Cbc0038I Pass 4: (4.32 seconds) suminf. 16.38158 (66) obj. 309105 iterations 146 -Cbc0038I Pass 5: (4.33 seconds) suminf. 15.78139 (64) obj. 309104 iterations 56 -Cbc0038I Pass 6: (4.34 seconds) suminf. 17.82947 (66) obj. 309861 iterations 149 -Cbc0038I Pass 7: (4.34 seconds) suminf. 16.87253 (64) obj. 309853 iterations 56 -Cbc0038I Pass 8: (4.35 seconds) suminf. 16.34740 (64) obj. 309851 iterations 17 -Cbc0038I Pass 9: (4.36 seconds) suminf. 17.31553 (66) obj. 311385 iterations 128 -Cbc0038I Pass 10: (4.36 seconds) suminf. 16.18974 (65) obj. 311381 iterations 52 -Cbc0038I Pass 11: (4.37 seconds) suminf. 16.66807 (65) obj. 309850 iterations 85 -Cbc0038I Pass 12: (4.37 seconds) suminf. 16.39342 (65) obj. 309855 iterations 36 -Cbc0038I Pass 13: (4.38 seconds) suminf. 19.03518 (68) obj. 311416 iterations 132 -Cbc0038I Pass 14: (4.39 seconds) suminf. 15.97431 (63) obj. 311425 iterations 75 -Cbc0038I Pass 15: (4.39 seconds) suminf. 15.48765 (62) obj. 311431 iterations 18 -Cbc0038I Pass 16: (4.40 seconds) suminf. 17.17728 (68) obj. 309925 iterations 172 -Cbc0038I Pass 17: (4.41 seconds) suminf. 15.30830 (62) obj. 309922 iterations 83 -Cbc0038I Pass 18: (4.42 seconds) suminf. 19.16642 (70) obj. 309215 iterations 152 -Cbc0038I Pass 19: (4.42 seconds) suminf. 17.03452 (65) obj. 309214 iterations 68 -Cbc0038I Pass 20: (4.43 seconds) suminf. 15.92705 (65) obj. 309214 iterations 29 -Cbc0038I Pass 21: (4.43 seconds) suminf. 14.93939 (66) obj. 309217 iterations 15 -Cbc0038I Pass 22: (4.44 seconds) suminf. 17.10473 (66) obj. 309204 iterations 185 -Cbc0038I Pass 23: (4.45 seconds) suminf. 16.32949 (63) obj. 309208 iterations 28 -Cbc0038I Pass 24: (4.46 seconds) suminf. 14.92720 (62) obj. 309202 iterations 70 -Cbc0038I Pass 25: (4.46 seconds) suminf. 14.92720 (62) obj. 309202 iterations 12 -Cbc0038I Pass 26: (4.47 seconds) suminf. 16.38608 (65) obj. 309206 iterations 77 -Cbc0038I Pass 27: (4.47 seconds) suminf. 15.38263 (62) obj. 309211 iterations 26 -Cbc0038I Pass 28: (4.48 seconds) suminf. 15.54781 (63) obj. 309199 iterations 61 -Cbc0038I Pass 29: (4.51 seconds) suminf. 42.72391 (154) obj. 344500 iterations 566 -Cbc0038I Pass 30: (4.52 seconds) suminf. 25.91427 (90) obj. 331553 iterations 359 +Continuous objective value is 2560 - 9.87 seconds +Cgl0002I 9517 variables fixed +Cgl0003I 0 fixed, 416 tightened bounds, 9800 strengthened rows, 49679 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 2540 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1884 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 568 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 113 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 82 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 77 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 71 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 67 strengthened rows, 0 substitutions +Cgl0004I processed model has 3086 rows, 3046 columns (2710 integer (2294 of which binary)) and 25548 elements +Cbc0038I Initial state - 146 integers unsatisfied sum - 37.469 +Cbc0038I Pass 1: (11.59 seconds) suminf. 0.47173 (2) obj. 4275.76 iterations 590 +Cbc0038I Pass 2: (11.59 seconds) suminf. 0.47173 (2) obj. 4275.76 iterations 8 +Cbc0038I Pass 3: (11.60 seconds) suminf. 0.00000 (0) obj. 4323.8 iterations 9 +Cbc0038I Solution found of 4323.8 +Cbc0038I Relaxing continuous gives 3974.12 +Cbc0038I Cleaned solution of 3974.12 +Cbc0038I Before mini branch and bound, 2559 integers at bound fixed and 136 continuous of which 33 were internal integer and 0 internal continuous +Cbc0038I Full problem 3086 rows 3046 columns, reduced to 52 rows 49 columns +Cbc0038I Mini branch and bound did not improve solution (11.63 seconds) +Cbc0038I Freeing continuous variables gives a solution of 3974.12 +Cbc0038I Round again with cutoff of 3832.71 +Cbc0038I Pass 4: (11.66 seconds) suminf. 1.45488 (8) obj. 3832.71 iterations 29 +Cbc0038I Pass 5: (11.68 seconds) suminf. 0.64928 (9) obj. 3832.71 iterations 261 +Cbc0038I Pass 6: (11.69 seconds) suminf. 1.21829 (7) obj. 3832.71 iterations 255 +Cbc0038I Pass 7: (11.70 seconds) suminf. 1.09024 (5) obj. 3832.71 iterations 15 +Cbc0038I Pass 8: (11.71 seconds) suminf. 0.00000 (0) obj. 3832.71 iterations 166 +Cbc0038I Solution found of 3832.71 +Cbc0038I Relaxing continuous gives 3698.04 +Cbc0038I Cleaned solution of 3698.04 +Cbc0038I Before mini branch and bound, 2549 integers at bound fixed and 132 continuous of which 33 were internal integer and 0 internal continuous +Cbc0038I Full problem 3086 rows 3046 columns, reduced to 89 rows 86 columns +Cbc0038I Mini branch and bound did not improve solution (11.78 seconds) +Cbc0038I Freeing continuous variables gives a solution of 3698.04 +Cbc0038I Round again with cutoff of 3470.43 +Cbc0038I Pass 9: (11.83 seconds) suminf. 5.71444 (21) obj. 3470.43 iterations 178 +Cbc0038I Pass 10: (11.84 seconds) suminf. 3.39913 (21) obj. 3470.43 iterations 246 +Cbc0038I Pass 11: (11.85 seconds) suminf. 3.15309 (17) obj. 3470.43 iterations 120 +Cbc0038I Pass 12: (11.88 seconds) suminf. 5.18611 (29) obj. 3470.43 iterations 504 +Cbc0038I Pass 13: (11.88 seconds) suminf. 5.34128 (30) obj. 3470.43 iterations 94 +Cbc0038I Pass 14: (11.89 seconds) suminf. 4.85719 (30) obj. 3470.43 iterations 43 +Cbc0038I Pass 15: (11.90 seconds) suminf. 5.46620 (24) obj. 3470.43 iterations 214 +Cbc0038I Pass 16: (11.91 seconds) suminf. 4.67465 (26) obj. 3470.43 iterations 60 +Cbc0038I Pass 17: (11.93 seconds) suminf. 6.52181 (26) obj. 3470.43 iterations 326 +Cbc0038I Pass 18: (11.94 seconds) suminf. 4.39105 (26) obj. 3470.43 iterations 206 +Cbc0038I Pass 19: (11.97 seconds) suminf. 7.16407 (27) obj. 3470.43 iterations 519 +Cbc0038I Pass 20: (11.98 seconds) suminf. 5.57749 (32) obj. 3470.43 iterations 187 +Cbc0038I Pass 21: (12.00 seconds) suminf. 6.06664 (26) obj. 3470.43 iterations 331 +Cbc0038I Pass 22: (12.00 seconds) suminf. 4.83984 (24) obj. 3470.43 iterations 162 +Cbc0038I Pass 23: (12.01 seconds) suminf. 4.04829 (26) obj. 3470.43 iterations 67 +Cbc0038I Pass 24: (12.04 seconds) suminf. 7.50683 (27) obj. 3470.43 iterations 490 +Cbc0038I Pass 25: (12.05 seconds) suminf. 5.92024 (32) obj. 3470.43 iterations 191 +Cbc0038I Pass 26: (12.07 seconds) suminf. 8.83513 (32) obj. 3470.43 iterations 403 +Cbc0038I Pass 27: (12.08 seconds) suminf. 6.60367 (33) obj. 3470.43 iterations 119 +Cbc0038I Pass 28: (12.09 seconds) suminf. 6.03597 (37) obj. 3470.43 iterations 149 +Cbc0038I Pass 29: (12.12 seconds) suminf. 10.65699 (43) obj. 3470.43 iterations 543 +Cbc0038I Pass 30: (12.13 seconds) suminf. 8.00683 (34) obj. 3470.43 iterations 164 +Cbc0038I Pass 31: (12.14 seconds) suminf. 7.15875 (36) obj. 3470.43 iterations 65 +Cbc0038I Pass 32: (12.15 seconds) suminf. 6.24921 (32) obj. 3470.43 iterations 230 +Cbc0038I Pass 33: (12.16 seconds) suminf. 5.53806 (32) obj. 3470.43 iterations 85 +Cbc0038I Pass 34: (12.19 seconds) suminf. 7.17468 (31) obj. 3470.43 iterations 481 +Cbc0038I Pass 35: (12.20 seconds) suminf. 5.57660 (28) obj. 3470.43 iterations 141 +Cbc0038I Pass 36: (12.22 seconds) suminf. 8.67998 (30) obj. 3470.43 iterations 375 +Cbc0038I Pass 37: (12.23 seconds) suminf. 5.94849 (31) obj. 3470.43 iterations 188 +Cbc0038I Pass 38: (12.24 seconds) suminf. 5.30715 (31) obj. 3470.43 iterations 76 Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 2368 integers at bound fixed and 42 continuous -Cbc0038I Full problem 3557 rows 3002 columns, reduced to 819 rows 561 columns -Cbc0038I Mini branch and bound did not improve solution (5.26 seconds) -Cbc0038I After 5.26 seconds - Feasibility pump exiting - took 1.06 seconds -Cbc0031I 66 added rows had average density of 160.28788 -Cbc0013I At root node, 66 cuts changed objective from 307976.81 to 308016.81 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 274 row cuts average 19.0 elements, 0 column cuts (0 active) in 0.293 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 144 row cuts average 720.2 elements, 0 column cuts (0 active) in 0.649 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 35 row cuts average 8.6 elements, 0 column cuts (0 active) in 0.023 seconds - new frequency is 1 -Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.005 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 81 row cuts average 42.5 elements, 0 column cuts (0 active) in 0.060 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.008 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 148 row cuts average 62.1 elements, 0 column cuts (0 active) in 0.153 seconds - new frequency is -100 -Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 308016.81 (7.77 seconds) -Cbc0012I Integer solution of 308036.81 found by DiveCoefficient after 2997 iterations and 2 nodes (8.23 seconds) -Cbc0038I Full problem 3557 rows 3002 columns, reduced to 89 rows 63 columns -Cbc0004I Integer solution of 308016.81 found after 3022 iterations and 3 nodes (8.83 seconds) -Cbc0011I Exiting as integer gap of -5.8207661e-11 less than 2200 or 0%% -Cbc0001I Search completed - best objective 308016.8141544065, took 3022 iterations and 3 nodes (8.83 seconds) -Cbc0032I Strong branching done 66 times (4711 iterations), fathomed 0 nodes and fixed 0 variables -Cbc0035I Maximum depth 2, 364 variables fixed on reduced cost -Cuts at root node changed objective from 307977 to 308017 -Probing was tried 16 times and created 281 cuts of which 0 were active after adding rounds of cuts (0.305 seconds) -Gomory was tried 16 times and created 145 cuts of which 0 were active after adding rounds of cuts (0.669 seconds) -Knapsack was tried 16 times and created 35 cuts of which 0 were active after adding rounds of cuts (0.034 seconds) -Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.005 seconds) -MixedIntegerRounding2 was tried 16 times and created 87 cuts of which 0 were active after adding rounds of cuts (0.089 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.008 seconds) -TwoMirCuts was tried 10 times and created 148 cuts of which 0 were active after adding rounds of cuts (0.153 seconds) -ImplicationCuts was tried 6 times and created 2 cuts of which 0 were active after adding rounds of cuts (0.001 seconds) +Cbc0038I Before mini branch and bound, 2505 integers at bound fixed and 101 continuous of which 30 were internal integer and 0 internal continuous +Cbc0038I Full problem 3086 rows 3046 columns, reduced to 204 rows 208 columns +Cbc0038I Mini branch and bound did not improve solution (12.27 seconds) +Cbc0038I After 12.27 seconds - Feasibility pump exiting with objective of 3698.04 - took 0.73 seconds +Cbc0012I Integer solution of 3698.0376 found by feasibility pump after 0 iterations and 0 nodes (12.27 seconds) +Cbc0011I Exiting as integer gap of 1138.0376 less than 2000 or 0%% +Cbc0001I Search completed - best objective 3698.037618571474, took 0 iterations and 0 nodes (12.28 seconds) +Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost +Cuts at root node changed objective from 2560 to 2560 +Probing was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Gomory was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Knapsack was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Clique was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +MixedIntegerRounding2 was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +FlowCover was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +TwoMirCuts was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) Result - Optimal solution found (within gap tolerance) -Objective value: 308016.81415441 -Lower bound: 308016.814 -Gap: 0.00 -Enumerated nodes: 3 -Total iterations: 3022 -Time (CPU seconds): 9.17 -Time (Wallclock seconds): 9.37 +Objective value: 3698.03761857 +Lower bound: 2560.000 +Gap: 0.44 +Enumerated nodes: 0 +Total iterations: 0 +Time (CPU seconds): 12.57 +Time (Wallclock seconds): 12.71 -Total time (CPU seconds): 9.97 (Wallclock seconds): 10.23 +Total time (CPU seconds): 13.37 (Wallclock seconds): 13.58 diff --git a/nights + proc twighlights + proc weekends.log b/nights + proc twighlights + proc weekends.log deleted file mode 100644 index f51ee22..0000000 --- a/nights + proc twighlights + proc weekends.log +++ /dev/null @@ -1,121 +0,0 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmpvgmu8xky.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpvgmu8xky.pyomo.soln'] - -Welcome to the CBC MILP Solver -Version: 2.9.9 -Build Date: Aug 7 2019 - -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmpvgmu8xky.pyomo.lp -stat=1 -solve -solu /tmp/tmpvgmu8xky.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 -Option for printingOptions changed from normal to all -Presolve 61633 (-68602) rows, 24642 (-12955) columns and 252462 (-219179) elements -Statistics for presolved model -Original problem has 37336 integers (36504 of which binary) -Presolved problem has 24552 integers (24336 of which binary) -==== 21796 zero objective 3 different -21796 variables have objective of 0 -208 variables have objective of 20 -2638 variables have objective of 1000 -==== absolute objective values 3 different -21796 variables have objective of 0 -208 variables have objective of 20 -2638 variables have objective of 1000 -==== for integers 21796 zero objective 3 different -21796 variables have objective of 0 -208 variables have objective of 20 -2548 variables have objective of 1000 -==== for integers absolute objective values 3 different -21796 variables have objective of 0 -208 variables have objective of 20 -2548 variables have objective of 1000 -===== end objective counts - - -Problem has 61633 rows, 24642 columns (2846 with objective) and 252462 elements -There are 298 singletons with objective -Column breakdown: -306 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, -0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 24336 of type 0.0->1.0 -Row breakdown: -2712 of type E 0.0, 0 of type E 1.0, 0 of type E -1.0, -409 of type E other, 0 of type G 0.0, 0 of type G 1.0, -376 of type G other, 4056 of type L 0.0, 49868 of type L 1.0, -1508 of type L other, 0 of type Range 0.0->1.0, 2704 of type Range other, -0 of type Free -Continuous objective value is 235275 - 18.65 seconds -Cgl0002I 9464 variables fixed -Cgl0003I 0 fixed, 208 tightened bounds, 37440 strengthened rows, 48132 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 830 strengthened rows, 0 substitutions -Cgl0004I processed model has 22157 rows, 15170 columns (15080 integer (14872 of which binary)) and 119840 elements -Cbc0038I Initial state - 627 integers unsatisfied sum - 209.255 -Cbc0038I Pass 1: (27.97 seconds) suminf. 106.07246 (326) obj. 252225 iterations 3662 -Cbc0038I Pass 2: (28.07 seconds) suminf. 95.72743 (291) obj. 251499 iterations 716 -Cbc0038I Pass 3: (28.09 seconds) suminf. 93.33763 (280) obj. 251505 iterations 57 -Cbc0038I Pass 4: (28.12 seconds) suminf. 92.83763 (279) obj. 251505 iterations 6 -Cbc0038I Pass 5: (28.14 seconds) suminf. 92.83763 (279) obj. 251505 iterations 7 -Cbc0038I Pass 6: (28.35 seconds) suminf. 88.07561 (260) obj. 271289 iterations 1630 -Cbc0038I Pass 7: (28.57 seconds) suminf. 54.65876 (187) obj. 266649 iterations 1549 -Cbc0038I Pass 8: (28.60 seconds) suminf. 51.21935 (179) obj. 267604 iterations 132 -Cbc0038I Pass 9: (28.62 seconds) suminf. 51.21935 (179) obj. 267604 iterations 5 -Cbc0038I Pass 10: (28.66 seconds) suminf. 45.87751 (162) obj. 267375 iterations 232 -Cbc0038I Pass 11: (28.69 seconds) suminf. 41.50434 (150) obj. 267395 iterations 268 -Cbc0038I Pass 12: (28.72 seconds) suminf. 38.95309 (137) obj. 267389 iterations 46 -Cbc0038I Pass 13: (28.74 seconds) suminf. 37.01190 (134) obj. 267389 iterations 54 -Cbc0038I Pass 14: (28.79 seconds) suminf. 32.20802 (125) obj. 267386 iterations 470 -Cbc0038I Pass 15: (28.84 seconds) suminf. 31.56175 (131) obj. 267386 iterations 344 -Cbc0038I Pass 16: (28.86 seconds) suminf. 31.56175 (131) obj. 267386 iterations 28 -Cbc0038I Pass 17: (28.92 seconds) suminf. 29.43450 (121) obj. 268378 iterations 460 -Cbc0038I Pass 18: (28.95 seconds) suminf. 29.26964 (118) obj. 268294 iterations 102 -Cbc0038I Pass 19: (29.01 seconds) suminf. 29.44524 (120) obj. 268264 iterations 492 -Cbc0038I Pass 20: (29.03 seconds) suminf. 29.44678 (122) obj. 268264 iterations 83 -Cbc0038I Pass 21: (29.06 seconds) suminf. 29.36685 (125) obj. 267950 iterations 156 -Cbc0038I Pass 22: (29.09 seconds) suminf. 29.34914 (124) obj. 267950 iterations 71 -Cbc0038I Pass 23: (29.14 seconds) suminf. 29.92259 (124) obj. 267721 iterations 406 -Cbc0038I Pass 24: (29.17 seconds) suminf. 29.77899 (123) obj. 267720 iterations 60 -Cbc0038I Pass 25: (29.19 seconds) suminf. 29.77899 (123) obj. 267720 iterations 15 -Cbc0038I Pass 26: (29.21 seconds) suminf. 29.77899 (123) obj. 267720 iterations 3 -Cbc0038I Pass 27: (29.23 seconds) suminf. 29.77899 (123) obj. 267720 iterations 6 -Cbc0038I Pass 28: (29.37 seconds) suminf. 42.90902 (137) obj. 287514 iterations 1303 -Cbc0038I Pass 29: (29.51 seconds) suminf. 31.28342 (118) obj. 286853 iterations 1012 -Cbc0038I Pass 30: (29.55 seconds) suminf. 30.17992 (120) obj. 287303 iterations 229 -Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 13786 integers at bound fixed and 43 continuous -Cbc0038I Mini branch and bound did not improve solution (29.58 seconds) -Cbc0038I After 29.58 seconds - Feasibility pump exiting - took 2.51 seconds -Cbc0031I 264 added rows had average density of 41.094697 -Cbc0013I At root node, 264 cuts changed objective from 235274.72 to 247993.63 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 729 row cuts average 6.8 elements, 0 column cuts (135 active) in 2.312 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 911 row cuts average 479.7 elements, 0 column cuts (0 active) in 2.646 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 231 row cuts average 2.6 elements, 0 column cuts (0 active) in 0.145 seconds - new frequency is 1 -Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.034 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 186 row cuts average 57.1 elements, 0 column cuts (0 active) in 0.196 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.033 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 758 row cuts average 87.3 elements, 0 column cuts (0 active) in 1.797 seconds - new frequency is 1 -Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 247993.63 (51.80 seconds) -Cbc0012I Integer solution of 247993.63 found by rounding after 23120 iterations and 84 nodes (90.51 seconds) -Cbc0038I Full problem 22157 rows 15170 columns, reduced to 0 rows 0 columns -Cbc0001I Search completed - best objective 247993.6283088135, took 23120 iterations and 84 nodes (91.04 seconds) -Cbc0032I Strong branching done 1752 times (40035 iterations), fathomed 0 nodes and fixed 0 variables -Cbc0035I Maximum depth 50, 0 variables fixed on reduced cost -Cuts at root node changed objective from 235275 to 247994 -Probing was tried 36 times and created 874 cuts of which 135 were active after adding rounds of cuts (2.553 seconds) -Gomory was tried 36 times and created 923 cuts of which 0 were active after adding rounds of cuts (3.186 seconds) -Knapsack was tried 36 times and created 280 cuts of which 0 were active after adding rounds of cuts (0.413 seconds) -Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.034 seconds) -MixedIntegerRounding2 was tried 36 times and created 245 cuts of which 0 were active after adding rounds of cuts (0.652 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.033 seconds) -TwoMirCuts was tried 36 times and created 821 cuts of which 0 were active after adding rounds of cuts (2.415 seconds) -ImplicationCuts was tried 16 times and created 90 cuts of which 0 were active after adding rounds of cuts (0.022 seconds) - -Result - Optimal solution found - -Objective value: 247993.62830881 -Enumerated nodes: 84 -Total iterations: 23120 -Time (CPU seconds): 91.58 -Time (Wallclock seconds): 91.98 - -Total time (CPU seconds): 92.49 (Wallclock seconds): 92.98 - - diff --git a/no nights.log b/no nights.log index 25feb33..49ac694 100644 --- a/no nights.log +++ b/no nights.log @@ -1,167 +1,129 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmp5_964_on.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmp5_964_on.pyomo.soln'] +Solver command line: ['/usr/bin/cbc', '-seconds', '10200', '-allow', '2000', '-printingOptions', 'all', '-import', '/tmp/tmpahus9y28.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpahus9y28.pyomo.soln'] Welcome to the CBC MILP Solver Version: 2.9.9 Build Date: Aug 7 2019 -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmp5_964_on.pyomo.lp -stat=1 -solve -solu /tmp/tmp5_964_on.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 +command line - /usr/bin/cbc -seconds 10200 -allow 2000 -printingOptions all -import /tmp/tmpahus9y28.pyomo.lp -stat=1 -solve -solu /tmp/tmpahus9y28.pyomo.soln (default strategy 1) +seconds was changed from 1e+100 to 10200 +allowableGap was changed from 1e-10 to 2000 Option for printingOptions changed from normal to all -Presolve 9073 (-28732) rows, 13610 (-73595) columns and 64596 (-446201) elements +Presolve 7772 (-24029) rows, 10426 (-66671) columns and 53720 (-385345) elements Statistics for presolved model -Original problem has 86684 integers (86528 of which binary) -Presolved problem has 13520 integers (13520 of which binary) -==== 10894 zero objective 3 different -10894 variables have objective of 0 -1352 variables have objective of 100 -1364 variables have objective of 1000 -==== absolute objective values 3 different -10894 variables have objective of 0 -1352 variables have objective of 100 -1364 variables have objective of 1000 -==== for integers 10894 zero objective 3 different -10894 variables have objective of 0 -1352 variables have objective of 100 -1274 variables have objective of 1000 -==== for integers absolute objective values 3 different -10894 variables have objective of 0 -1352 variables have objective of 100 -1274 variables have objective of 1000 +Original problem has 76280 integers (76128 of which binary) +Presolved problem has 10234 integers (10234 of which binary) +==== 9193 zero objective 2 different +9193 variables have objective of 0 +1233 variables have objective of 1 +==== absolute objective values 2 different +9193 variables have objective of 0 +1233 variables have objective of 1 +==== for integers 9097 zero objective 2 different +9097 variables have objective of 0 +1137 variables have objective of 1 +==== for integers absolute objective values 2 different +9097 variables have objective of 0 +1137 variables have objective of 1 ===== end objective counts -Problem has 9073 rows, 13610 columns (2716 with objective) and 64596 elements -There are 1442 singletons with objective +Problem has 7772 rows, 10426 columns (1233 with objective) and 53720 elements +There are 1233 singletons with objective Column breakdown: -90 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, +192 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, 0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 13520 of type 0.0->1.0 +0 of type -inf->0.0, 0 of type -inf->up, 10234 of type 0.0->1.0 Row breakdown: 0 of type E 0.0, 676 of type E 1.0, 0 of type E -1.0, -97 of type E other, 0 of type G 0.0, 0 of type G 1.0, -84 of type G other, 5408 of type L 0.0, 1352 of type L 1.0, -1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, +148 of type E other, 0 of type G 0.0, 0 of type G 1.0, +43 of type G other, 3411 of type L 0.0, 1089 of type L 1.0, +2405 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 0 of type Free -Continuous objective value is 5579.29 - 0.25 seconds -Cgl0002I 66248 variables fixed -Cgl0003I 52 fixed, 0 tightened bounds, 4004 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 196 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1533 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1527 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1527 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1524 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1522 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1520 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1520 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1410 strengthened rows, 0 substitutions -Cgl0004I processed model has 8929 rows, 13558 columns (13468 integer (13468 of which binary)) and 72963 elements -Cbc0038I Initial state - 757 integers unsatisfied sum - 322.142 -Cbc0038I Pass 1: (2.10 seconds) suminf. 231.92695 (505) obj. 30728.2 iterations 1751 -Cbc0038I Pass 2: (2.12 seconds) suminf. 206.58889 (444) obj. 31931.6 iterations 194 -Cbc0038I Pass 3: (2.14 seconds) suminf. 196.54920 (421) obj. 32116 iterations 204 -Cbc0038I Pass 4: (2.16 seconds) suminf. 196.54920 (421) obj. 32116 iterations 37 -Cbc0038I Pass 5: (2.18 seconds) suminf. 195.04920 (418) obj. 32166 iterations 17 -Cbc0038I Pass 6: (2.20 seconds) suminf. 195.04920 (418) obj. 32166 iterations 24 -Cbc0038I Pass 7: (2.22 seconds) suminf. 195.04920 (418) obj. 32166 iterations 18 -Cbc0038I Pass 8: (2.25 seconds) suminf. 72.58889 (171) obj. 37485.9 iterations 561 -Cbc0038I Pass 9: (2.27 seconds) suminf. 70.08889 (166) obj. 37485.9 iterations 32 -Cbc0038I Pass 10: (2.29 seconds) suminf. 69.08889 (164) obj. 37485.9 iterations 6 -Cbc0038I Pass 11: (2.31 seconds) suminf. 69.08889 (164) obj. 37485.9 iterations 4 -Cbc0038I Pass 12: (2.35 seconds) suminf. 32.58141 (84) obj. 60503.3 iterations 914 -Cbc0038I Pass 13: (2.39 seconds) suminf. 27.88537 (75) obj. 61927.9 iterations 484 -Cbc0038I Pass 14: (2.41 seconds) suminf. 27.50124 (75) obj. 62180.1 iterations 58 -Cbc0038I Pass 15: (2.43 seconds) suminf. 27.00124 (74) obj. 62180.1 iterations 1 -Cbc0038I Pass 16: (2.45 seconds) suminf. 16.00124 (52) obj. 62980.1 iterations 32 -Cbc0038I Pass 17: (2.47 seconds) suminf. 7.10271 (34) obj. 62816.5 iterations 296 -Cbc0038I Pass 18: (2.49 seconds) suminf. 6.79422 (33) obj. 62168.7 iterations 55 -Cbc0038I Pass 19: (2.53 seconds) suminf. 3.14487 (17) obj. 64662.8 iterations 509 -Cbc0038I Pass 20: (2.55 seconds) suminf. 3.14487 (17) obj. 64662.8 iterations 192 -Cbc0038I Pass 21: (2.59 seconds) suminf. 1.23209 (8) obj. 65540 iterations 475 -Cbc0038I Pass 22: (2.61 seconds) suminf. 1.23209 (8) obj. 65540 iterations 82 -Cbc0038I Pass 23: (2.63 seconds) suminf. 0.79917 (6) obj. 66277.4 iterations 327 -Cbc0038I Pass 24: (2.66 seconds) suminf. 1.01893 (6) obj. 65540 iterations 189 -Cbc0038I Pass 25: (2.69 seconds) suminf. 14.01747 (45) obj. 83423 iterations 774 -Cbc0038I Pass 26: (2.73 seconds) suminf. 10.55675 (34) obj. 83054.5 iterations 517 -Cbc0038I Pass 27: (2.75 seconds) suminf. 9.55675 (32) obj. 83054.5 iterations 5 -Cbc0038I Pass 28: (2.77 seconds) suminf. 9.55675 (32) obj. 83054.5 iterations 6 -Cbc0038I Pass 29: (2.79 seconds) suminf. 2.31454 (11) obj. 81144.3 iterations 317 -Cbc0038I Pass 30: (2.81 seconds) suminf. 2.27485 (10) obj. 81546.8 iterations 84 +Continuous objective value is 512.5 - 0.24 seconds +Cgl0002I 61928 variables fixed +Cgl0003I 0 fixed, 0 tightened bounds, 2270 strengthened rows, 4 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions +Cgl0004I processed model has 7725 rows, 10424 columns (10232 integer (10232 of which binary)) and 53732 elements +Cbc0038I Initial state - 529 integers unsatisfied sum - 224.918 +Cbc0038I Pass 1: (1.64 seconds) suminf. 189.00000 (378) obj. 628.389 iterations 1696 +Cbc0038I Pass 2: (1.65 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 82 +Cbc0038I Pass 3: (1.66 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 39 +Cbc0038I Pass 4: (1.68 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 32 +Cbc0038I Pass 5: (1.69 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 38 +Cbc0038I Pass 6: (1.71 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 31 +Cbc0038I Pass 7: (1.73 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 34 +Cbc0038I Pass 8: (1.74 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 39 +Cbc0038I Pass 9: (1.76 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 36 +Cbc0038I Pass 10: (1.77 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 36 +Cbc0038I Pass 11: (1.79 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 40 +Cbc0038I Pass 12: (1.80 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 40 +Cbc0038I Pass 13: (1.82 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 449 +Cbc0038I Pass 14: (1.84 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 77 +Cbc0038I Pass 15: (1.85 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 48 +Cbc0038I Pass 16: (1.87 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 51 +Cbc0038I Pass 17: (1.89 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 48 +Cbc0038I Pass 18: (1.90 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 33 +Cbc0038I Pass 19: (1.93 seconds) suminf. 71.00000 (142) obj. 773.037 iterations 532 +Cbc0038I Pass 20: (1.95 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 252 +Cbc0038I Pass 21: (1.96 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 31 +Cbc0038I Pass 22: (1.98 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 39 +Cbc0038I Pass 23: (1.99 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 47 +Cbc0038I Pass 24: (2.01 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 44 +Cbc0038I Pass 25: (2.02 seconds) suminf. 69.00000 (138) obj. 774.037 iterations 34 +Cbc0038I Pass 26: (2.04 seconds) suminf. 69.00000 (138) obj. 774.037 iterations 24 +Cbc0038I Pass 27: (2.06 seconds) suminf. 61.50000 (123) obj. 809.99 iterations 474 +Cbc0038I Pass 28: (2.08 seconds) suminf. 60.00000 (120) obj. 810.99 iterations 241 +Cbc0038I Pass 29: (2.10 seconds) suminf. 59.50000 (119) obj. 810.99 iterations 42 +Cbc0038I Pass 30: (2.11 seconds) suminf. 59.00000 (118) obj. 811.49 iterations 33 Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 12405 integers at bound fixed and 20 continuous -Cbc0038I Full problem 8929 rows 13558 columns, reduced to 355 rows 402 columns -Cbc0038I Mini branch and bound improved solution from 1.79769e+308 to 44152.7 (3.07 seconds) -Cbc0038I Freeing continuous variables gives a solution of 44152.7 -Cbc0038I Round again with cutoff of 41270.3 -Cbc0038I Pass 30: (3.10 seconds) suminf. 231.92695 (505) obj. 30728.2 iterations 0 -Cbc0038I Pass 31: (3.13 seconds) suminf. 186.69839 (405) obj. 34976.8 iterations 320 -Cbc0038I Pass 32: (3.15 seconds) suminf. 175.89364 (383) obj. 35626.8 iterations 89 -Cbc0038I Pass 33: (3.17 seconds) suminf. 174.39364 (380) obj. 35676.8 iterations 10 -Cbc0038I Pass 34: (3.18 seconds) suminf. 174.39364 (380) obj. 35676.8 iterations 3 -Cbc0038I Pass 35: (3.20 seconds) suminf. 165.39364 (362) obj. 36526.8 iterations 35 -Cbc0038I Pass 36: (3.22 seconds) suminf. 152.89364 (337) obj. 37726.8 iterations 41 -Cbc0038I Pass 37: (3.24 seconds) suminf. 137.89364 (307) obj. 39126.8 iterations 44 -Cbc0038I Pass 38: (3.27 seconds) suminf. 132.89364 (297) obj. 39626.8 iterations 15 -Cbc0038I Pass 39: (3.29 seconds) suminf. 117.39364 (266) obj. 40976.8 iterations 44 -Cbc0038I Pass 40: (3.33 seconds) suminf. 106.89364 (251) obj. 41270.3 iterations 184 -Cbc0038I Pass 41: (3.36 seconds) suminf. 99.39364 (236) obj. 41270.3 iterations 71 -Cbc0038I Pass 42: (3.40 seconds) suminf. 93.04601 (226) obj. 41270.3 iterations 176 -Cbc0038I Pass 43: (3.43 seconds) suminf. 92.89364 (223) obj. 41270.3 iterations 135 -Cbc0038I Pass 44: (3.46 seconds) suminf. 92.39364 (222) obj. 41270.3 iterations 3 -Cbc0038I Pass 45: (3.49 seconds) suminf. 83.89364 (208) obj. 41270.3 iterations 74 -Cbc0038I Pass 46: (3.51 seconds) suminf. 70.89364 (182) obj. 41270.3 iterations 44 -Cbc0038I Pass 47: (3.53 seconds) suminf. 63.89364 (168) obj. 41270.3 iterations 26 -Cbc0038I Pass 48: (3.55 seconds) suminf. 63.89364 (168) obj. 41270.3 iterations 4 -Cbc0038I Pass 49: (3.58 seconds) suminf. 57.89364 (156) obj. 41270.3 iterations 28 -Cbc0038I Pass 50: (3.60 seconds) suminf. 57.89364 (156) obj. 41270.3 iterations 2 -Cbc0038I Pass 51: (3.62 seconds) suminf. 45.39364 (131) obj. 41270.3 iterations 33 -Cbc0038I Pass 52: (3.64 seconds) suminf. 32.89364 (106) obj. 41270.3 iterations 42 -Cbc0038I Pass 53: (3.66 seconds) suminf. 25.39364 (91) obj. 41270.3 iterations 34 -Cbc0038I Pass 54: (3.68 seconds) suminf. 14.89364 (70) obj. 41270.3 iterations 35 -Cbc0038I Pass 55: (3.73 seconds) suminf. 9.96998 (47) obj. 41270.3 iterations 460 -Cbc0038I Pass 56: (3.77 seconds) suminf. 8.19475 (45) obj. 41270.3 iterations 185 -Cbc0038I Pass 57: (3.84 seconds) suminf. 6.00263 (32) obj. 41270.3 iterations 797 -Cbc0038I Pass 58: (3.87 seconds) suminf. 5.48991 (33) obj. 41270.3 iterations 238 -Cbc0038I Pass 59: (3.93 seconds) suminf. 4.62934 (19) obj. 40801.3 iterations 623 -Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 12628 integers at bound fixed and 39 continuous -Cbc0038I Mini branch and bound did not improve solution (3.98 seconds) -Cbc0038I After 3.98 seconds - Feasibility pump exiting with objective of 44152.7 - took 1.99 seconds -Cbc0012I Integer solution of 44152.66 found by feasibility pump after 0 iterations and 0 nodes (3.99 seconds) -Cbc0038I Full problem 8929 rows 13558 columns, reduced to 228 rows 243 columns -Cbc0012I Integer solution of 40453.232 found by RINS after 0 iterations and 0 nodes (4.21 seconds) -Cbc0012I Integer solution of 29020.952 found by DiveCoefficient after 8819 iterations and 0 nodes (11.10 seconds) -Cbc0031I 340 added rows had average density of 48.729412 -Cbc0013I At root node, 340 cuts changed objective from 15329.289 to 27320.952 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 2358 row cuts average 2.0 elements, 0 column cuts (0 active) in 1.816 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 2006 row cuts average 335.9 elements, 0 column cuts (0 active) in 1.068 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 1313 row cuts average 2.1 elements, 0 column cuts (0 active) in 0.138 seconds - new frequency is 1 -Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.011 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 1050 row cuts average 17.3 elements, 0 column cuts (0 active) in 0.129 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.029 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 2500 row cuts average 26.5 elements, 0 column cuts (0 active) in 1.001 seconds - new frequency is 1 -Cbc0011I Exiting as integer gap of 1700 less than 2200 or 0%% -Cbc0001I Search completed - best objective 29020.95202118316, took 8819 iterations and 0 nodes (11.12 seconds) -Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost -Cuts at root node changed objective from 15329.3 to 27321 -Probing was tried 10 times and created 2358 cuts of which 0 were active after adding rounds of cuts (1.816 seconds) -Gomory was tried 10 times and created 2006 cuts of which 0 were active after adding rounds of cuts (1.068 seconds) -Knapsack was tried 10 times and created 1313 cuts of which 0 were active after adding rounds of cuts (0.138 seconds) -Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.011 seconds) -MixedIntegerRounding2 was tried 10 times and created 1050 cuts of which 0 were active after adding rounds of cuts (0.129 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.029 seconds) -TwoMirCuts was tried 10 times and created 2500 cuts of which 0 were active after adding rounds of cuts (1.001 seconds) +Cbc0038I Before mini branch and bound, 9441 integers at bound fixed and 63 continuous +Cbc0038I Mini branch and bound did not improve solution (2.13 seconds) +Cbc0038I After 2.41 seconds - Feasibility pump exiting - took 0.85 seconds +Cbc0031I 206 added rows had average density of 105.54854 +Cbc0013I At root node, 206 cuts changed objective from 610 to 620.91644 in 10 passes +Cbc0014I Cut generator 0 (Probing) - 1641 row cuts average 2.0 elements, 0 column cuts (0 active) in 2.903 seconds - new frequency is 1 +Cbc0014I Cut generator 1 (Gomory) - 1003 row cuts average 506.7 elements, 0 column cuts (0 active) in 0.518 seconds - new frequency is 1 +Cbc0014I Cut generator 2 (Knapsack) - 751 row cuts average 2.0 elements, 0 column cuts (0 active) in 0.080 seconds - new frequency is 1 +Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.006 seconds - new frequency is -100 +Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 708 row cuts average 17.6 elements, 0 column cuts (0 active) in 0.128 seconds - new frequency is 1 +Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.046 seconds - new frequency is -100 +Cbc0014I Cut generator 6 (TwoMirCuts) - 1300 row cuts average 46.7 elements, 0 column cuts (0 active) in 0.451 seconds - new frequency is 1 +Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 620.91644 (8.63 seconds) +Cbc0012I Integer solution of 631.71534 found by DiveCoefficient after 5804 iterations and 2 nodes (9.26 seconds) +Cbc0012I Integer solution of 625.71534 found by DiveCoefficient after 6183 iterations and 2 nodes (9.57 seconds) +Cbc0038I Full problem 7725 rows 10424 columns, reduced to 60 rows 66 columns +Cbc0012I Integer solution of 623.71534 found by RINS after 6183 iterations and 2 nodes (9.65 seconds) +Cbc0011I Exiting as integer gap of 2.7989071 less than 2000 or 0%% +Cbc0001I Search completed - best objective 623.7153428828003, took 6473 iterations and 3 nodes (10.15 seconds) +Cbc0032I Strong branching done 46 times (993 iterations), fathomed 0 nodes and fixed 0 variables +Cbc0035I Maximum depth 3, 0 variables fixed on reduced cost +Cuts at root node changed objective from 610 to 620.916 +Probing was tried 16 times and created 2012 cuts of which 0 were active after adding rounds of cuts (2.933 seconds) +Gomory was tried 16 times and created 1015 cuts of which 0 were active after adding rounds of cuts (0.573 seconds) +Knapsack was tried 16 times and created 889 cuts of which 0 were active after adding rounds of cuts (0.120 seconds) +Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.006 seconds) +MixedIntegerRounding2 was tried 16 times and created 772 cuts of which 0 were active after adding rounds of cuts (0.202 seconds) +FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.046 seconds) +TwoMirCuts was tried 16 times and created 1389 cuts of which 0 were active after adding rounds of cuts (0.575 seconds) +ImplicationCuts was tried 6 times and created 637 cuts of which 0 were active after adding rounds of cuts (0.008 seconds) Result - Optimal solution found (within gap tolerance) -Objective value: 29020.95202118 -Lower bound: 27320.952 -Gap: 0.06 -Enumerated nodes: 0 -Total iterations: 8819 -Time (CPU seconds): 11.49 -Time (Wallclock seconds): 11.67 +Objective value: 623.71534288 +Lower bound: 620.916 +Gap: 0.00 +Enumerated nodes: 3 +Total iterations: 6473 +Time (CPU seconds): 10.46 +Time (Wallclock seconds): 10.62 -Total time (CPU seconds): 12.70 (Wallclock seconds): 12.97 +Total time (CPU seconds): 11.50 (Wallclock seconds): 11.72 diff --git a/no twighlights.log b/no twighlights.log index aea2dc7..ac9d217 100644 --- a/no twighlights.log +++ b/no twighlights.log @@ -1,149 +1,154 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmpkl4fr1k_.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpkl4fr1k_.pyomo.soln'] +Solver command line: ['/usr/bin/cbc', '-seconds', '10200', '-allow', '2000', '-printingOptions', 'all', '-import', '/tmp/tmp1ops1_px.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmp1ops1_px.pyomo.soln'] Welcome to the CBC MILP Solver Version: 2.9.9 Build Date: Aug 7 2019 -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmpkl4fr1k_.pyomo.lp -stat=1 -solve -solu /tmp/tmpkl4fr1k_.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 +command line - /usr/bin/cbc -seconds 10200 -allow 2000 -printingOptions all -import /tmp/tmp1ops1_px.pyomo.lp -stat=1 -solve -solu /tmp/tmp1ops1_px.pyomo.soln (default strategy 1) +seconds was changed from 1e+100 to 10200 +allowableGap was changed from 1e-10 to 2000 Option for printingOptions changed from normal to all -Presolve 37323 (-99282) rows, 19234 (-52423) columns and 162892 (-464645) elements +Presolve 28199 (-94822) rows, 15531 (-47274) columns and 126932 (-441217) elements Statistics for presolved model -Original problem has 71240 integers (70304 of which binary) -Presolved problem has 19144 integers (18928 of which binary) -==== 15946 zero objective 4 different -15946 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -1728 variables have objective of 1000 +Original problem has 62084 integers (61152 of which binary) +Presolved problem has 15195 integers (14771 of which binary) +==== 13834 zero objective 4 different +13834 variables have objective of 0 +1233 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 ==== absolute objective values 4 different -15946 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -1728 variables have objective of 1000 -==== for integers 15946 zero objective 4 different -15946 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -1638 variables have objective of 1000 -==== for integers absolute objective values 4 different -15946 variables have objective of 0 -208 variables have objective of 20 -1352 variables have objective of 100 -1638 variables have objective of 1000 +13834 variables have objective of 0 +1233 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== for integers 13642 zero objective 3 different +13642 variables have objective of 0 +1137 variables have objective of 1 +416 variables have objective of 20 +==== for integers absolute objective values 3 different +13642 variables have objective of 0 +1137 variables have objective of 1 +416 variables have objective of 20 ===== end objective counts -Problem has 37323 rows, 19234 columns (3288 with objective) and 162892 elements -There are 1650 singletons with objective +Problem has 28199 rows, 15531 columns (1697 with objective) and 126932 elements +There are 1649 singletons with objective Column breakdown: -306 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, +760 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, 0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 18928 of type 0.0->1.0 +0 of type -inf->0.0, 0 of type -inf->up, 14771 of type 0.0->1.0 Row breakdown: -2712 of type E 0.0, 156 of type E 1.0, 0 of type E -1.0, -279 of type E other, 0 of type G 0.0, 0 of type G 1.0, -376 of type G other, 5408 of type L 0.0, 24180 of type L 1.0, -1508 of type L other, 0 of type Range 0.0->1.0, 2704 of type Range other, +2281 of type E 0.0, 156 of type E 1.0, 208 of type E -1.0, +378 of type E other, 0 of type G 0.0, 52 of type G 1.0, +10 of type G other, 3411 of type L 0.0, 20252 of type L 1.0, +1451 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 0 of type Free -Continuous objective value is 243935 - 12.03 seconds -Cgl0002I 44616 variables fixed -Cgl0003I 0 fixed, 208 tightened bounds, 22826 strengthened rows, 47235 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 3826 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 2221 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1079 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 490 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 255 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 229 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 214 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 197 strengthened rows, 0 substitutions -Cgl0004I processed model has 16387 rows, 9762 columns (9672 integer (9464 of which binary)) and 80599 elements -Cbc0038I Initial state - 1275 integers unsatisfied sum - 411.736 -Cbc0038I Pass 1: (22.09 seconds) suminf. 275.36033 (699) obj. 275508 iterations 6394 -Cbc0038I Pass 2: (22.31 seconds) suminf. 251.50450 (630) obj. 278893 iterations 1211 -Cbc0038I Pass 3: (22.42 seconds) suminf. 237.26278 (596) obj. 280250 iterations 470 -Cbc0038I Pass 4: (22.50 seconds) suminf. 231.25228 (584) obj. 281559 iterations 306 -Cbc0038I Pass 5: (22.56 seconds) suminf. 228.30447 (580) obj. 283466 iterations 239 -Cbc0038I Pass 6: (22.60 seconds) suminf. 224.54385 (568) obj. 283611 iterations 52 -Cbc0038I Pass 7: (22.64 seconds) suminf. 220.41141 (557) obj. 281841 iterations 75 -Cbc0038I Pass 8: (22.67 seconds) suminf. 219.91141 (556) obj. 281891 iterations 18 -Cbc0038I Pass 9: (22.70 seconds) suminf. 216.62887 (548) obj. 278935 iterations 28 -Cbc0038I Pass 10: (22.74 seconds) suminf. 216.62887 (548) obj. 278935 iterations 11 -Cbc0038I Pass 11: (22.77 seconds) suminf. 216.62887 (548) obj. 278935 iterations 1 -Cbc0038I Pass 12: (22.96 seconds) suminf. 104.93793 (325) obj. 277541 iterations 1105 -Cbc0038I Pass 13: (23.22 seconds) suminf. 89.97792 (266) obj. 277060 iterations 1082 -Cbc0038I Pass 14: (23.40 seconds) suminf. 87.18147 (261) obj. 276745 iterations 761 -Cbc0038I Pass 15: (23.44 seconds) suminf. 83.46793 (252) obj. 276810 iterations 30 -Cbc0038I Pass 16: (23.47 seconds) suminf. 82.96793 (251) obj. 276860 iterations 19 -Cbc0038I Pass 17: (23.54 seconds) suminf. 78.18433 (247) obj. 277277 iterations 204 -Cbc0038I Pass 18: (23.58 seconds) suminf. 77.57806 (243) obj. 277327 iterations 100 -Cbc0038I Pass 19: (23.62 seconds) suminf. 67.34112 (222) obj. 278330 iterations 84 -Cbc0038I Pass 20: (23.68 seconds) suminf. 65.92745 (219) obj. 278478 iterations 148 -Cbc0038I Pass 21: (23.72 seconds) suminf. 65.98731 (206) obj. 278632 iterations 50 -Cbc0038I Pass 22: (23.75 seconds) suminf. 65.48731 (205) obj. 278632 iterations 2 -Cbc0038I Pass 23: (23.79 seconds) suminf. 50.98731 (175) obj. 279728 iterations 96 -Cbc0038I Pass 24: (23.82 seconds) suminf. 50.98731 (175) obj. 279728 iterations 1 -Cbc0038I Pass 25: (23.86 seconds) suminf. 38.98731 (148) obj. 279915 iterations 83 -Cbc0038I Pass 26: (24.08 seconds) suminf. 35.45286 (143) obj. 281045 iterations 828 -Cbc0038I Pass 27: (24.14 seconds) suminf. 35.45286 (145) obj. 281045 iterations 136 -Cbc0038I Pass 28: (24.22 seconds) suminf. 33.71076 (144) obj. 281155 iterations 337 -Cbc0038I Pass 29: (24.26 seconds) suminf. 33.71076 (144) obj. 281155 iterations 47 -Cbc0038I Pass 30: (24.45 seconds) suminf. 33.05241 (137) obj. 281075 iterations 685 +Continuous objective value is 2592.5 - 11.74 seconds +Cgl0002I 42189 variables fixed +Cgl0003I 0 fixed, 416 tightened bounds, 21262 strengthened rows, 39927 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 7087 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 3304 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1761 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 428 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 88 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 26 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 12 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions +Cgl0004I processed model has 11087 rows, 7586 columns (7250 integer (6834 of which binary)) and 64778 elements +Cbc0038I Initial state - 1148 integers unsatisfied sum - 308.884 +Cbc0038I Pass 1: (21.79 seconds) suminf. 132.59090 (279) obj. 5166.99 iterations 4283 +Cbc0038I Pass 2: (21.83 seconds) suminf. 115.67073 (242) obj. 5159.78 iterations 309 +Cbc0038I Pass 3: (21.85 seconds) suminf. 113.67073 (238) obj. 5160.78 iterations 31 +Cbc0038I Pass 4: (21.87 seconds) suminf. 113.67073 (238) obj. 5160.78 iterations 12 +Cbc0038I Pass 5: (21.95 seconds) suminf. 38.72216 (89) obj. 6688.77 iterations 808 +Cbc0038I Pass 6: (22.01 seconds) suminf. 36.92756 (85) obj. 6555.73 iterations 474 +Cbc0038I Pass 7: (22.03 seconds) suminf. 36.92756 (85) obj. 6555.73 iterations 10 +Cbc0038I Pass 8: (22.14 seconds) suminf. 24.16606 (61) obj. 8376.93 iterations 1047 +Cbc0038I Pass 9: (22.23 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 674 +Cbc0038I Pass 10: (22.25 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 13 +Cbc0038I Pass 11: (22.27 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 3 +Cbc0038I Pass 12: (22.40 seconds) suminf. 26.69535 (68) obj. 9870.32 iterations 955 +Cbc0038I Pass 13: (22.50 seconds) suminf. 19.06151 (47) obj. 9797.91 iterations 677 +Cbc0038I Pass 14: (22.53 seconds) suminf. 17.20639 (42) obj. 9806.96 iterations 17 +Cbc0038I Pass 15: (22.55 seconds) suminf. 17.20639 (42) obj. 9806.96 iterations 3 +Cbc0038I Pass 16: (22.66 seconds) suminf. 20.38749 (54) obj. 10625.8 iterations 839 +Cbc0038I Pass 17: (22.75 seconds) suminf. 14.70685 (43) obj. 10596 iterations 647 +Cbc0038I Pass 18: (22.78 seconds) suminf. 14.70685 (43) obj. 10596 iterations 10 +Cbc0038I Pass 19: (22.80 seconds) suminf. 14.70685 (43) obj. 10596 iterations 4 +Cbc0038I Pass 20: (22.89 seconds) suminf. 19.17471 (57) obj. 12932.5 iterations 775 +Cbc0038I Pass 21: (22.98 seconds) suminf. 15.37252 (43) obj. 12953.2 iterations 639 +Cbc0038I Pass 22: (23.00 seconds) suminf. 15.37252 (43) obj. 12953.2 iterations 4 +Cbc0038I Pass 23: (23.10 seconds) suminf. 16.75837 (44) obj. 12897.3 iterations 828 +Cbc0038I Pass 24: (23.21 seconds) suminf. 13.15520 (36) obj. 12961 iterations 711 +Cbc0038I Pass 25: (23.23 seconds) suminf. 13.15520 (36) obj. 12961 iterations 11 +Cbc0038I Pass 26: (23.40 seconds) suminf. 11.82435 (44) obj. 14112.4 iterations 1106 +Cbc0038I Pass 27: (23.49 seconds) suminf. 10.72764 (34) obj. 14134.8 iterations 599 +Cbc0038I Pass 28: (23.51 seconds) suminf. 10.72764 (34) obj. 14134.8 iterations 11 +Cbc0038I Pass 29: (23.64 seconds) suminf. 17.99600 (56) obj. 14340.5 iterations 874 +Cbc0038I Pass 30: (23.77 seconds) suminf. 14.85158 (56) obj. 14491.8 iterations 795 Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 7967 integers at bound fixed and 43 continuous -Cbc0038I Mini branch and bound did not improve solution (24.48 seconds) -Cbc0038I After 24.48 seconds - Feasibility pump exiting - took 4.32 seconds -Cbc0031I 631 added rows had average density of 14.393027 -Cbc0013I At root node, 631 cuts changed objective from 253685.18 to 271905.7 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 3898 row cuts average 3.2 elements, 0 column cuts (245 active) in 1.358 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 2171 row cuts average 144.4 elements, 0 column cuts (0 active) in 3.571 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 2247 row cuts average 2.3 elements, 0 column cuts (0 active) in 0.210 seconds - new frequency is 1 -Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.071 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 1162 row cuts average 6.3 elements, 0 column cuts (0 active) in 0.142 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.022 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 3316 row cuts average 32.5 elements, 0 column cuts (0 active) in 2.821 seconds - new frequency is 1 -Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 271905.7 (55.94 seconds) -Cbc0010I After 100 nodes, 57 on tree, 1e+50 best solution, best possible 271905.7 (157.36 seconds) -Cbc0010I After 200 nodes, 109 on tree, 1e+50 best solution, best possible 271905.7 (202.91 seconds) -Cbc0010I After 300 nodes, 159 on tree, 1e+50 best solution, best possible 271905.7 (246.36 seconds) -Cbc0010I After 400 nodes, 209 on tree, 1e+50 best solution, best possible 271905.7 (282.02 seconds) -Cbc0010I After 500 nodes, 261 on tree, 1e+50 best solution, best possible 271905.7 (316.04 seconds) -Cbc0010I After 600 nodes, 310 on tree, 1e+50 best solution, best possible 271905.7 (349.89 seconds) -Cbc0010I After 700 nodes, 359 on tree, 1e+50 best solution, best possible 271905.7 (379.69 seconds) -Cbc0010I After 800 nodes, 409 on tree, 1e+50 best solution, best possible 271905.7 (411.29 seconds) -Cbc0010I After 900 nodes, 459 on tree, 1e+50 best solution, best possible 271905.7 (445.93 seconds) -Cbc0010I After 1000 nodes, 509 on tree, 1e+50 best solution, best possible 271905.7 (480.64 seconds) -Cbc0010I After 1100 nodes, 608 on tree, 1e+50 best solution, best possible 271905.7 (499.37 seconds) -Cbc0010I After 1200 nodes, 708 on tree, 1e+50 best solution, best possible 271905.7 (520.89 seconds) -Cbc0010I After 1300 nodes, 808 on tree, 1e+50 best solution, best possible 271905.7 (537.68 seconds) -Cbc0010I After 1400 nodes, 908 on tree, 1e+50 best solution, best possible 271905.7 (552.14 seconds) -Cbc0012I Integer solution of 272705.7 found by rounding after 448734 iterations and 1452 nodes (559.78 seconds) -Cbc0038I Full problem 16387 rows 9762 columns, reduced to 0 rows 0 columns -Cbc0011I Exiting as integer gap of 800 less than 2200 or 0%% -Cbc0001I Search completed - best objective 272705.7047293056, took 448997 iterations and 1453 nodes (561.24 seconds) -Cbc0032I Strong branching done 6808 times (449919 iterations), fathomed 0 nodes and fixed 2 variables -Cbc0035I Maximum depth 523, 518 variables fixed on reduced cost -Cuts at root node changed objective from 253685 to 271906 -Probing was tried 449 times and created 36967 cuts of which 245 were active after adding rounds of cuts (4.132 seconds) -Gomory was tried 449 times and created 14449 cuts of which 0 were active after adding rounds of cuts (17.213 seconds) -Knapsack was tried 449 times and created 26037 cuts of which 0 were active after adding rounds of cuts (5.361 seconds) -Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.071 seconds) -MixedIntegerRounding2 was tried 449 times and created 15587 cuts of which 0 were active after adding rounds of cuts (5.479 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.022 seconds) -TwoMirCuts was tried 449 times and created 21730 cuts of which 0 were active after adding rounds of cuts (6.315 seconds) -ImplicationCuts was tried 19 times and created 3254 cuts of which 0 were active after adding rounds of cuts (0.035 seconds) +Cbc0038I Before mini branch and bound, 5653 integers at bound fixed and 69 continuous of which 21 were internal integer and 0 internal continuous +Cbc0038I Full problem 11087 rows 7586 columns, reduced to 1871 rows 1255 columns +Cbc0038I Mini branch and bound did not improve solution (26.95 seconds) +Cbc0038I After 26.95 seconds - Feasibility pump exiting - took 6.14 seconds +Cbc0031I 447 added rows had average density of 32.127517 +Cbc0013I At root node, 447 cuts changed objective from 2690 to 3121.695 in 20 passes +Cbc0014I Cut generator 0 (Probing) - 6559 row cuts average 2.0 elements, 0 column cuts (0 active) in 2.643 seconds - new frequency is 1 +Cbc0014I Cut generator 1 (Gomory) - 2557 row cuts average 138.4 elements, 0 column cuts (0 active) in 5.190 seconds - new frequency is 1 +Cbc0014I Cut generator 2 (Knapsack) - 5220 row cuts average 2.3 elements, 0 column cuts (0 active) in 0.336 seconds - new frequency is 1 +Cbc0014I Cut generator 3 (Clique) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.328 seconds - new frequency is -100 +Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 3145 row cuts average 21.5 elements, 0 column cuts (0 active) in 0.380 seconds - new frequency is 1 +Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.074 seconds - new frequency is -100 +Cbc0014I Cut generator 6 (TwoMirCuts) - 2969 row cuts average 28.4 elements, 0 column cuts (0 active) in 2.594 seconds - new frequency is 1 +Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 3121.695 (134.65 seconds) +Cbc0010I After 100 nodes, 61 on tree, 1e+50 best solution, best possible 3121.695 (388.01 seconds) +Cbc0010I After 200 nodes, 114 on tree, 1e+50 best solution, best possible 3121.695 (548.61 seconds) +Cbc0010I After 300 nodes, 167 on tree, 1e+50 best solution, best possible 3121.695 (714.25 seconds) +Cbc0010I After 400 nodes, 219 on tree, 1e+50 best solution, best possible 3121.695 (850.98 seconds) +Cbc0010I After 500 nodes, 272 on tree, 1e+50 best solution, best possible 3121.695 (956.51 seconds) +Cbc0010I After 600 nodes, 321 on tree, 1e+50 best solution, best possible 3121.695 (1064.45 seconds) +Cbc0010I After 700 nodes, 370 on tree, 1e+50 best solution, best possible 3121.695 (1210.80 seconds) +Cbc0010I After 800 nodes, 420 on tree, 1e+50 best solution, best possible 3121.695 (1331.75 seconds) +Cbc0010I After 900 nodes, 473 on tree, 1e+50 best solution, best possible 3121.695 (1441.13 seconds) +Cbc0010I After 1000 nodes, 523 on tree, 1e+50 best solution, best possible 3121.695 (1535.55 seconds) +Cbc0010I After 1100 nodes, 621 on tree, 1e+50 best solution, best possible 3154.71 (1882.42 seconds) +Cbc0010I After 1200 nodes, 721 on tree, 1e+50 best solution, best possible 3154.71 (2048.07 seconds) +Cbc0010I After 1300 nodes, 821 on tree, 1e+50 best solution, best possible 3154.71 (2190.34 seconds) +Cbc0010I After 1400 nodes, 921 on tree, 1e+50 best solution, best possible 3154.71 (2267.84 seconds) +Cbc0010I After 1500 nodes, 1021 on tree, 1e+50 best solution, best possible 3154.71 (2330.02 seconds) +Cbc0010I After 1600 nodes, 1121 on tree, 1e+50 best solution, best possible 3154.71 (2362.29 seconds) +Cbc0010I After 1700 nodes, 1221 on tree, 1e+50 best solution, best possible 3154.71 (2375.36 seconds) +Cbc0010I After 1800 nodes, 1321 on tree, 1e+50 best solution, best possible 3154.71 (2402.68 seconds) +Cbc0010I After 1900 nodes, 1421 on tree, 1e+50 best solution, best possible 3154.71 (2419.25 seconds) +Cbc0010I After 2000 nodes, 1521 on tree, 1e+50 best solution, best possible 3154.71 (2425.78 seconds) +Cbc0004I Integer solution of 3299.5061 found after 1845451 iterations and 2030 nodes (2428.00 seconds) +Cbc0038I Full problem 11087 rows 7586 columns, reduced to 2259 rows 1474 columns +Cbc0011I Exiting as integer gap of 144.79613 less than 2000 or 0%% +Cbc0001I Search completed - best objective 3299.506146440773, took 1848260 iterations and 2031 nodes (2446.82 seconds) +Cbc0032I Strong branching done 21594 times (1847065 iterations), fathomed 0 nodes and fixed 0 variables +Cbc0035I Maximum depth 1028, 0 variables fixed on reduced cost +Cuts at root node changed objective from 2690 to 3121.7 +Probing was tried 2211 times and created 139387 cuts of which 0 were active after adding rounds of cuts (21.905 seconds) +Gomory was tried 2211 times and created 8280 cuts of which 0 were active after adding rounds of cuts (67.476 seconds) +Knapsack was tried 2211 times and created 93728 cuts of which 0 were active after adding rounds of cuts (26.333 seconds) +Clique was tried 20 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.328 seconds) +MixedIntegerRounding2 was tried 2211 times and created 37351 cuts of which 0 were active after adding rounds of cuts (25.142 seconds) +FlowCover was tried 20 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.074 seconds) +TwoMirCuts was tried 2211 times and created 34927 cuts of which 0 were active after adding rounds of cuts (20.102 seconds) +ImplicationCuts was tried 73 times and created 35397 cuts of which 0 were active after adding rounds of cuts (0.288 seconds) Result - Optimal solution found (within gap tolerance) -Objective value: 272705.70472931 -Lower bound: 271905.705 -Gap: 0.00 -Enumerated nodes: 1453 -Total iterations: 448997 -Time (CPU seconds): 562.33 -Time (Wallclock seconds): 563.34 +Objective value: 3299.50614644 +Lower bound: 3154.710 +Gap: 0.05 +Enumerated nodes: 2031 +Total iterations: 1848260 +Time (CPU seconds): 2447.82 +Time (Wallclock seconds): 40349.19 -Total time (CPU seconds): 563.79 (Wallclock seconds): 564.95 +Total time (CPU seconds): 2449.20 (Wallclock seconds): 40350.67 diff --git a/no weekends.log b/no weekends.log index 665ac2f..74dbd4d 100644 --- a/no weekends.log +++ b/no weekends.log @@ -1,125 +1,97 @@ -Solver command line: ['/usr/bin/cbc', '-seconds', '3200', '-allow', '2200', '-printingOptions', 'all', '-import', '/tmp/tmpkhpv9a3u.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpkhpv9a3u.pyomo.soln'] +Solver command line: ['/usr/bin/cbc', '-seconds', '10200', '-allow', '2000', '-printingOptions', 'all', '-import', '/tmp/tmpg9k4n7yb.pyomo.lp', '-stat=1', '-solve', '-solu', '/tmp/tmpg9k4n7yb.pyomo.soln'] Welcome to the CBC MILP Solver Version: 2.9.9 Build Date: Aug 7 2019 -command line - /usr/bin/cbc -seconds 3200 -allow 2200 -printingOptions all -import /tmp/tmpkhpv9a3u.pyomo.lp -stat=1 -solve -solu /tmp/tmpkhpv9a3u.pyomo.soln (default strategy 1) -seconds was changed from 1e+100 to 3200 -allowableGap was changed from 1e-10 to 2200 +command line - /usr/bin/cbc -seconds 10200 -allow 2000 -printingOptions all -import /tmp/tmpg9k4n7yb.pyomo.lp -stat=1 -solve -solu /tmp/tmpg9k4n7yb.pyomo.soln (default strategy 1) +seconds was changed from 1e+100 to 10200 +allowableGap was changed from 1e-10 to 2000 Option for printingOptions changed from normal to all -Presolve 51155 (-79938) rows, 21938 (-44207) columns and 202022 (-585467) elements +Presolve 42174 (-75751) rows, 17808 (-39901) columns and 170470 (-545319) elements Statistics for presolved model -Original problem has 65728 integers (64896 of which binary) -Presolved problem has 21848 integers (21632 of which binary) -==== 19456 zero objective 3 different -19456 variables have objective of 0 -208 variables have objective of 20 -2274 variables have objective of 1000 -==== absolute objective values 3 different -19456 variables have objective of 0 -208 variables have objective of 20 -2274 variables have objective of 1000 -==== for integers 19456 zero objective 3 different -19456 variables have objective of 0 -208 variables have objective of 20 -2184 variables have objective of 1000 -==== for integers absolute objective values 3 different -19456 variables have objective of 0 -208 variables have objective of 20 -2184 variables have objective of 1000 +Original problem has 56988 integers (56160 of which binary) +Presolved problem has 17472 integers (17048 of which binary) +==== 17248 zero objective 4 different +17248 variables have objective of 0 +96 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== absolute objective values 4 different +17248 variables have objective of 0 +96 variables have objective of 1 +48 variables have objective of 10 +416 variables have objective of 20 +==== for integers 17056 zero objective 2 different +17056 variables have objective of 0 +416 variables have objective of 20 +==== for integers absolute objective values 2 different +17056 variables have objective of 0 +416 variables have objective of 20 ===== end objective counts -Problem has 51155 rows, 21938 columns (2482 with objective) and 202022 elements -There are 298 singletons with objective +Problem has 42174 rows, 17808 columns (560 with objective) and 170470 elements +There are 512 singletons with objective Column breakdown: -306 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, +760 of type 0.0->inf, 0 of type 0.0->up, 0 of type lo->inf, 0 of type lo->up, 0 of type free, 0 of type fixed, -0 of type -inf->0.0, 0 of type -inf->up, 21632 of type 0.0->1.0 +0 of type -inf->0.0, 0 of type -inf->up, 17048 of type 0.0->1.0 Row breakdown: -2712 of type E 0.0, 520 of type E 1.0, 0 of type E -1.0, -227 of type E other, 0 of type G 0.0, 0 of type G 1.0, -376 of type G other, 4056 of type L 0.0, 41756 of type L 1.0, -1508 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, +2281 of type E 0.0, 520 of type E 1.0, 208 of type E -1.0, +326 of type E other, 0 of type G 0.0, 52 of type G 1.0, +33 of type G other, 2270 of type L 0.0, 35028 of type L 1.0, +1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 0 of type Free -Continuous objective value is 239817 - 9.92 seconds -Cgl0002I 40560 variables fixed -Cgl0003I 0 fixed, 208 tightened bounds, 31984 strengthened rows, 69557 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 4437 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 2091 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 1067 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 143 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 135 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 126 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 120 strengthened rows, 0 substitutions -Cgl0003I 0 fixed, 0 tightened bounds, 113 strengthened rows, 0 substitutions -Cgl0004I processed model has 10896 rows, 9762 columns (9672 integer (9464 of which binary)) and 72490 elements -Cbc0038I Initial state - 346 integers unsatisfied sum - 76.2913 -Cbc0038I Pass 1: (15.76 seconds) suminf. 33.26604 (123) obj. 249238 iterations 1545 -Cbc0038I Pass 2: (15.78 seconds) suminf. 25.78093 (112) obj. 251318 iterations 269 -Cbc0038I Pass 3: (15.80 seconds) suminf. 25.79137 (111) obj. 251456 iterations 69 -Cbc0038I Pass 4: (15.82 seconds) suminf. 21.19438 (98) obj. 249900 iterations 423 -Cbc0038I Pass 5: (15.84 seconds) suminf. 21.83309 (100) obj. 250336 iterations 56 -Cbc0038I Pass 6: (15.86 seconds) suminf. 20.71492 (94) obj. 249739 iterations 149 -Cbc0038I Pass 7: (15.88 seconds) suminf. 20.09167 (98) obj. 252364 iterations 33 -Cbc0038I Pass 8: (15.91 seconds) suminf. 19.76241 (84) obj. 250731 iterations 323 -Cbc0038I Pass 9: (15.93 seconds) suminf. 19.49844 (84) obj. 251114 iterations 93 -Cbc0038I Pass 10: (15.95 seconds) suminf. 21.05958 (87) obj. 250700 iterations 261 -Cbc0038I Pass 11: (15.96 seconds) suminf. 19.48336 (84) obj. 253142 iterations 83 -Cbc0038I Pass 12: (15.98 seconds) suminf. 18.90177 (82) obj. 253142 iterations 11 -Cbc0038I Pass 13: (16.00 seconds) suminf. 19.56423 (80) obj. 250761 iterations 260 -Cbc0038I Pass 14: (16.02 seconds) suminf. 19.58715 (83) obj. 251156 iterations 97 -Cbc0038I Pass 15: (16.04 seconds) suminf. 20.75833 (83) obj. 250573 iterations 263 -Cbc0038I Pass 16: (16.06 seconds) suminf. 20.45839 (85) obj. 250971 iterations 81 -Cbc0038I Pass 17: (16.08 seconds) suminf. 19.69155 (83) obj. 250561 iterations 141 -Cbc0038I Pass 18: (16.09 seconds) suminf. 19.43441 (86) obj. 250946 iterations 40 -Cbc0038I Pass 19: (16.11 seconds) suminf. 21.02156 (80) obj. 250564 iterations 260 -Cbc0038I Pass 20: (16.13 seconds) suminf. 17.85922 (77) obj. 250965 iterations 106 -Cbc0038I Pass 21: (16.15 seconds) suminf. 17.45928 (78) obj. 250601 iterations 200 -Cbc0038I Pass 22: (16.17 seconds) suminf. 17.92720 (78) obj. 250994 iterations 212 -Cbc0038I Pass 23: (16.19 seconds) suminf. 21.11487 (78) obj. 250598 iterations 209 -Cbc0038I Pass 24: (16.21 seconds) suminf. 19.59336 (79) obj. 250987 iterations 67 -Cbc0038I Pass 25: (16.23 seconds) suminf. 18.27678 (74) obj. 250985 iterations 255 -Cbc0038I Pass 26: (16.24 seconds) suminf. 18.38292 (78) obj. 251377 iterations 30 -Cbc0038I Pass 27: (16.26 seconds) suminf. 17.97511 (82) obj. 251341 iterations 129 -Cbc0038I Pass 28: (16.28 seconds) suminf. 17.97511 (81) obj. 251174 iterations 8 -Cbc0038I Pass 29: (16.30 seconds) suminf. 17.12085 (75) obj. 250970 iterations 164 -Cbc0038I Pass 30: (16.31 seconds) suminf. 16.96998 (77) obj. 251356 iterations 34 +Continuous objective value is 2560 - 24.20 seconds +Cgl0002I 38773 variables fixed +Cgl0003I 0 fixed, 416 tightened bounds, 26485 strengthened rows, 49102 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 3627 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 1395 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 599 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 11 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions +Cgl0003I 0 fixed, 0 tightened bounds, 3 strengthened rows, 0 substitutions +Cgl0004I processed model has 9381 rows, 8734 columns (8398 integer (7982 of which binary)) and 64789 elements +Cbc0038I Initial state - 321 integers unsatisfied sum - 91.7677 +Cbc0038I Pass 1: (28.38 seconds) suminf. 2.86955 (8) obj. 4945.48 iterations 1696 +Cbc0038I Pass 2: (28.40 seconds) suminf. 3.40577 (10) obj. 5000.2 iterations 23 +Cbc0038I Pass 3: (28.41 seconds) suminf. 2.34720 (10) obj. 5037.45 iterations 132 +Cbc0038I Pass 4: (28.43 seconds) suminf. 0.68053 (6) obj. 5205.81 iterations 14 +Cbc0038I Pass 5: (28.43 seconds) suminf. 0.68053 (6) obj. 5205.81 iterations 0 +Cbc0038I Pass 6: (28.45 seconds) suminf. 0.66667 (2) obj. 4934.07 iterations 151 +Cbc0038I Solution found of 4934.07 +Cbc0038I Branch and bound needed to clear up 2 general integers +Cbc0038I Full problem 9381 rows 8734 columns, reduced to 58 rows 112 columns +Cbc0038I Mini branch and bound could not fix general integers Cbc0038I No solution found this major pass -Cbc0038I Before mini branch and bound, 9127 integers at bound fixed and 42 continuous -Cbc0038I Full problem 10896 rows 9762 columns, reduced to 514 rows 451 columns -Cbc0038I Mini branch and bound did not improve solution (16.47 seconds) -Cbc0038I After 16.47 seconds - Feasibility pump exiting - took 0.94 seconds -Cbc0012I Integer solution of 258618.43 found by DiveCoefficient after 3400 iterations and 0 nodes (23.00 seconds) -Cbc0031I 95 added rows had average density of 558.45263 -Cbc0013I At root node, 95 cuts changed objective from 239816.84 to 258618.43 in 10 passes -Cbc0014I Cut generator 0 (Probing) - 181 row cuts average 21.4 elements, 0 column cuts (0 active) in 2.128 seconds - new frequency is 1 -Cbc0014I Cut generator 1 (Gomory) - 301 row cuts average 1018.4 elements, 0 column cuts (0 active) in 1.454 seconds - new frequency is 1 -Cbc0014I Cut generator 2 (Knapsack) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.057 seconds - new frequency is -100 -Cbc0014I Cut generator 3 (Clique) - 1 row cuts average 5.0 elements, 0 column cuts (0 active) in 0.017 seconds - new frequency is -100 -Cbc0014I Cut generator 4 (MixedIntegerRounding2) - 122 row cuts average 82.9 elements, 0 column cuts (0 active) in 0.155 seconds - new frequency is 1 -Cbc0014I Cut generator 5 (FlowCover) - 0 row cuts average 0.0 elements, 0 column cuts (0 active) in 0.024 seconds - new frequency is -100 -Cbc0014I Cut generator 6 (TwoMirCuts) - 171 row cuts average 135.5 elements, 0 column cuts (0 active) in 0.580 seconds - new frequency is 1 -Cbc0001I Search completed - best objective 258618.4298960748, took 3400 iterations and 0 nodes (23.02 seconds) +Cbc0038I Before mini branch and bound, 8060 integers at bound fixed and 137 continuous of which 30 were internal integer and 0 internal continuous +Cbc0038I Full problem 9381 rows 8734 columns, reduced to 135 rows 145 columns +Cbc0038I Mini branch and bound did not improve solution (29.22 seconds) +Cbc0038I After 29.22 seconds - Feasibility pump exiting - took 1.01 seconds +Cbc0012I Integer solution of 4162.5731 found by DiveCoefficient after 0 iterations and 0 nodes (29.38 seconds) +Cbc0011I Exiting as integer gap of 1602.5731 less than 2000 or 0%% +Cbc0001I Search completed - best objective 4162.57311524356, took 0 iterations and 0 nodes (29.39 seconds) Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost -Cuts at root node changed objective from 239817 to 258618 -Probing was tried 10 times and created 181 cuts of which 0 were active after adding rounds of cuts (2.128 seconds) -Gomory was tried 10 times and created 301 cuts of which 0 were active after adding rounds of cuts (1.454 seconds) -Knapsack was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.057 seconds) -Clique was tried 10 times and created 1 cuts of which 0 were active after adding rounds of cuts (0.017 seconds) -MixedIntegerRounding2 was tried 10 times and created 122 cuts of which 0 were active after adding rounds of cuts (0.155 seconds) -FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.024 seconds) -TwoMirCuts was tried 10 times and created 171 cuts of which 0 were active after adding rounds of cuts (0.580 seconds) +Cuts at root node changed objective from 2560 to 2560 +Probing was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Gomory was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Knapsack was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +Clique was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +MixedIntegerRounding2 was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +FlowCover was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) +TwoMirCuts was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds) -Result - Optimal solution found +Result - Optimal solution found (within gap tolerance) -Objective value: 258618.42989607 +Objective value: 4162.57311524 +Lower bound: 2560.000 +Gap: 0.63 Enumerated nodes: 0 -Total iterations: 3400 -Time (CPU seconds): 23.58 -Time (Wallclock seconds): 23.80 +Total iterations: 0 +Time (CPU seconds): 29.88 +Time (Wallclock seconds): 30.09 -Total time (CPU seconds): 25.14 (Wallclock seconds): 25.45 +Total time (CPU seconds): 31.28 (Wallclock seconds): 31.62 diff --git a/run.py b/run.py index b0d25ab..d0c2078 100644 --- a/run.py +++ b/run.py @@ -23,8 +23,8 @@ sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth") Rota = RotaBuilder(datetime.date(2020, 9, 7), weeks_to_rota=weeks_to_rota, - balance_offset_modifier=1, - max_weekend_frequency=1, + balance_offset_modifier=4, + max_weekend_frequency=2, max_night_frequency=2) rota_collections = { @@ -300,7 +300,7 @@ with open('trainees.csv', newline='') as f: name, site, grade, fte, nwd, end_date, oop, extra = row # Ignore trainees if fte == 0 (what are they doing here anyway) - if fte == 0: + if fte == "0": continue nwds = nwd.split(",").title() if nwd else None @@ -308,12 +308,20 @@ with open('trainees.csv', newline='') as f: oop = oop.split("-") if oop else None #print(nwds, end_date, oop) for rot in rota_collections: - rota_collections[rot].add_worker( + + Rota = rota_collections[rot] + Rota.add_worker( Worker(Rota, n, name, site.lower(), int(grade[2]), int(fte), nwds, end_date, oop)) with open("rotas.html", "w") as f: - f.write("") + f.write(""" + + + + + + """) for rot in rota_collections: print("Running rota: ", rot) @@ -340,8 +348,8 @@ for rot in rota_collections: Rota.model, tee=True, options={ - "seconds": 3200, - "allow": 2200, + "seconds": 10200, + "allow": 2000, }, logfile="{}.log".format(rot) ) # solve the model with the, options="seconds=60" selected solver @@ -352,7 +360,7 @@ for rot in rota_collections: week_table = ResultsHolder.get_work_table( ) # list with the required workers - worker_timetable = ResultsHolder.get_worker_timetable() + #worker_timetable = ResultsHolder.get_worker_timetable() worker_timetable_brief = ResultsHolder.get_worker_timetable_brief( show_prefs=False) @@ -370,7 +378,7 @@ for rot in rota_collections: f.write("\n") f.write("\n\n") - f.write("
{}
".format(worker_timetable_brief)) + f.write(ResultsHolder.get_worker_timetable_html(table_name=rot)) f.write("\n\n") f.write("
{}
".format(worker_shift_summary)) f.write("\n\n\n") diff --git a/s.js b/s.js new file mode 100644 index 0000000..a0614f0 --- /dev/null +++ b/s.js @@ -0,0 +1,99 @@ +Object.defineProperties(Array.prototype, { + count: { + value: function (query) { + /* + Counts number of occurrences of query in array, an integer >= 0 + Uses the javascript == notion of equality. + */ + var count = 0; + for(let i = 0; i < this.length; i++) + if(this[i] == query) + count++; + return count; + } + } +}); + +rows = $(".table-div table .worker-row"); +//console.log(trs) + +workers = {}; + +rows.each((n, tr) => { + + //console.log(tr); + + worker_td = $(tr).find("td:first"); + + worker = worker_td.attr("data-worker"); + + shift_tds = $(tr).find(".rota-day"); + shifts = [] + + shift_tds.each((n, td) => { + shifts.push($(td).attr("data-shift")); + }) + + shifts_unique = new Set(shifts); + shifts_unique.delete(""); + //console.log(shifts_unique); + + weekends_worked = 0; + + weeks = shift_tds.length / 7; + + whole_weekends_worked = 0; + + for(var i = 1; i <= weeks; i++) { + //console.log($(tr).find(`[data-week='${i}'][data-day='Sat']`)); + if($(tr).find(`[data-week='${i}'][data-day='Sat']`).attr("data-shift") != "" || $(tr).find(`[data-week='${i}'][data-day='Sun']`).attr("data-shift") != "") { weekends_worked = weekends_worked + 1; } + if($(tr).find(`[data-week='${i}'][data-day='Sat']`).attr("data-shift") != "" && $(tr).find(`[data-week='${i}'][data-day='Sun']`).attr("data-shift") != "") { whole_weekends_worked = whole_weekends_worked + 1; } + } + + shift_counts = {}; + + total_shifts = 0; + days_lost = 0; + shifts_unique.forEach(el => { + //console.log(el); + shift_counts[el] = shifts.count(el); + total_shifts = total_shifts + shifts.count(el); + + if(el == "night_weekday") { days_lost = days_lost + shifts.count(el) / 4 * 5 } + if(el == "night_weekend") { + days_lost = days_lost + shifts.count(el) / 3 * 4 + whole_weekends_worked = whole_weekends_worked - shifts.count(el) / 3 + } + + }); + + days_lost = days_lost + whole_weekends_worked + console.log(worker, whole_weekends_worked); + + //days_lost = days_lost + whole_weekends_worked; + //console.log(shift_counts); + + workers[worker] = { + "site": worker_td.attr("data-site"), + "nwds": worker_td.attr("data-nwds"), + "fte": worker_td.attr("data-fte_adj"), + "end_date": worker_td.attr("data-end_date"), + "shifts": shifts, + "shift_types": shifts_unique, + "weekends_worked": weekends_worked, + "shift_counts": shift_counts, + "days_lost": days_lost, + //"shifts" + } + + sc = JSON.stringify(shift_counts); + + worker_td.after(`
Total shifts: ${total_shifts}, Weekends: ${weekends_worked}, Training days lost: ${days_lost}, ${sc}
`) + +}) + +$("th.worker").append($("").click(() => { + $(".rota-day").toggle(); + $(".worker-summary").toggle(); + +})) \ No newline at end of file diff --git a/shifts.py b/shifts.py index 222b09a..265e74c 100644 --- a/shifts.py +++ b/shifts.py @@ -119,6 +119,8 @@ class RotaBuilder(object): "balance_blocks": True, "balance_shifts": True, "balance_weekends": True, + "prevent_monday_after_full_weekends": False, + "prevent_fridays_before_full_weekends": True, } def build_model(self): @@ -209,17 +211,19 @@ class RotaBuilder(object): initialize=0, ) - self.model.shift_count_t1 = Var( - ((worker.id) for worker in self.workers), - domain=NonNegativeReals, - initialize=0, - ) + if self.constraint_options["balance_shifts"]: - self.model.shift_count_t2 = Var( - ((worker.id) for worker in self.workers), - domain=NonNegativeReals, - initialize=0, - ) + self.model.shift_count_t1 = Var( + ((worker.id) for worker in self.workers), + domain=NonNegativeReals, + initialize=0, + ) + + self.model.shift_count_t2 = Var( + ((worker.id) for worker in self.workers), + domain=NonNegativeReals, + initialize=0, + ) if self.constraint_options["balance_nights"]: # We also try to even out the night shifts seperately @@ -284,7 +288,7 @@ class RotaBuilder(object): self.model.works_weekend = Var( ((worker.id, week) for worker in self.workers - for week in self.weeks), + for week in self.weeks), domain=Binary, initialize=0, ) @@ -295,7 +299,6 @@ class RotaBuilder(object): initialize=0, ) - self.model.weekend_shift_count_t1 = Var( ((worker.id) for worker in self.workers), domain=NonNegativeReals, @@ -331,10 +334,12 @@ class RotaBuilder(object): def availability_init(model, wid, week, day): if (wid, week, day) in self.unavailable_to_work: - # print((wid, week, day)) + #print((wid, week, day)) return 0 return 1 + #print(self.unavailable_to_work) + self.model.available = Param( ((worker.id, week, day) for worker in self.workers for week, day in self.get_week_day_combinations()), @@ -545,9 +550,6 @@ class RotaBuilder(object): worker.fte_adj) worker.shift_target_number[shift.name] = target_shifts - if worker.name == "Jean Sukumar": - print(worker.name, shift.name, target_shifts, - total_shifts, worker.fte_adj) if shift.hard_constrain_shift: adjusted_balance_offset = shift.balance_offset @@ -590,12 +592,14 @@ class RotaBuilder(object): # t1-t2 is the target # As the objective is to minimise t1+t2 and t1 and t2 are positive reals # t1+t2 approximates the absolute target (which otherwise requires a quadratic solver) - self.model.constraints.add( - self.model.shift_count_t1[worker.id] - - self.model.shift_count_t2[worker.id] == sum( - (self.model.shift_count[worker.id, shift.name] - - worker.shift_target_number[shift.name]) * - shift.balance_weighting for shift in self.get_shifts())) + if self.constraint_options["balance_shifts"]: + self.model.constraints.add( + self.model.shift_count_t1[worker.id] - + self.model.shift_count_t2[worker.id] == sum( + (self.model.shift_count[worker.id, shift.name] - + worker.shift_target_number[shift.name]) * + shift.balance_weighting + for shift in self.get_shifts())) #if "night" not in shift.constraints)) if self.constraint_options["balance_nights"]: @@ -603,15 +607,15 @@ class RotaBuilder(object): worker.shift_target_number[shift.name] for shift in self.get_shifts_with_constraint("night")) - min_shifts = night_shift_target_number - 20 - max_shifts = night_shift_target_number + 20 + # min_shifts = night_shift_target_number - 20 + # max_shifts = night_shift_target_number + 20 - self.model.constraints.add( - inequality( - min_shifts, - self.model.night_shift_count[worker.id], - max_shifts, - )) + # self.model.constraints.add( + # inequality( + # min_shifts, + # self.model.night_shift_count[worker.id], + # max_shifts, + # )) self.model.constraints.add( self.model.night_shift_count_t1[worker.id] - @@ -619,6 +623,7 @@ class RotaBuilder(object): self.model.night_shift_count[worker.id] - night_shift_target_number) + # This may need to be updated xU = 6 xL = 1 self.model.constraints.add( @@ -644,6 +649,52 @@ class RotaBuilder(object): # self.model.constraints.add( # self.model.night_shift_count_w[worker.id] >= 0) + # We use a similar method to balance the number of weekends worked + # I'm not entirely sure how split shifts will affect this + if self.constraint_options["balance_weekends"]: + weekend_shift_target_number = sum( + worker.shift_target_number[shift.name] + for shift in self.get_shifts() + if not set(("Sat", "Sun")).isdisjoint(shift.shift_days)) + + # min_shifts = weekend_shift_target_number - 20 + # max_shifts = weekend_shift_target_number + 20 + + # self.model.constraints.add( + # inequality( + # min_shifts, + # self.model.worker_weekend_count[worker.id], + # max_shifts, + # )) + + self.model.constraints.add( + self.model.weekend_shift_count_t1[worker.id] - + self.model.weekend_shift_count_t2[worker.id] == + self.model.worker_weekend_count[worker.id] - + weekend_shift_target_number) + + xU = 10 + xL = 1 + self.model.constraints.add( + inequality( + xL, + self.model.weekend_shift_count_t1[worker.id] + + self.model.weekend_shift_count_t2[worker.id] + 1, + xU, + )) + + self.model.constraints.add( + self.model.weekend_shift_count_w[worker.id] >= xL * + (self.model.weekend_shift_count_t1[worker.id] + + self.model.weekend_shift_count_t2[worker.id] + 1) * 2 - + xL * xL) + + self.model.constraints.add( + self.model.weekend_shift_count_w[worker.id] >= xU * + (self.model.weekend_shift_count_t1[worker.id] + + self.model.weekend_shift_count_t2[worker.id] + 1) * 2 - + xU * xU) + # Ensure worker is not allocated shifts on non working days if worker.nwd: for week, day, shift in self.get_all_shiftclass_combinations(): @@ -652,24 +703,56 @@ class RotaBuilder(object): 0 == self.model.works[worker.id, week, day, shift.name]) - # for week_blocks in self.get_week_block_iterator( - # self.max_night_frequency): - # if self.get_shifts_with_constraint("night"): - # # Prevent nights more than once every n weeks - # self.model.constraints.add(1 >= sum( - # self.model.shift_week_worker_assigned[shift.name, week, - # worker.id] - # for week in week_blocks - # for shift in self.get_shifts_with_constraint("night"))) + if self.constraint_options["balance_blocks"]: + for week_blocks in self.get_week_block_iterator( + self.max_night_frequency): + if self.get_shifts_with_constraint("night"): + # Prevent nights more than once every n weeks + self.model.constraints.add(1 >= sum( + self.model.shift_week_worker_assigned[shift.name, + week, + worker.id] + for week in week_blocks + for shift in self.get_shifts_with_constraint( + "night"))) - # for week_blocks in self.get_week_block_iterator( - # self.max_weekend_frequency): - # # Prevent weekend shifts more than once every n weeks - # self.model.constraints.add( - # 1 >= sum(self.model.works_weekend[worker.id, week] - # for week in week_blocks)) + for week_blocks in self.get_week_block_iterator( + self.max_weekend_frequency): + # Prevent weekend shifts more than once every n weeks + self.model.constraints.add( + 1 >= sum(self.model.works_weekend[worker.id, week] + for week in week_blocks)) for week in self.weeks: + if self.constraint_options[ + "prevent_monday_after_full_weekends"]: + # Ignore last week + if week + 1 in self.weeks: + self.model.constraints.add( + 2 >= sum(self.model.works[worker.id, week, "Sat", + shift.name] + for shift in self.get_shifts()) + + sum(self.model.works[worker.id, week, "Sun", + shift.name] + for shift in self.get_shifts()) + + sum(self.model.works[worker.id, week + 1, "Mon", + shift.name] + for shift in self.get_shifts())) + if self.constraint_options[ + "prevent_fridays_before_full_weekends"]: + self.model.constraints.add( + 2 >= sum(self.model.works[worker.id, week, "Sat", + shift.name] + for shift in self.get_shifts() + if shift.name not in ("night_weekend")) + + sum(self.model.works[worker.id, week, "Sun", + shift.name] + for shift in self.get_shifts() if shift.name not in + ("night_weekend")) + + sum(self.model.works[worker.id, week, "Fri", + shift.name] + for shift in self.get_shifts() if shift.name not in + ("night_weekend"))) # # model.weekend_count stores the number of weekend shifts that a worker is assigned to wor # # this is used (by the objective) to balance the total number of weekend shifts worked @@ -755,6 +838,12 @@ class RotaBuilder(object): n2week, n2day = weeks_days[n] n2 = 0 + try: + n3week, n3day = weeks_days[n + 3] + except IndexError: + n3week, n3day = weeks_days[n] + n3 = 0 + if self.get_shift_names_by_day(day): # Unable to work (hard constraint not preference) self.model.constraints.add( @@ -793,6 +882,13 @@ class RotaBuilder(object): shift] for shift in self.get_shift_names_by_day(n2day) if shift != constraint_shift.name)) + # self.model.constraints.add( + # 1 >= self.model.works[worker.id, week, day, + # constraint_shift.name] + + # sum(n3 * self.model.works[worker.id, n3week, n3day, + # shift] + # for shift in self.get_shift_names_by_day(n3day) + # if shift != constraint_shift.name)) self.model.constraints.add( 1 >= self.model.works[worker.id, week, day, constraint_shift.name] + @@ -816,7 +912,7 @@ class RotaBuilder(object): # c = len(workers) - balance_modifier_constant = 500 + balance_modifier_constant = 1 if self.constraint_options["balance_shifts"]: shift_balancing = sum(balance_modifier_constant * @@ -827,7 +923,7 @@ class RotaBuilder(object): shift_balancing = 0 if self.constraint_options["balance_nights"]: - night_balance_modifier_constant = 1 + night_balance_modifier_constant = 10 night_shift_balancing = sum( night_balance_modifier_constant * self.model.night_shift_count_w[(worker.id)] @@ -837,6 +933,15 @@ class RotaBuilder(object): else: night_shift_balancing = 0 + if self.constraint_options["balance_weekends"]: + weekend_balance_modifier_constant = 5 + weekend_shift_balancing = sum( + weekend_balance_modifier_constant * + self.model.weekend_shift_count_w[(worker.id)] + for worker in self.workers) + else: + weekend_shift_balancing = 0 + preference_constant = 10 # Preferences preferences = sum( @@ -860,16 +965,16 @@ class RotaBuilder(object): if self.constraint_options["balance_blocks"]: blocks_balancing = sum( - 100 * self.model.blocks_assigned[week, shift] + 1 * self.model.blocks_assigned[week, shift] for week in self.weeks for shift in self.shifts_to_assign_as_blocks()) else: blocks_balancing = 0 - return night_shift_balancing + #return weekend_shift_balancing + blocks_balancing #return shift_balancing + preferences + blocks_balancing #return shift_balancing + preferences + nights_site_balancing + blocks_balancing - #return shift_balancing + night_shift_balancing + preferences + nights_site_balancing + blocks_balancing + return shift_balancing + night_shift_balancing + preferences + nights_site_balancing + blocks_balancing # add objective function to the model. rule (pass function) or expr (pass expression directly) self.model.obj = Objective(rule=obj_rule, sense=minimize) @@ -1120,6 +1225,20 @@ class RotaBuilder(object): def get_workers_total_fte(self): return self.full_time_equivalent + def get_worker_details(self): + + w = defaultdict(list) + for worker in self.workers: + w[worker.site].append(worker) + + l = [] + for site in w: + l.append("{}: {}".format( + site, + sum([worker.fte_adj for worker in w[site]]) / 100)) + t = "\n".join(l) + return "Full time equivalent trainees by site:\n{}".format(t) + class RotaResults(object): def __init__(self, rota, results): @@ -1193,9 +1312,9 @@ class RotaResults(object): return timetable def get_worker_timetable_brief(self, - show_prefs=True, - marker_every=19, - show_unavailable=True): + show_prefs=False, + marker_every=30, + show_unavailable=False): model = self.rota.model week_string = "{:20}".format("-Week-") + "".join( [7 * str("{}".format(w))[-1:] for w in self.rota.weeks]) @@ -1253,6 +1372,112 @@ class RotaResults(object): timetable.insert(0, days_string) return "\n".join(timetable) + def get_worker_timetable_html(self, + include_html_tag=False, + table_name="Test"): + model = self.rota.model + + timetable = [] + + date_row = [""] + + n = 0 + for week, day in self.rota.get_week_day_combinations(): + d = self.rota.start_date + datetime.timedelta(n) + date_row.append("Week {}: {}".format( + d, week, day)) + n = n + 1 + timetable.append("{}".format( + "".join(date_row))) + + for worker in self.rota.workers: + shifts = [] + if worker.nwd is not None: + nwds = ", ".join(worker.nwd) + else: + nwds = None + + w = [ + "{} ({}) [{}]" + .format(worker.site, worker.site, nwds, worker.site, + worker.name, worker.fte, worker.fte_adj, + worker.end_date, worker.name, worker.grade, worker.fte) + ] + n = 0 + for week, day in self.rota.get_week_day_combinations(): + d = self.rota.start_date + datetime.timedelta(n) + n = n + 1 + a = "-" + shift_name = "" + for shift in self.rota.get_shift_names_by_day(day): + if model.works[worker.id, week, day, shift].value == 1: + shifts.append(shift) + a = shift[0] + shift_name = shift + break + css_class = "" + if model.available[worker.id, week, day] > 0: + available = True + else: + available = False + css_class = "unavailable" + if worker.name == "Delilah Trimmer": + pass + w.append( + "{}" + .format(shift_name, d, css_class, shift_name, available, d, + week, day, a)) + + shift_count = "" + for s in set(shifts): + shift_count = shift_count + "{}: {}, ".format( + s, shifts.count(s)) + + shift_count = shift_count + "#weekends_worked: {}\\#".format( + model.worker_weekend_count[worker.id].value) + timetable.append("{}".format( + "".join(w))) + #timetable.append("{}".format("".join(w), shift_count)) + + # if show_prefs: + # # prefs + # w = ["{:20}".format("Preferences")] + # for week, day in self.rota.get_week_day_combinations(): + # if model.pref_not_to_work[worker.id, week, day] > 0: + # w.append("Y") + # else: + # w.append("N") + # timetable.append("".join(w)) + + # if show_unavailable: + # # prefs + # w = ["{:20}".format("Unavailable")] + # for week, day in self.rota.get_week_day_combinations(): + # if model.available[worker.id, week, day] > 0: + # w.append("A") + # else: + # w.append("U") + # timetable.append("".join(w)) + + html = """ + +
+ {}
+
+ + """.format(table_name, "\n".join(timetable)) + + if include_html_tag: + html = """ + + + + + + {}""".format(html) + + return html + def get_shift_summary(self): works = self.rota.model.works timetable = { @@ -1282,6 +1507,35 @@ class RotaResults(object): total_shifts, ", ".join(l))) return "\n".join(t) + def get_shift_summary_html(self): + works = self.rota.model.works + timetable = { + worker.get_details(): + {shift[0]: "" + for shift in self.rota.get_shift_names()} + for worker in self.rota.workers + } + #timetable = { worker.get_details() : { shift : "" for shift in ["truro_twilight"] } for worker in workers } + t = [] + for worker in self.rota.workers: + l = [] + + total_shifts = 0 + for shift in self.rota.get_shift_names(): + #for shift in ["truro_twilight"]: + c = [ + works[worker.id, week, day, shift] + for week in self.rota.weeks for day in days + ].count(1) + if c > 0: + l.append("{} ({})".format(shift, c)) + total_shifts = total_shifts + c + #print(worker.id, shift) + timetable[worker.get_details()][shift[0]] = c + t.append("{} [{}]: {}".format(worker.get_full_details(), + total_shifts, ", ".join(l))) + return "\n".join(t) + #def get_no_preference(no_pref): # """Extract to a list the workers not satisfied with their weekend preference.""" # return [worker.id for worker in workers if no_pref[worker.id].value == 1] @@ -1332,4 +1586,24 @@ class RotaResults(object): 1), "balance: {},".format( self.rota.model.night_shift_count_w[worker.id].value), - ) \ No newline at end of file + ) + + def get_weekend_details(self): + for worker in self.rota.workers: + print( + "{:20}".format(worker.name), + "worked: {},".format( + self.rota.model.worker_weekend_count[(worker.id)].value), + "target: {},".format( + sum([ + worker.shift_target_number[shift.name] + for shift in self.rota.get_shifts() + if not set(("Sat", "Sun")).isdisjoint(shift.shift_days) + ])), + "target_diff: {},".format( + self.rota.model.weekend_shift_count_t1[(worker.id)].value + + self.rota.model.weekend_shift_count_t2[(worker.id)].value + + 1), + "balance: {},".format( + self.rota.model.weekend_shift_count_w[worker.id].value), + ) diff --git a/test.py b/test.py index a26b59d..7bdbcb0 100644 --- a/test.py +++ b/test.py @@ -17,15 +17,28 @@ import operator use_neos = False -weeks_to_rota = 26 +weeks_to_rota = 12 + +time_to_run = 1200 +allow = 3000 sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth") Rota = RotaBuilder(datetime.date(2020, 9, 7), weeks_to_rota=weeks_to_rota, - balance_offset_modifier=1, - max_weekend_frequency=1, - max_night_frequency=1) + balance_offset_modifier=8, + max_weekend_frequency=2, + max_night_frequency=2) + +Rota.constraint_options["limit_to_1_st1_on_nights"] = False +Rota.constraint_options["ensure_1_st4_plus_on_nights"] = False +Rota.constraint_options["balance_nights"] = False +Rota.constraint_options["constrain_time_off_after_nights"] = False +Rota.constraint_options["balance_nights_across_sites"] = False +Rota.constraint_options["balance_blocks"] = True +Rota.constraint_options["balance_weekends"] = True +Rota.constraint_options["prevent_monday_after_full_weekends"] = False +Rota.constraint_options["prevent_fridays_before_full_weekends"] = True Rota.add_shifts( # SingleShift(("exeter", ), "exeter_twilight", 12.5, days[:5]), @@ -107,7 +120,7 @@ Rota.add_shifts( "night_weekday", 12.25, days[:4], - balance_offset=4, + balance_offset=2, balance_weighting=1, #hard_constrain_shift=False, workers_required=3, @@ -119,7 +132,7 @@ Rota.add_shifts( "night_weekend", 12.25, days[4:], - balance_offset=3, + balance_offset=2, balance_weighting=1, #hard_constrain_shift=False, workers_required=3, @@ -208,19 +221,12 @@ else: Worker(Rota, n, name, site.lower(), int(grade[2]), int(fte), nwds, end_date, oop)) -Rota.constraint_options["limit_to_1_st1_on_nights"] = False -Rota.constraint_options["ensure_1_st4_plus_on_nights"] = True -Rota.constraint_options["balance_nights"] = True -Rota.constraint_options["constrain_time_off_after_nights"] = False -Rota.constraint_options["balance_nights_across_sites"] = False -Rota.constraint_options["balance_blocks"] = False -Rota.constraint_options["balance_weekends"] = False - print(0) Rota.build_shifts_and_workers() Rota.build_model() +#print(Rota.get_worker_details()) print(1) opt = SolverFactory('cbc') # choose a solver #opt = SolverFactory('ipopt') # choose a solver @@ -234,8 +240,8 @@ else: Rota.model, tee=True, options={ - "seconds": 1200, - "allow": 15, + "seconds": time_to_run, + "allow": allow, }, logfile="test.log" ) # solve the model with the, options="seconds=60" selected solver @@ -255,7 +261,11 @@ worker_timetable_brief = ResultsHolder.get_worker_timetable_brief( print(worker_timetable_brief) print(Rota.get_workers_total_fte()) -ResultsHolder.get_night_details() +ResultsHolder.get_weekend_details() +#ResultsHolder.get_night_details() + +with open("test.html", "w") as f: + f.write(ResultsHolder.get_worker_timetable_html(True)) # for i in ResultsHolder.rota.model.blocks_worker_shift_count: # n = ResultsHolder.rota.model.blocks_worker_shift_count[i].value diff --git a/timetable.css b/timetable.css new file mode 100644 index 0000000..5844ef9 --- /dev/null +++ b/timetable.css @@ -0,0 +1,81 @@ +html { + + /* color: red; */ +} + +table { + /* margin-top: 50px; */ + padding-top: 100px; + text-align:center; + table-layout : fixed; + /* width:150px */ + width: 200%; + overflow-x: auto; + display: block; + position: relative; + +} + +#table-div { + overflow-x: auto; +} + +th { + text-align:center; + white-space:nowrap; + transform: rotate(90deg) translateX(-100px); + position: sticky; + top:0; + +} +th p { + margin:0 -100% ; + display:inline-block; +} +th p:before{ + content:''; + width:0; + padding-top:110%;/* takes width as reference, + 10% for faking some extra padding */ + display:inline-block; + vertical-align:middle; +} + +td, th { + max-width: 10px; + padding: 0px; +} + +tr { + padding: 0px; +} + +tr:hover { + background-color: lightblue; +} + +th.worker { + max-width: 100%; + width: 200px; + /* width: 100px; */ +} + +.plymouth { + color: #9169FF; +} +.exeter { + color: #5F60E8; +} +.truro { + color: #0074D9; +} +.torquay { + color: #5FA8E8; +} +.unavailable { + color: lightgray; +} + +.worker-summary { + position: absolute; + display: none; +} \ No newline at end of file diff --git a/workers.py b/workers.py index 89e6693..6fb61bf 100644 --- a/workers.py +++ b/workers.py @@ -57,6 +57,9 @@ class Worker: if end_oop_date > Rota.rota_end_date: end_oop_date = Rota.rota_end_date + if start_oop_date < Rota.start_date: + start_oop_date = Rota.start_date + oop_length = (end_oop_date - start_oop_date).days days_to_work = days_to_work - oop_length @@ -85,9 +88,10 @@ class Worker: self.fte_adj = self.fte * self.proportion_rota_to_work def __lt__(self, other): - return (self.site, self.grade, self.name) < ( + return (self.site, self.grade, self.fte_adj, self.name) < ( other.site, other.grade, + other.fte_adj, other.name, )