This commit is contained in:
Ross
2020-05-24 10:16:25 +01:00
parent 63dcc7ce78
commit a6326bcaf6
15 changed files with 1138 additions and 809 deletions
+1
View File
@@ -3,3 +3,4 @@ trainees.csv
sample.txt sample.txt
*.csv *.csv
*.html *.html
*.log
+9 -1
View File
@@ -4,12 +4,20 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{ {
"name": "Python: Test", "name": "Python: Test",
"type": "python", "type": "python",
"request": "launch", "request": "launch",
"program": "${workspaceFolder}/test.py", "program": "${workspaceFolder}/test.py",
"console": "integratedTerminal" "console": "integratedTerminal"
} },
{
"name": "Python: Run",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/run.py",
"console": "integratedTerminal"
},
] ]
} }
+1 -1
View File
@@ -1 +1 @@
,ross,maverick.fritz.box,16.05.2020 17:19,file:///home/ross/.config/libreoffice/4; ,ross,maverick.fritz.box,22.05.2020 22:23,file:///home/ross/.config/libreoffice/4;
+134 -118
View File
@@ -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 Welcome to the CBC MILP Solver
Version: 2.9.9 Version: 2.9.9
Build Date: Aug 7 2019 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) 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 3200 seconds was changed from 1e+100 to 10200
allowableGap was changed from 1e-10 to 2200 allowableGap was changed from 1e-10 to 2000
Option for printingOptions changed from normal to all 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 Statistics for presolved model
Original problem has 109096 integers (108160 of which binary) Original problem has 97028 integers (96096 of which binary)
Presolved problem has 25896 integers (25688 of which binary) Presolved problem has 20875 integers (20459 of which binary)
==== 21788 zero objective 4 different ==== 19514 zero objective 4 different
21788 variables have objective of 0 19514 variables have objective of 0
208 variables have objective of 20 1233 variables have objective of 1
1352 variables have objective of 100 48 variables have objective of 10
2638 variables have objective of 1000 416 variables have objective of 20
==== absolute objective values 4 different ==== absolute objective values 4 different
21788 variables have objective of 0 19514 variables have objective of 0
208 variables have objective of 20 1233 variables have objective of 1
1352 variables have objective of 100 48 variables have objective of 10
2638 variables have objective of 1000 416 variables have objective of 20
==== for integers 21788 zero objective 4 different ==== for integers 19322 zero objective 3 different
21788 variables have objective of 0 19322 variables have objective of 0
208 variables have objective of 20 1137 variables have objective of 1
1352 variables have objective of 100 416 variables have objective of 20
2548 variables have objective of 1000 ==== for integers absolute objective values 3 different
==== for integers absolute objective values 4 different 19322 variables have objective of 0
21788 variables have objective of 0 1137 variables have objective of 1
208 variables have objective of 20 416 variables have objective of 20
1352 variables have objective of 100
2548 variables have objective of 1000
===== end objective counts ===== end objective counts
Problem has 63617 rows, 25986 columns (4198 with objective) and 256502 elements Problem has 51518 rows, 21211 columns (1697 with objective) and 209445 elements
There are 1650 singletons with objective There are 1649 singletons with objective
Column breakdown: 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 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: Row breakdown:
2704 of type E 0.0, 676 of type E 1.0, 0 of type E -1.0, 2273 of type E 0.0, 676 of type E 1.0, 208 of type E -1.0,
279 of type E other, 0 of type G 0.0, 0 of type G 1.0, 378 of type E other, 0 of type G 0.0, 52 of type G 1.0,
418 of type G other, 5408 of type L 0.0, 49868 of type L 1.0, 43 of type G other, 3411 of type L 0.0, 41843 of type L 1.0,
1560 of type L other, 0 of type Range 0.0->1.0, 2704 of type Range other, 2634 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other,
0 of type Free 0 of type Free
Continuous objective value is 178488 - 30.16 seconds Continuous objective value is 2592.5 - 16.65 seconds
Cgl0002I 75712 variables fixed Cgl0002I 71445 variables fixed
Cgl0003I 0 fixed, 208 tightened bounds, 37490 strengthened rows, 47518 substitutions Cgl0003I 0 fixed, 416 tightened bounds, 34673 strengthened rows, 40175 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1438 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 7041 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 2803 strengthened rows, 0 substitutions
Cgl0004I processed model has 24041 rows, 16522 columns (16432 integer (16224 of which binary)) and 124218 elements Cgl0003I 0 fixed, 0 tightened bounds, 708 strengthened rows, 0 substitutions
Cbc0038I Initial state - 1405 integers unsatisfied sum - 471.24 Cgl0003I 0 fixed, 0 tightened bounds, 2 strengthened rows, 0 substitutions
Cbc0038I Pass 1: (45.34 seconds) suminf. 304.35185 (762) obj. 223295 iterations 6320 Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cbc0038I Pass 2: (45.54 seconds) suminf. 259.90250 (677) obj. 229665 iterations 1456 Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cbc0038I Pass 3: (45.71 seconds) suminf. 237.42785 (612) obj. 231568 iterations 757 Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cbc0038I Pass 4: (45.76 seconds) suminf. 234.36193 (605) obj. 231838 iterations 256 Cgl0003I 0 fixed, 0 tightened bounds, 1 strengthened rows, 0 substitutions
Cbc0038I Pass 5: (45.80 seconds) suminf. 233.19893 (597) obj. 232546 iterations 202 Cgl0004I processed model has 18110 rows, 13274 columns (12938 integer (12522 of which binary)) and 109434 elements
Cbc0038I Pass 6: (45.83 seconds) suminf. 232.04656 (590) obj. 233310 iterations 71 Cbc0038I Initial state - 1221 integers unsatisfied sum - 351.402
Cbc0038I Pass 7: (45.86 seconds) suminf. 231.54656 (589) obj. 233360 iterations 8 Cbc0038I Pass 1: (30.58 seconds) suminf. 155.95883 (336) obj. 5432.65 iterations 6635
Cbc0038I Pass 8: (45.89 seconds) suminf. 231.31610 (590) obj. 233360 iterations 40 Cbc0038I Pass 2: (30.65 seconds) suminf. 142.79755 (306) obj. 5456.2 iterations 563
Cbc0038I Pass 9: (45.92 seconds) suminf. 229.14180 (587) obj. 233352 iterations 22 Cbc0038I Pass 3: (30.69 seconds) suminf. 137.30963 (290) obj. 5386.89 iterations 259
Cbc0038I Pass 10: (45.94 seconds) suminf. 229.14180 (587) obj. 233352 iterations 1 Cbc0038I Pass 4: (30.72 seconds) suminf. 137.30963 (290) obj. 5386.89 iterations 1
Cbc0038I Pass 11: (45.98 seconds) suminf. 219.44422 (557) obj. 231301 iterations 113 Cbc0038I Pass 5: (30.75 seconds) suminf. 122.80963 (261) obj. 5401.39 iterations 61
Cbc0038I Pass 12: (46.02 seconds) suminf. 212.43029 (535) obj. 229437 iterations 116 Cbc0038I Pass 6: (30.78 seconds) suminf. 109.80963 (235) obj. 5414.39 iterations 52
Cbc0038I Pass 13: (46.03 seconds) suminf. 212.43029 (535) obj. 229437 iterations 0 Cbc0038I Pass 7: (30.82 seconds) suminf. 99.30963 (214) obj. 5424.89 iterations 76
Cbc0038I Pass 14: (46.06 seconds) suminf. 208.43029 (527) obj. 229837 iterations 31 Cbc0038I Pass 8: (30.85 seconds) suminf. 94.30963 (204) obj. 5429.89 iterations 23
Cbc0038I Pass 15: (46.08 seconds) suminf. 208.43029 (527) obj. 229837 iterations 1 Cbc0038I Pass 9: (30.88 seconds) suminf. 85.30963 (186) obj. 5438.89 iterations 44
Cbc0038I Pass 16: (46.11 seconds) suminf. 204.43029 (519) obj. 230237 iterations 18 Cbc0038I Pass 10: (30.91 seconds) suminf. 78.30963 (172) obj. 5445.89 iterations 37
Cbc0038I Pass 17: (46.14 seconds) suminf. 204.43029 (519) obj. 230237 iterations 3 Cbc0038I Pass 11: (30.94 seconds) suminf. 64.21464 (142) obj. 5454.39 iterations 83
Cbc0038I Pass 18: (46.17 seconds) suminf. 196.93029 (504) obj. 230987 iterations 35 Cbc0038I Pass 12: (30.97 seconds) suminf. 63.71079 (139) obj. 5454.39 iterations 34
Cbc0038I Pass 19: (46.19 seconds) suminf. 196.93029 (504) obj. 230987 iterations 2 Cbc0038I Pass 13: (31.00 seconds) suminf. 54.21079 (120) obj. 5454.89 iterations 81
Cbc0038I Pass 20: (46.22 seconds) suminf. 189.43029 (489) obj. 231737 iterations 25 Cbc0038I Pass 14: (31.03 seconds) suminf. 54.21079 (120) obj. 5454.89 iterations 19
Cbc0038I Pass 21: (46.25 seconds) suminf. 189.43029 (489) obj. 231737 iterations 6 Cbc0038I Pass 15: (31.07 seconds) suminf. 53.21079 (118) obj. 5455.39 iterations 30
Cbc0038I Pass 22: (46.27 seconds) suminf. 184.43029 (479) obj. 232237 iterations 25 Cbc0038I Pass 16: (31.10 seconds) suminf. 53.21079 (118) obj. 5455.39 iterations 33
Cbc0038I Pass 23: (46.30 seconds) suminf. 184.43029 (479) obj. 232237 iterations 4 Cbc0038I Pass 17: (31.13 seconds) suminf. 51.71079 (115) obj. 5455.39 iterations 30
Cbc0038I Pass 24: (46.33 seconds) suminf. 178.43029 (467) obj. 232837 iterations 25 Cbc0038I Pass 18: (31.16 seconds) suminf. 51.71079 (115) obj. 5455.39 iterations 32
Cbc0038I Pass 25: (46.36 seconds) suminf. 178.43029 (467) obj. 232837 iterations 3 Cbc0038I Pass 19: (31.19 seconds) suminf. 48.71079 (109) obj. 5455.39 iterations 67
Cbc0038I Pass 26: (46.38 seconds) suminf. 175.93029 (462) obj. 233087 iterations 16 Cbc0038I Pass 20: (31.22 seconds) suminf. 48.71079 (109) obj. 5455.39 iterations 24
Cbc0038I Pass 27: (46.41 seconds) suminf. 175.93029 (462) obj. 233087 iterations 5 Cbc0038I Pass 21: (31.25 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 47
Cbc0038I Pass 28: (46.44 seconds) suminf. 174.93029 (460) obj. 233187 iterations 7 Cbc0038I Pass 22: (31.29 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 38
Cbc0038I Pass 29: (46.46 seconds) suminf. 174.93029 (460) obj. 233187 iterations 1 Cbc0038I Pass 23: (31.32 seconds) suminf. 46.21079 (104) obj. 5455.39 iterations 33
Cbc0038I Pass 30: (46.49 seconds) suminf. 173.43029 (457) obj. 233337 iterations 6 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 No solution found this major pass
Cbc0038I Before mini branch and bound, 14611 integers at bound fixed and 43 continuous 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 (46.52 seconds) Cbc0038I Mini branch and bound did not improve solution (31.61 seconds)
Cbc0038I After 46.52 seconds - Feasibility pump exiting - took 3.36 seconds Cbc0038I After 31.61 seconds - Feasibility pump exiting - took 2.82 seconds
Cbc0031I 552 added rows had average density of 29.197464 Cbc0031I 483 added rows had average density of 39.521739
Cbc0013I At root node, 552 cuts changed objective from 188237.94 to 222332.75 in 10 passes Cbc0013I At root node, 483 cuts changed objective from 2690 to 3117.1725 in 20 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 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) - 2373 row cuts average 245.7 elements, 0 column cuts (0 active) in 7.187 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) - 1879 row cuts average 2.3 elements, 0 column cuts (0 active) in 0.268 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.095 seconds - new frequency is -100 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) - 1177 row cuts average 13.5 elements, 0 column cuts (0 active) in 0.242 seconds - new frequency is 1 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.039 seconds - new frequency is -100 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) - 3221 row cuts average 43.5 elements, 0 column cuts (0 active) in 4.283 seconds - new frequency is 1 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 222332.75 (95.56 seconds) Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 3117.1725 (161.21 seconds)
Cbc0010I After 100 nodes, 58 on tree, 1e+50 best solution, best possible 222332.75 (140.65 seconds) Cbc0010I After 100 nodes, 60 on tree, 1e+50 best solution, best possible 3117.1725 (568.76 seconds)
Cbc0010I After 200 nodes, 109 on tree, 1e+50 best solution, best possible 222332.75 (153.72 seconds) Cbc0010I After 200 nodes, 111 on tree, 1e+50 best solution, best possible 3117.1725 (847.95 seconds)
Cbc0010I After 300 nodes, 159 on tree, 1e+50 best solution, best possible 222332.75 (166.84 seconds) Cbc0010I After 300 nodes, 163 on tree, 1e+50 best solution, best possible 3117.1725 (1116.36 seconds)
Cbc0010I After 400 nodes, 211 on tree, 1e+50 best solution, best possible 222332.75 (180.19 seconds) Cbc0010I After 400 nodes, 215 on tree, 1e+50 best solution, best possible 3117.1725 (1357.97 seconds)
Cbc0010I After 500 nodes, 260 on tree, 1e+50 best solution, best possible 222332.75 (194.37 seconds) Cbc0010I After 500 nodes, 266 on tree, 1e+50 best solution, best possible 3117.1725 (1525.26 seconds)
Cbc0010I After 600 nodes, 312 on tree, 1e+50 best solution, best possible 222332.75 (208.13 seconds) Cbc0010I After 600 nodes, 316 on tree, 1e+50 best solution, best possible 3117.1725 (1671.45 seconds)
Cbc0010I After 700 nodes, 363 on tree, 1e+50 best solution, best possible 222332.75 (223.59 seconds) Cbc0010I After 700 nodes, 367 on tree, 1e+50 best solution, best possible 3117.1725 (1874.27 seconds)
Cbc0010I After 800 nodes, 412 on tree, 1e+50 best solution, best possible 222332.75 (239.21 seconds) Cbc0010I After 800 nodes, 419 on tree, 1e+50 best solution, best possible 3117.1725 (2033.39 seconds)
Cbc0012I Integer solution of 225548.92 found by rounding after 83817 iterations and 877 nodes (249.96 seconds) Cbc0010I After 900 nodes, 466 on tree, 1e+50 best solution, best possible 3117.1725 (2189.03 seconds)
Cbc0038I Full problem 24041 rows 16522 columns, reduced to 0 rows 0 columns Cbc0010I After 1000 nodes, 518 on tree, 1e+50 best solution, best possible 3117.1725 (2327.79 seconds)
Cbc0038I Full problem 24041 rows 16522 columns, reduced to 716 rows 543 columns Cbc0010I After 1100 nodes, 616 on tree, 1e+50 best solution, best possible 3126.9955 (2600.73 seconds)
Cbc0012I Integer solution of 224493.06 found by RINS after 85051 iterations and 900 nodes (257.47 seconds) Cbc0010I After 1200 nodes, 716 on tree, 1e+50 best solution, best possible 3126.9955 (2639.75 seconds)
Cbc0010I After 900 nodes, 38 on tree, 224493.06 best solution, best possible 222332.75 (257.55 seconds) Cbc0010I After 1300 nodes, 816 on tree, 1e+50 best solution, best possible 3126.9955 (2703.37 seconds)
Cbc0011I Exiting as integer gap of 2160.3118 less than 2200 or 0%% Cbc0010I After 1400 nodes, 916 on tree, 1e+50 best solution, best possible 3126.9955 (2795.95 seconds)
Cbc0001I Search completed - best objective 224493.0622792392, took 85147 iterations and 901 nodes (257.69 seconds) Cbc0010I After 1500 nodes, 1016 on tree, 1e+50 best solution, best possible 3126.9955 (2869.50 seconds)
Cbc0032I Strong branching done 3076 times (85272 iterations), fathomed 0 nodes and fixed 0 variables Cbc0010I After 1600 nodes, 1116 on tree, 1e+50 best solution, best possible 3126.9955 (2933.50 seconds)
Cbc0035I Maximum depth 178, 1114 variables fixed on reduced cost Cbc0010I After 1700 nodes, 1216 on tree, 1e+50 best solution, best possible 3126.9955 (2989.15 seconds)
Cuts at root node changed objective from 188238 to 222333 Cbc0010I After 1800 nodes, 1316 on tree, 1e+50 best solution, best possible 3126.9955 (3039.58 seconds)
Probing was tried 920 times and created 13923 cuts of which 0 were active after adding rounds of cuts (10.780 seconds) Cbc0010I After 1900 nodes, 1416 on tree, 1e+50 best solution, best possible 3126.9955 (3051.57 seconds)
Gomory was tried 920 times and created 4524 cuts of which 0 were active after adding rounds of cuts (24.789 seconds) Cbc0010I After 2000 nodes, 1516 on tree, 1e+50 best solution, best possible 3126.9955 (3075.06 seconds)
Knapsack was tried 920 times and created 9817 cuts of which 0 were active after adding rounds of cuts (12.716 seconds) Cbc0010I After 2100 nodes, 1616 on tree, 1e+50 best solution, best possible 3126.9955 (3088.92 seconds)
Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.095 seconds) Cbc0010I After 2200 nodes, 1716 on tree, 1e+50 best solution, best possible 3126.9955 (3129.25 seconds)
MixedIntegerRounding2 was tried 920 times and created 5513 cuts of which 0 were active after adding rounds of cuts (16.556 seconds) Cbc0004I Integer solution of 3274.7611 found after 1698960 iterations and 2300 nodes (3165.29 seconds)
FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.039 seconds) Cbc0010I After 2300 nodes, 1812 on tree, 3274.7611 best solution, best possible 3126.9955 (3165.30 seconds)
TwoMirCuts was tried 920 times and created 9162 cuts of which 0 were active after adding rounds of cuts (11.763 seconds) Cbc0038I Full problem 18110 rows 13274 columns, reduced to 2471 rows 1761 columns
ImplicationCuts was tried 20 times and created 2198 cuts of which 0 were active after adding rounds of cuts (0.049 seconds) 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) Result - Optimal solution found (within gap tolerance)
Objective value: 224493.06227924 Objective value: 3274.76114235
Lower bound: 222332.750 Lower bound: 3126.996
Gap: 0.01 Gap: 0.05
Enumerated nodes: 901 Enumerated nodes: 2301
Total iterations: 85147 Total iterations: 1699719
Time (CPU seconds): 258.90 Time (CPU seconds): 3189.68
Time (Wallclock seconds): 259.64 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
+122 -112
View File
@@ -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 Welcome to the CBC MILP Solver
Version: 2.9.9 Version: 2.9.9
Build Date: Aug 7 2019 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) 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 3200 seconds was changed from 1e+100 to 10200
allowableGap was changed from 1e-10 to 2200 allowableGap was changed from 1e-10 to 2000
Option for printingOptions changed from normal to all 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 Statistics for presolved model
Original problem has 27872 integers (27040 of which binary) Original problem has 22044 integers (21216 of which binary)
Presolved problem has 15088 integers (14872 of which binary) Presolved problem has 11784 integers (11360 of which binary)
==== 13606 zero objective 3 different ==== 11560 zero objective 4 different
13606 variables have objective of 0 11560 variables have objective of 0
208 variables have objective of 20 96 variables have objective of 1
1364 variables have objective of 1000 48 variables have objective of 10
==== absolute objective values 3 different 416 variables have objective of 20
13606 variables have objective of 0 ==== absolute objective values 4 different
208 variables have objective of 20 11560 variables have objective of 0
1364 variables have objective of 1000 96 variables have objective of 1
==== for integers 13606 zero objective 3 different 48 variables have objective of 10
13606 variables have objective of 0 416 variables have objective of 20
208 variables have objective of 20 ==== for integers 11368 zero objective 2 different
1274 variables have objective of 1000 11368 variables have objective of 0
==== for integers absolute objective values 3 different 416 variables have objective of 20
13606 variables have objective of 0 ==== for integers absolute objective values 2 different
208 variables have objective of 20 11368 variables have objective of 0
1274 variables have objective of 1000 416 variables have objective of 20
===== end objective counts ===== end objective counts
Problem has 19601 rows, 15178 columns (1572 with objective) and 97892 elements Problem has 15576 rows, 12120 columns (560 with objective) and 82539 elements
There are 298 singletons with objective There are 512 singletons with objective
Column breakdown: 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 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: Row breakdown:
2712 of type E 0.0, 0 of type E 1.0, 0 of type E -1.0, 2281 of type E 0.0, 0 of type E 1.0, 208 of type E -1.0,
227 of type E other, 0 of type G 0.0, 0 of type G 1.0, 326 of type E other, 0 of type G 0.0, 52 of type G 1.0,
334 of type G other, 4056 of type L 0.0, 10816 of type L 1.0, 0 of type G other, 2270 of type L 0.0, 9030 of type L 1.0,
1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 1409 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other,
0 of type Free 0 of type Free
Continuous objective value is 307977 - 1.79 seconds Continuous objective value is 2560 - 9.87 seconds
Cgl0002I 9464 variables fixed Cgl0002I 9517 variables fixed
Cgl0003I 0 fixed, 208 tightened bounds, 12068 strengthened rows, 72112 substitutions Cgl0003I 0 fixed, 416 tightened bounds, 9800 strengthened rows, 49679 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 3874 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 2540 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 2414 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 1884 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 913 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 568 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 472 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 113 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 426 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 82 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 419 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 77 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 416 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 71 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 394 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 67 strengthened rows, 0 substitutions
Cgl0004I processed model has 3557 rows, 3002 columns (2912 integer (2704 of which binary)) and 27294 elements Cgl0004I processed model has 3086 rows, 3046 columns (2710 integer (2294 of which binary)) and 25548 elements
Cbc0038I Initial state - 203 integers unsatisfied sum - 48.1942 Cbc0038I Initial state - 146 integers unsatisfied sum - 37.469
Cbc0038I Pass 1: (4.31 seconds) suminf. 25.79319 (98) obj. 308847 iterations 1030 Cbc0038I Pass 1: (11.59 seconds) suminf. 0.47173 (2) obj. 4275.76 iterations 590
Cbc0038I Pass 2: (4.31 seconds) suminf. 20.95041 (81) obj. 308850 iterations 75 Cbc0038I Pass 2: (11.59 seconds) suminf. 0.47173 (2) obj. 4275.76 iterations 8
Cbc0038I Pass 3: (4.32 seconds) suminf. 19.51710 (76) obj. 308846 iterations 18 Cbc0038I Pass 3: (11.60 seconds) suminf. 0.00000 (0) obj. 4323.8 iterations 9
Cbc0038I Pass 4: (4.32 seconds) suminf. 16.38158 (66) obj. 309105 iterations 146 Cbc0038I Solution found of 4323.8
Cbc0038I Pass 5: (4.33 seconds) suminf. 15.78139 (64) obj. 309104 iterations 56 Cbc0038I Relaxing continuous gives 3974.12
Cbc0038I Pass 6: (4.34 seconds) suminf. 17.82947 (66) obj. 309861 iterations 149 Cbc0038I Cleaned solution of 3974.12
Cbc0038I Pass 7: (4.34 seconds) suminf. 16.87253 (64) obj. 309853 iterations 56 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 Pass 8: (4.35 seconds) suminf. 16.34740 (64) obj. 309851 iterations 17 Cbc0038I Full problem 3086 rows 3046 columns, reduced to 52 rows 49 columns
Cbc0038I Pass 9: (4.36 seconds) suminf. 17.31553 (66) obj. 311385 iterations 128 Cbc0038I Mini branch and bound did not improve solution (11.63 seconds)
Cbc0038I Pass 10: (4.36 seconds) suminf. 16.18974 (65) obj. 311381 iterations 52 Cbc0038I Freeing continuous variables gives a solution of 3974.12
Cbc0038I Pass 11: (4.37 seconds) suminf. 16.66807 (65) obj. 309850 iterations 85 Cbc0038I Round again with cutoff of 3832.71
Cbc0038I Pass 12: (4.37 seconds) suminf. 16.39342 (65) obj. 309855 iterations 36 Cbc0038I Pass 4: (11.66 seconds) suminf. 1.45488 (8) obj. 3832.71 iterations 29
Cbc0038I Pass 13: (4.38 seconds) suminf. 19.03518 (68) obj. 311416 iterations 132 Cbc0038I Pass 5: (11.68 seconds) suminf. 0.64928 (9) obj. 3832.71 iterations 261
Cbc0038I Pass 14: (4.39 seconds) suminf. 15.97431 (63) obj. 311425 iterations 75 Cbc0038I Pass 6: (11.69 seconds) suminf. 1.21829 (7) obj. 3832.71 iterations 255
Cbc0038I Pass 15: (4.39 seconds) suminf. 15.48765 (62) obj. 311431 iterations 18 Cbc0038I Pass 7: (11.70 seconds) suminf. 1.09024 (5) obj. 3832.71 iterations 15
Cbc0038I Pass 16: (4.40 seconds) suminf. 17.17728 (68) obj. 309925 iterations 172 Cbc0038I Pass 8: (11.71 seconds) suminf. 0.00000 (0) obj. 3832.71 iterations 166
Cbc0038I Pass 17: (4.41 seconds) suminf. 15.30830 (62) obj. 309922 iterations 83 Cbc0038I Solution found of 3832.71
Cbc0038I Pass 18: (4.42 seconds) suminf. 19.16642 (70) obj. 309215 iterations 152 Cbc0038I Relaxing continuous gives 3698.04
Cbc0038I Pass 19: (4.42 seconds) suminf. 17.03452 (65) obj. 309214 iterations 68 Cbc0038I Cleaned solution of 3698.04
Cbc0038I Pass 20: (4.43 seconds) suminf. 15.92705 (65) obj. 309214 iterations 29 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 Pass 21: (4.43 seconds) suminf. 14.93939 (66) obj. 309217 iterations 15 Cbc0038I Full problem 3086 rows 3046 columns, reduced to 89 rows 86 columns
Cbc0038I Pass 22: (4.44 seconds) suminf. 17.10473 (66) obj. 309204 iterations 185 Cbc0038I Mini branch and bound did not improve solution (11.78 seconds)
Cbc0038I Pass 23: (4.45 seconds) suminf. 16.32949 (63) obj. 309208 iterations 28 Cbc0038I Freeing continuous variables gives a solution of 3698.04
Cbc0038I Pass 24: (4.46 seconds) suminf. 14.92720 (62) obj. 309202 iterations 70 Cbc0038I Round again with cutoff of 3470.43
Cbc0038I Pass 25: (4.46 seconds) suminf. 14.92720 (62) obj. 309202 iterations 12 Cbc0038I Pass 9: (11.83 seconds) suminf. 5.71444 (21) obj. 3470.43 iterations 178
Cbc0038I Pass 26: (4.47 seconds) suminf. 16.38608 (65) obj. 309206 iterations 77 Cbc0038I Pass 10: (11.84 seconds) suminf. 3.39913 (21) obj. 3470.43 iterations 246
Cbc0038I Pass 27: (4.47 seconds) suminf. 15.38263 (62) obj. 309211 iterations 26 Cbc0038I Pass 11: (11.85 seconds) suminf. 3.15309 (17) obj. 3470.43 iterations 120
Cbc0038I Pass 28: (4.48 seconds) suminf. 15.54781 (63) obj. 309199 iterations 61 Cbc0038I Pass 12: (11.88 seconds) suminf. 5.18611 (29) obj. 3470.43 iterations 504
Cbc0038I Pass 29: (4.51 seconds) suminf. 42.72391 (154) obj. 344500 iterations 566 Cbc0038I Pass 13: (11.88 seconds) suminf. 5.34128 (30) obj. 3470.43 iterations 94
Cbc0038I Pass 30: (4.52 seconds) suminf. 25.91427 (90) obj. 331553 iterations 359 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 No solution found this major pass
Cbc0038I Before mini branch and bound, 2368 integers at bound fixed and 42 continuous 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 3557 rows 3002 columns, reduced to 819 rows 561 columns Cbc0038I Full problem 3086 rows 3046 columns, reduced to 204 rows 208 columns
Cbc0038I Mini branch and bound did not improve solution (5.26 seconds) Cbc0038I Mini branch and bound did not improve solution (12.27 seconds)
Cbc0038I After 5.26 seconds - Feasibility pump exiting - took 1.06 seconds Cbc0038I After 12.27 seconds - Feasibility pump exiting with objective of 3698.04 - took 0.73 seconds
Cbc0031I 66 added rows had average density of 160.28788 Cbc0012I Integer solution of 3698.0376 found by feasibility pump after 0 iterations and 0 nodes (12.27 seconds)
Cbc0013I At root node, 66 cuts changed objective from 307976.81 to 308016.81 in 10 passes Cbc0011I Exiting as integer gap of 1138.0376 less than 2000 or 0%%
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 Cbc0001I Search completed - best objective 3698.037618571474, took 0 iterations and 0 nodes (12.28 seconds)
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 Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost
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 Cuts at root node changed objective from 2560 to 2560
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 Probing was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
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 Gomory was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
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 Knapsack was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
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 Clique was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 308016.81 (7.77 seconds) MixedIntegerRounding2 was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Cbc0012I Integer solution of 308036.81 found by DiveCoefficient after 2997 iterations and 2 nodes (8.23 seconds) FlowCover was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Cbc0038I Full problem 3557 rows 3002 columns, reduced to 89 rows 63 columns TwoMirCuts was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
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)
Result - Optimal solution found (within gap tolerance) Result - Optimal solution found (within gap tolerance)
Objective value: 308016.81415441 Objective value: 3698.03761857
Lower bound: 308016.814 Lower bound: 2560.000
Gap: 0.00 Gap: 0.44
Enumerated nodes: 3 Enumerated nodes: 0
Total iterations: 3022 Total iterations: 0
Time (CPU seconds): 9.17 Time (CPU seconds): 12.57
Time (Wallclock seconds): 9.37 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
@@ -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
+107 -145
View File
@@ -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 Welcome to the CBC MILP Solver
Version: 2.9.9 Version: 2.9.9
Build Date: Aug 7 2019 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) 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 3200 seconds was changed from 1e+100 to 10200
allowableGap was changed from 1e-10 to 2200 allowableGap was changed from 1e-10 to 2000
Option for printingOptions changed from normal to all 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 Statistics for presolved model
Original problem has 86684 integers (86528 of which binary) Original problem has 76280 integers (76128 of which binary)
Presolved problem has 13520 integers (13520 of which binary) Presolved problem has 10234 integers (10234 of which binary)
==== 10894 zero objective 3 different ==== 9193 zero objective 2 different
10894 variables have objective of 0 9193 variables have objective of 0
1352 variables have objective of 100 1233 variables have objective of 1
1364 variables have objective of 1000 ==== absolute objective values 2 different
==== absolute objective values 3 different 9193 variables have objective of 0
10894 variables have objective of 0 1233 variables have objective of 1
1352 variables have objective of 100 ==== for integers 9097 zero objective 2 different
1364 variables have objective of 1000 9097 variables have objective of 0
==== for integers 10894 zero objective 3 different 1137 variables have objective of 1
10894 variables have objective of 0 ==== for integers absolute objective values 2 different
1352 variables have objective of 100 9097 variables have objective of 0
1274 variables have objective of 1000 1137 variables have objective of 1
==== 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
===== end objective counts ===== end objective counts
Problem has 9073 rows, 13610 columns (2716 with objective) and 64596 elements Problem has 7772 rows, 10426 columns (1233 with objective) and 53720 elements
There are 1442 singletons with objective There are 1233 singletons with objective
Column breakdown: 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 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: Row breakdown:
0 of type E 0.0, 676 of type E 1.0, 0 of type E -1.0, 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, 148 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, 43 of type G other, 3411 of type L 0.0, 1089 of type L 1.0,
1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 2405 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other,
0 of type Free 0 of type Free
Continuous objective value is 5579.29 - 0.25 seconds Continuous objective value is 512.5 - 0.24 seconds
Cgl0002I 66248 variables fixed Cgl0002I 61928 variables fixed
Cgl0003I 52 fixed, 0 tightened bounds, 4004 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 2270 strengthened rows, 4 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 196 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1533 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1527 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1527 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1524 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1522 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1520 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1520 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 320 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1410 strengthened rows, 0 substitutions Cgl0004I processed model has 7725 rows, 10424 columns (10232 integer (10232 of which binary)) and 53732 elements
Cgl0004I processed model has 8929 rows, 13558 columns (13468 integer (13468 of which binary)) and 72963 elements Cbc0038I Initial state - 529 integers unsatisfied sum - 224.918
Cbc0038I Initial state - 757 integers unsatisfied sum - 322.142 Cbc0038I Pass 1: (1.64 seconds) suminf. 189.00000 (378) obj. 628.389 iterations 1696
Cbc0038I Pass 1: (2.10 seconds) suminf. 231.92695 (505) obj. 30728.2 iterations 1751 Cbc0038I Pass 2: (1.65 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 82
Cbc0038I Pass 2: (2.12 seconds) suminf. 206.58889 (444) obj. 31931.6 iterations 194 Cbc0038I Pass 3: (1.66 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 39
Cbc0038I Pass 3: (2.14 seconds) suminf. 196.54920 (421) obj. 32116 iterations 204 Cbc0038I Pass 4: (1.68 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 32
Cbc0038I Pass 4: (2.16 seconds) suminf. 196.54920 (421) obj. 32116 iterations 37 Cbc0038I Pass 5: (1.69 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 38
Cbc0038I Pass 5: (2.18 seconds) suminf. 195.04920 (418) obj. 32166 iterations 17 Cbc0038I Pass 6: (1.71 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 31
Cbc0038I Pass 6: (2.20 seconds) suminf. 195.04920 (418) obj. 32166 iterations 24 Cbc0038I Pass 7: (1.73 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 34
Cbc0038I Pass 7: (2.22 seconds) suminf. 195.04920 (418) obj. 32166 iterations 18 Cbc0038I Pass 8: (1.74 seconds) suminf. 186.00000 (372) obj. 628.389 iterations 39
Cbc0038I Pass 8: (2.25 seconds) suminf. 72.58889 (171) obj. 37485.9 iterations 561 Cbc0038I Pass 9: (1.76 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 36
Cbc0038I Pass 9: (2.27 seconds) suminf. 70.08889 (166) obj. 37485.9 iterations 32 Cbc0038I Pass 10: (1.77 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 36
Cbc0038I Pass 10: (2.29 seconds) suminf. 69.08889 (164) obj. 37485.9 iterations 6 Cbc0038I Pass 11: (1.79 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 40
Cbc0038I Pass 11: (2.31 seconds) suminf. 69.08889 (164) obj. 37485.9 iterations 4 Cbc0038I Pass 12: (1.80 seconds) suminf. 185.50000 (371) obj. 628.889 iterations 40
Cbc0038I Pass 12: (2.35 seconds) suminf. 32.58141 (84) obj. 60503.3 iterations 914 Cbc0038I Pass 13: (1.82 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 449
Cbc0038I Pass 13: (2.39 seconds) suminf. 27.88537 (75) obj. 61927.9 iterations 484 Cbc0038I Pass 14: (1.84 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 77
Cbc0038I Pass 14: (2.41 seconds) suminf. 27.50124 (75) obj. 62180.1 iterations 58 Cbc0038I Pass 15: (1.85 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 48
Cbc0038I Pass 15: (2.43 seconds) suminf. 27.00124 (74) obj. 62180.1 iterations 1 Cbc0038I Pass 16: (1.87 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 51
Cbc0038I Pass 16: (2.45 seconds) suminf. 16.00124 (52) obj. 62980.1 iterations 32 Cbc0038I Pass 17: (1.89 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 48
Cbc0038I Pass 17: (2.47 seconds) suminf. 7.10271 (34) obj. 62816.5 iterations 296 Cbc0038I Pass 18: (1.90 seconds) suminf. 94.50000 (189) obj. 696.889 iterations 33
Cbc0038I Pass 18: (2.49 seconds) suminf. 6.79422 (33) obj. 62168.7 iterations 55 Cbc0038I Pass 19: (1.93 seconds) suminf. 71.00000 (142) obj. 773.037 iterations 532
Cbc0038I Pass 19: (2.53 seconds) suminf. 3.14487 (17) obj. 64662.8 iterations 509 Cbc0038I Pass 20: (1.95 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 252
Cbc0038I Pass 20: (2.55 seconds) suminf. 3.14487 (17) obj. 64662.8 iterations 192 Cbc0038I Pass 21: (1.96 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 31
Cbc0038I Pass 21: (2.59 seconds) suminf. 1.23209 (8) obj. 65540 iterations 475 Cbc0038I Pass 22: (1.98 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 39
Cbc0038I Pass 22: (2.61 seconds) suminf. 1.23209 (8) obj. 65540 iterations 82 Cbc0038I Pass 23: (1.99 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 47
Cbc0038I Pass 23: (2.63 seconds) suminf. 0.79917 (6) obj. 66277.4 iterations 327 Cbc0038I Pass 24: (2.01 seconds) suminf. 69.50000 (139) obj. 773.537 iterations 44
Cbc0038I Pass 24: (2.66 seconds) suminf. 1.01893 (6) obj. 65540 iterations 189 Cbc0038I Pass 25: (2.02 seconds) suminf. 69.00000 (138) obj. 774.037 iterations 34
Cbc0038I Pass 25: (2.69 seconds) suminf. 14.01747 (45) obj. 83423 iterations 774 Cbc0038I Pass 26: (2.04 seconds) suminf. 69.00000 (138) obj. 774.037 iterations 24
Cbc0038I Pass 26: (2.73 seconds) suminf. 10.55675 (34) obj. 83054.5 iterations 517 Cbc0038I Pass 27: (2.06 seconds) suminf. 61.50000 (123) obj. 809.99 iterations 474
Cbc0038I Pass 27: (2.75 seconds) suminf. 9.55675 (32) obj. 83054.5 iterations 5 Cbc0038I Pass 28: (2.08 seconds) suminf. 60.00000 (120) obj. 810.99 iterations 241
Cbc0038I Pass 28: (2.77 seconds) suminf. 9.55675 (32) obj. 83054.5 iterations 6 Cbc0038I Pass 29: (2.10 seconds) suminf. 59.50000 (119) obj. 810.99 iterations 42
Cbc0038I Pass 29: (2.79 seconds) suminf. 2.31454 (11) obj. 81144.3 iterations 317 Cbc0038I Pass 30: (2.11 seconds) suminf. 59.00000 (118) obj. 811.49 iterations 33
Cbc0038I Pass 30: (2.81 seconds) suminf. 2.27485 (10) obj. 81546.8 iterations 84
Cbc0038I No solution found this major pass Cbc0038I No solution found this major pass
Cbc0038I Before mini branch and bound, 12405 integers at bound fixed and 20 continuous Cbc0038I Before mini branch and bound, 9441 integers at bound fixed and 63 continuous
Cbc0038I Full problem 8929 rows 13558 columns, reduced to 355 rows 402 columns Cbc0038I Mini branch and bound did not improve solution (2.13 seconds)
Cbc0038I Mini branch and bound improved solution from 1.79769e+308 to 44152.7 (3.07 seconds) Cbc0038I After 2.41 seconds - Feasibility pump exiting - took 0.85 seconds
Cbc0038I Freeing continuous variables gives a solution of 44152.7 Cbc0031I 206 added rows had average density of 105.54854
Cbc0038I Round again with cutoff of 41270.3 Cbc0013I At root node, 206 cuts changed objective from 610 to 620.91644 in 10 passes
Cbc0038I Pass 30: (3.10 seconds) suminf. 231.92695 (505) obj. 30728.2 iterations 0 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
Cbc0038I Pass 31: (3.13 seconds) suminf. 186.69839 (405) obj. 34976.8 iterations 320 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
Cbc0038I Pass 32: (3.15 seconds) suminf. 175.89364 (383) obj. 35626.8 iterations 89 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
Cbc0038I Pass 33: (3.17 seconds) suminf. 174.39364 (380) obj. 35676.8 iterations 10 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
Cbc0038I Pass 34: (3.18 seconds) suminf. 174.39364 (380) obj. 35676.8 iterations 3 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
Cbc0038I Pass 35: (3.20 seconds) suminf. 165.39364 (362) obj. 36526.8 iterations 35 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
Cbc0038I Pass 36: (3.22 seconds) suminf. 152.89364 (337) obj. 37726.8 iterations 41 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
Cbc0038I Pass 37: (3.24 seconds) suminf. 137.89364 (307) obj. 39126.8 iterations 44 Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 620.91644 (8.63 seconds)
Cbc0038I Pass 38: (3.27 seconds) suminf. 132.89364 (297) obj. 39626.8 iterations 15 Cbc0012I Integer solution of 631.71534 found by DiveCoefficient after 5804 iterations and 2 nodes (9.26 seconds)
Cbc0038I Pass 39: (3.29 seconds) suminf. 117.39364 (266) obj. 40976.8 iterations 44 Cbc0012I Integer solution of 625.71534 found by DiveCoefficient after 6183 iterations and 2 nodes (9.57 seconds)
Cbc0038I Pass 40: (3.33 seconds) suminf. 106.89364 (251) obj. 41270.3 iterations 184 Cbc0038I Full problem 7725 rows 10424 columns, reduced to 60 rows 66 columns
Cbc0038I Pass 41: (3.36 seconds) suminf. 99.39364 (236) obj. 41270.3 iterations 71 Cbc0012I Integer solution of 623.71534 found by RINS after 6183 iterations and 2 nodes (9.65 seconds)
Cbc0038I Pass 42: (3.40 seconds) suminf. 93.04601 (226) obj. 41270.3 iterations 176 Cbc0011I Exiting as integer gap of 2.7989071 less than 2000 or 0%%
Cbc0038I Pass 43: (3.43 seconds) suminf. 92.89364 (223) obj. 41270.3 iterations 135 Cbc0001I Search completed - best objective 623.7153428828003, took 6473 iterations and 3 nodes (10.15 seconds)
Cbc0038I Pass 44: (3.46 seconds) suminf. 92.39364 (222) obj. 41270.3 iterations 3 Cbc0032I Strong branching done 46 times (993 iterations), fathomed 0 nodes and fixed 0 variables
Cbc0038I Pass 45: (3.49 seconds) suminf. 83.89364 (208) obj. 41270.3 iterations 74 Cbc0035I Maximum depth 3, 0 variables fixed on reduced cost
Cbc0038I Pass 46: (3.51 seconds) suminf. 70.89364 (182) obj. 41270.3 iterations 44 Cuts at root node changed objective from 610 to 620.916
Cbc0038I Pass 47: (3.53 seconds) suminf. 63.89364 (168) obj. 41270.3 iterations 26 Probing was tried 16 times and created 2012 cuts of which 0 were active after adding rounds of cuts (2.933 seconds)
Cbc0038I Pass 48: (3.55 seconds) suminf. 63.89364 (168) obj. 41270.3 iterations 4 Gomory was tried 16 times and created 1015 cuts of which 0 were active after adding rounds of cuts (0.573 seconds)
Cbc0038I Pass 49: (3.58 seconds) suminf. 57.89364 (156) obj. 41270.3 iterations 28 Knapsack was tried 16 times and created 889 cuts of which 0 were active after adding rounds of cuts (0.120 seconds)
Cbc0038I Pass 50: (3.60 seconds) suminf. 57.89364 (156) obj. 41270.3 iterations 2 Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.006 seconds)
Cbc0038I Pass 51: (3.62 seconds) suminf. 45.39364 (131) obj. 41270.3 iterations 33 MixedIntegerRounding2 was tried 16 times and created 772 cuts of which 0 were active after adding rounds of cuts (0.202 seconds)
Cbc0038I Pass 52: (3.64 seconds) suminf. 32.89364 (106) obj. 41270.3 iterations 42 FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.046 seconds)
Cbc0038I Pass 53: (3.66 seconds) suminf. 25.39364 (91) obj. 41270.3 iterations 34 TwoMirCuts was tried 16 times and created 1389 cuts of which 0 were active after adding rounds of cuts (0.575 seconds)
Cbc0038I Pass 54: (3.68 seconds) suminf. 14.89364 (70) obj. 41270.3 iterations 35 ImplicationCuts was tried 6 times and created 637 cuts of which 0 were active after adding rounds of cuts (0.008 seconds)
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)
Result - Optimal solution found (within gap tolerance) Result - Optimal solution found (within gap tolerance)
Objective value: 29020.95202118 Objective value: 623.71534288
Lower bound: 27320.952 Lower bound: 620.916
Gap: 0.06 Gap: 0.00
Enumerated nodes: 0 Enumerated nodes: 3
Total iterations: 8819 Total iterations: 6473
Time (CPU seconds): 11.49 Time (CPU seconds): 10.46
Time (Wallclock seconds): 11.67 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
+132 -127
View File
@@ -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 Welcome to the CBC MILP Solver
Version: 2.9.9 Version: 2.9.9
Build Date: Aug 7 2019 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) 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 3200 seconds was changed from 1e+100 to 10200
allowableGap was changed from 1e-10 to 2200 allowableGap was changed from 1e-10 to 2000
Option for printingOptions changed from normal to all 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 Statistics for presolved model
Original problem has 71240 integers (70304 of which binary) Original problem has 62084 integers (61152 of which binary)
Presolved problem has 19144 integers (18928 of which binary) Presolved problem has 15195 integers (14771 of which binary)
==== 15946 zero objective 4 different ==== 13834 zero objective 4 different
15946 variables have objective of 0 13834 variables have objective of 0
208 variables have objective of 20 1233 variables have objective of 1
1352 variables have objective of 100 48 variables have objective of 10
1728 variables have objective of 1000 416 variables have objective of 20
==== absolute objective values 4 different ==== absolute objective values 4 different
15946 variables have objective of 0 13834 variables have objective of 0
208 variables have objective of 20 1233 variables have objective of 1
1352 variables have objective of 100 48 variables have objective of 10
1728 variables have objective of 1000 416 variables have objective of 20
==== for integers 15946 zero objective 4 different ==== for integers 13642 zero objective 3 different
15946 variables have objective of 0 13642 variables have objective of 0
208 variables have objective of 20 1137 variables have objective of 1
1352 variables have objective of 100 416 variables have objective of 20
1638 variables have objective of 1000 ==== for integers absolute objective values 3 different
==== for integers absolute objective values 4 different 13642 variables have objective of 0
15946 variables have objective of 0 1137 variables have objective of 1
208 variables have objective of 20 416 variables have objective of 20
1352 variables have objective of 100
1638 variables have objective of 1000
===== end objective counts ===== end objective counts
Problem has 37323 rows, 19234 columns (3288 with objective) and 162892 elements Problem has 28199 rows, 15531 columns (1697 with objective) and 126932 elements
There are 1650 singletons with objective There are 1649 singletons with objective
Column breakdown: 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 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: Row breakdown:
2712 of type E 0.0, 156 of type E 1.0, 0 of type E -1.0, 2281 of type E 0.0, 156 of type E 1.0, 208 of type E -1.0,
279 of type E other, 0 of type G 0.0, 0 of type G 1.0, 378 of type E other, 0 of type G 0.0, 52 of type G 1.0,
376 of type G other, 5408 of type L 0.0, 24180 of type L 1.0, 10 of type G other, 3411 of type L 0.0, 20252 of type L 1.0,
1508 of type L other, 0 of type Range 0.0->1.0, 2704 of type Range other, 1451 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other,
0 of type Free 0 of type Free
Continuous objective value is 243935 - 12.03 seconds Continuous objective value is 2592.5 - 11.74 seconds
Cgl0002I 44616 variables fixed Cgl0002I 42189 variables fixed
Cgl0003I 0 fixed, 208 tightened bounds, 22826 strengthened rows, 47235 substitutions Cgl0003I 0 fixed, 416 tightened bounds, 21262 strengthened rows, 39927 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 3826 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 7087 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 2221 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 3304 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1079 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 1761 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 490 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 428 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 255 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 88 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 229 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 26 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 214 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 12 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 197 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions
Cgl0004I processed model has 16387 rows, 9762 columns (9672 integer (9464 of which binary)) and 80599 elements Cgl0004I processed model has 11087 rows, 7586 columns (7250 integer (6834 of which binary)) and 64778 elements
Cbc0038I Initial state - 1275 integers unsatisfied sum - 411.736 Cbc0038I Initial state - 1148 integers unsatisfied sum - 308.884
Cbc0038I Pass 1: (22.09 seconds) suminf. 275.36033 (699) obj. 275508 iterations 6394 Cbc0038I Pass 1: (21.79 seconds) suminf. 132.59090 (279) obj. 5166.99 iterations 4283
Cbc0038I Pass 2: (22.31 seconds) suminf. 251.50450 (630) obj. 278893 iterations 1211 Cbc0038I Pass 2: (21.83 seconds) suminf. 115.67073 (242) obj. 5159.78 iterations 309
Cbc0038I Pass 3: (22.42 seconds) suminf. 237.26278 (596) obj. 280250 iterations 470 Cbc0038I Pass 3: (21.85 seconds) suminf. 113.67073 (238) obj. 5160.78 iterations 31
Cbc0038I Pass 4: (22.50 seconds) suminf. 231.25228 (584) obj. 281559 iterations 306 Cbc0038I Pass 4: (21.87 seconds) suminf. 113.67073 (238) obj. 5160.78 iterations 12
Cbc0038I Pass 5: (22.56 seconds) suminf. 228.30447 (580) obj. 283466 iterations 239 Cbc0038I Pass 5: (21.95 seconds) suminf. 38.72216 (89) obj. 6688.77 iterations 808
Cbc0038I Pass 6: (22.60 seconds) suminf. 224.54385 (568) obj. 283611 iterations 52 Cbc0038I Pass 6: (22.01 seconds) suminf. 36.92756 (85) obj. 6555.73 iterations 474
Cbc0038I Pass 7: (22.64 seconds) suminf. 220.41141 (557) obj. 281841 iterations 75 Cbc0038I Pass 7: (22.03 seconds) suminf. 36.92756 (85) obj. 6555.73 iterations 10
Cbc0038I Pass 8: (22.67 seconds) suminf. 219.91141 (556) obj. 281891 iterations 18 Cbc0038I Pass 8: (22.14 seconds) suminf. 24.16606 (61) obj. 8376.93 iterations 1047
Cbc0038I Pass 9: (22.70 seconds) suminf. 216.62887 (548) obj. 278935 iterations 28 Cbc0038I Pass 9: (22.23 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 674
Cbc0038I Pass 10: (22.74 seconds) suminf. 216.62887 (548) obj. 278935 iterations 11 Cbc0038I Pass 10: (22.25 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 13
Cbc0038I Pass 11: (22.77 seconds) suminf. 216.62887 (548) obj. 278935 iterations 1 Cbc0038I Pass 11: (22.27 seconds) suminf. 16.50851 (48) obj. 8704.88 iterations 3
Cbc0038I Pass 12: (22.96 seconds) suminf. 104.93793 (325) obj. 277541 iterations 1105 Cbc0038I Pass 12: (22.40 seconds) suminf. 26.69535 (68) obj. 9870.32 iterations 955
Cbc0038I Pass 13: (23.22 seconds) suminf. 89.97792 (266) obj. 277060 iterations 1082 Cbc0038I Pass 13: (22.50 seconds) suminf. 19.06151 (47) obj. 9797.91 iterations 677
Cbc0038I Pass 14: (23.40 seconds) suminf. 87.18147 (261) obj. 276745 iterations 761 Cbc0038I Pass 14: (22.53 seconds) suminf. 17.20639 (42) obj. 9806.96 iterations 17
Cbc0038I Pass 15: (23.44 seconds) suminf. 83.46793 (252) obj. 276810 iterations 30 Cbc0038I Pass 15: (22.55 seconds) suminf. 17.20639 (42) obj. 9806.96 iterations 3
Cbc0038I Pass 16: (23.47 seconds) suminf. 82.96793 (251) obj. 276860 iterations 19 Cbc0038I Pass 16: (22.66 seconds) suminf. 20.38749 (54) obj. 10625.8 iterations 839
Cbc0038I Pass 17: (23.54 seconds) suminf. 78.18433 (247) obj. 277277 iterations 204 Cbc0038I Pass 17: (22.75 seconds) suminf. 14.70685 (43) obj. 10596 iterations 647
Cbc0038I Pass 18: (23.58 seconds) suminf. 77.57806 (243) obj. 277327 iterations 100 Cbc0038I Pass 18: (22.78 seconds) suminf. 14.70685 (43) obj. 10596 iterations 10
Cbc0038I Pass 19: (23.62 seconds) suminf. 67.34112 (222) obj. 278330 iterations 84 Cbc0038I Pass 19: (22.80 seconds) suminf. 14.70685 (43) obj. 10596 iterations 4
Cbc0038I Pass 20: (23.68 seconds) suminf. 65.92745 (219) obj. 278478 iterations 148 Cbc0038I Pass 20: (22.89 seconds) suminf. 19.17471 (57) obj. 12932.5 iterations 775
Cbc0038I Pass 21: (23.72 seconds) suminf. 65.98731 (206) obj. 278632 iterations 50 Cbc0038I Pass 21: (22.98 seconds) suminf. 15.37252 (43) obj. 12953.2 iterations 639
Cbc0038I Pass 22: (23.75 seconds) suminf. 65.48731 (205) obj. 278632 iterations 2 Cbc0038I Pass 22: (23.00 seconds) suminf. 15.37252 (43) obj. 12953.2 iterations 4
Cbc0038I Pass 23: (23.79 seconds) suminf. 50.98731 (175) obj. 279728 iterations 96 Cbc0038I Pass 23: (23.10 seconds) suminf. 16.75837 (44) obj. 12897.3 iterations 828
Cbc0038I Pass 24: (23.82 seconds) suminf. 50.98731 (175) obj. 279728 iterations 1 Cbc0038I Pass 24: (23.21 seconds) suminf. 13.15520 (36) obj. 12961 iterations 711
Cbc0038I Pass 25: (23.86 seconds) suminf. 38.98731 (148) obj. 279915 iterations 83 Cbc0038I Pass 25: (23.23 seconds) suminf. 13.15520 (36) obj. 12961 iterations 11
Cbc0038I Pass 26: (24.08 seconds) suminf. 35.45286 (143) obj. 281045 iterations 828 Cbc0038I Pass 26: (23.40 seconds) suminf. 11.82435 (44) obj. 14112.4 iterations 1106
Cbc0038I Pass 27: (24.14 seconds) suminf. 35.45286 (145) obj. 281045 iterations 136 Cbc0038I Pass 27: (23.49 seconds) suminf. 10.72764 (34) obj. 14134.8 iterations 599
Cbc0038I Pass 28: (24.22 seconds) suminf. 33.71076 (144) obj. 281155 iterations 337 Cbc0038I Pass 28: (23.51 seconds) suminf. 10.72764 (34) obj. 14134.8 iterations 11
Cbc0038I Pass 29: (24.26 seconds) suminf. 33.71076 (144) obj. 281155 iterations 47 Cbc0038I Pass 29: (23.64 seconds) suminf. 17.99600 (56) obj. 14340.5 iterations 874
Cbc0038I Pass 30: (24.45 seconds) suminf. 33.05241 (137) obj. 281075 iterations 685 Cbc0038I Pass 30: (23.77 seconds) suminf. 14.85158 (56) obj. 14491.8 iterations 795
Cbc0038I No solution found this major pass Cbc0038I No solution found this major pass
Cbc0038I Before mini branch and bound, 7967 integers at bound fixed and 43 continuous 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 Mini branch and bound did not improve solution (24.48 seconds) Cbc0038I Full problem 11087 rows 7586 columns, reduced to 1871 rows 1255 columns
Cbc0038I After 24.48 seconds - Feasibility pump exiting - took 4.32 seconds Cbc0038I Mini branch and bound did not improve solution (26.95 seconds)
Cbc0031I 631 added rows had average density of 14.393027 Cbc0038I After 26.95 seconds - Feasibility pump exiting - took 6.14 seconds
Cbc0013I At root node, 631 cuts changed objective from 253685.18 to 271905.7 in 10 passes Cbc0031I 447 added rows had average density of 32.127517
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 Cbc0013I At root node, 447 cuts changed objective from 2690 to 3121.695 in 20 passes
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 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 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 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 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 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 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 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 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 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 6 (TwoMirCuts) - 3316 row cuts average 32.5 elements, 0 column cuts (0 active) in 2.821 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
Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 271905.7 (55.94 seconds) 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 100 nodes, 57 on tree, 1e+50 best solution, best possible 271905.7 (157.36 seconds) Cbc0010I After 0 nodes, 1 on tree, 1e+50 best solution, best possible 3121.695 (134.65 seconds)
Cbc0010I After 200 nodes, 109 on tree, 1e+50 best solution, best possible 271905.7 (202.91 seconds) Cbc0010I After 100 nodes, 61 on tree, 1e+50 best solution, best possible 3121.695 (388.01 seconds)
Cbc0010I After 300 nodes, 159 on tree, 1e+50 best solution, best possible 271905.7 (246.36 seconds) Cbc0010I After 200 nodes, 114 on tree, 1e+50 best solution, best possible 3121.695 (548.61 seconds)
Cbc0010I After 400 nodes, 209 on tree, 1e+50 best solution, best possible 271905.7 (282.02 seconds) Cbc0010I After 300 nodes, 167 on tree, 1e+50 best solution, best possible 3121.695 (714.25 seconds)
Cbc0010I After 500 nodes, 261 on tree, 1e+50 best solution, best possible 271905.7 (316.04 seconds) Cbc0010I After 400 nodes, 219 on tree, 1e+50 best solution, best possible 3121.695 (850.98 seconds)
Cbc0010I After 600 nodes, 310 on tree, 1e+50 best solution, best possible 271905.7 (349.89 seconds) Cbc0010I After 500 nodes, 272 on tree, 1e+50 best solution, best possible 3121.695 (956.51 seconds)
Cbc0010I After 700 nodes, 359 on tree, 1e+50 best solution, best possible 271905.7 (379.69 seconds) Cbc0010I After 600 nodes, 321 on tree, 1e+50 best solution, best possible 3121.695 (1064.45 seconds)
Cbc0010I After 800 nodes, 409 on tree, 1e+50 best solution, best possible 271905.7 (411.29 seconds) Cbc0010I After 700 nodes, 370 on tree, 1e+50 best solution, best possible 3121.695 (1210.80 seconds)
Cbc0010I After 900 nodes, 459 on tree, 1e+50 best solution, best possible 271905.7 (445.93 seconds) Cbc0010I After 800 nodes, 420 on tree, 1e+50 best solution, best possible 3121.695 (1331.75 seconds)
Cbc0010I After 1000 nodes, 509 on tree, 1e+50 best solution, best possible 271905.7 (480.64 seconds) Cbc0010I After 900 nodes, 473 on tree, 1e+50 best solution, best possible 3121.695 (1441.13 seconds)
Cbc0010I After 1100 nodes, 608 on tree, 1e+50 best solution, best possible 271905.7 (499.37 seconds) Cbc0010I After 1000 nodes, 523 on tree, 1e+50 best solution, best possible 3121.695 (1535.55 seconds)
Cbc0010I After 1200 nodes, 708 on tree, 1e+50 best solution, best possible 271905.7 (520.89 seconds) Cbc0010I After 1100 nodes, 621 on tree, 1e+50 best solution, best possible 3154.71 (1882.42 seconds)
Cbc0010I After 1300 nodes, 808 on tree, 1e+50 best solution, best possible 271905.7 (537.68 seconds) Cbc0010I After 1200 nodes, 721 on tree, 1e+50 best solution, best possible 3154.71 (2048.07 seconds)
Cbc0010I After 1400 nodes, 908 on tree, 1e+50 best solution, best possible 271905.7 (552.14 seconds) Cbc0010I After 1300 nodes, 821 on tree, 1e+50 best solution, best possible 3154.71 (2190.34 seconds)
Cbc0012I Integer solution of 272705.7 found by rounding after 448734 iterations and 1452 nodes (559.78 seconds) Cbc0010I After 1400 nodes, 921 on tree, 1e+50 best solution, best possible 3154.71 (2267.84 seconds)
Cbc0038I Full problem 16387 rows 9762 columns, reduced to 0 rows 0 columns Cbc0010I After 1500 nodes, 1021 on tree, 1e+50 best solution, best possible 3154.71 (2330.02 seconds)
Cbc0011I Exiting as integer gap of 800 less than 2200 or 0%% Cbc0010I After 1600 nodes, 1121 on tree, 1e+50 best solution, best possible 3154.71 (2362.29 seconds)
Cbc0001I Search completed - best objective 272705.7047293056, took 448997 iterations and 1453 nodes (561.24 seconds) Cbc0010I After 1700 nodes, 1221 on tree, 1e+50 best solution, best possible 3154.71 (2375.36 seconds)
Cbc0032I Strong branching done 6808 times (449919 iterations), fathomed 0 nodes and fixed 2 variables Cbc0010I After 1800 nodes, 1321 on tree, 1e+50 best solution, best possible 3154.71 (2402.68 seconds)
Cbc0035I Maximum depth 523, 518 variables fixed on reduced cost Cbc0010I After 1900 nodes, 1421 on tree, 1e+50 best solution, best possible 3154.71 (2419.25 seconds)
Cuts at root node changed objective from 253685 to 271906 Cbc0010I After 2000 nodes, 1521 on tree, 1e+50 best solution, best possible 3154.71 (2425.78 seconds)
Probing was tried 449 times and created 36967 cuts of which 245 were active after adding rounds of cuts (4.132 seconds) Cbc0004I Integer solution of 3299.5061 found after 1845451 iterations and 2030 nodes (2428.00 seconds)
Gomory was tried 449 times and created 14449 cuts of which 0 were active after adding rounds of cuts (17.213 seconds) Cbc0038I Full problem 11087 rows 7586 columns, reduced to 2259 rows 1474 columns
Knapsack was tried 449 times and created 26037 cuts of which 0 were active after adding rounds of cuts (5.361 seconds) Cbc0011I Exiting as integer gap of 144.79613 less than 2000 or 0%%
Clique was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.071 seconds) Cbc0001I Search completed - best objective 3299.506146440773, took 1848260 iterations and 2031 nodes (2446.82 seconds)
MixedIntegerRounding2 was tried 449 times and created 15587 cuts of which 0 were active after adding rounds of cuts (5.479 seconds) Cbc0032I Strong branching done 21594 times (1847065 iterations), fathomed 0 nodes and fixed 0 variables
FlowCover was tried 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.022 seconds) Cbc0035I Maximum depth 1028, 0 variables fixed on reduced cost
TwoMirCuts was tried 449 times and created 21730 cuts of which 0 were active after adding rounds of cuts (6.315 seconds) Cuts at root node changed objective from 2690 to 3121.7
ImplicationCuts was tried 19 times and created 3254 cuts of which 0 were active after adding rounds of cuts (0.035 seconds) 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) Result - Optimal solution found (within gap tolerance)
Objective value: 272705.70472931 Objective value: 3299.50614644
Lower bound: 271905.705 Lower bound: 3154.710
Gap: 0.00 Gap: 0.05
Enumerated nodes: 1453 Enumerated nodes: 2031
Total iterations: 448997 Total iterations: 1848260
Time (CPU seconds): 562.33 Time (CPU seconds): 2447.82
Time (Wallclock seconds): 563.34 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
+75 -103
View File
@@ -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 Welcome to the CBC MILP Solver
Version: 2.9.9 Version: 2.9.9
Build Date: Aug 7 2019 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) 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 3200 seconds was changed from 1e+100 to 10200
allowableGap was changed from 1e-10 to 2200 allowableGap was changed from 1e-10 to 2000
Option for printingOptions changed from normal to all 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 Statistics for presolved model
Original problem has 65728 integers (64896 of which binary) Original problem has 56988 integers (56160 of which binary)
Presolved problem has 21848 integers (21632 of which binary) Presolved problem has 17472 integers (17048 of which binary)
==== 19456 zero objective 3 different ==== 17248 zero objective 4 different
19456 variables have objective of 0 17248 variables have objective of 0
208 variables have objective of 20 96 variables have objective of 1
2274 variables have objective of 1000 48 variables have objective of 10
==== absolute objective values 3 different 416 variables have objective of 20
19456 variables have objective of 0 ==== absolute objective values 4 different
208 variables have objective of 20 17248 variables have objective of 0
2274 variables have objective of 1000 96 variables have objective of 1
==== for integers 19456 zero objective 3 different 48 variables have objective of 10
19456 variables have objective of 0 416 variables have objective of 20
208 variables have objective of 20 ==== for integers 17056 zero objective 2 different
2184 variables have objective of 1000 17056 variables have objective of 0
==== for integers absolute objective values 3 different 416 variables have objective of 20
19456 variables have objective of 0 ==== for integers absolute objective values 2 different
208 variables have objective of 20 17056 variables have objective of 0
2184 variables have objective of 1000 416 variables have objective of 20
===== end objective counts ===== end objective counts
Problem has 51155 rows, 21938 columns (2482 with objective) and 202022 elements Problem has 42174 rows, 17808 columns (560 with objective) and 170470 elements
There are 298 singletons with objective There are 512 singletons with objective
Column breakdown: 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 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: Row breakdown:
2712 of type E 0.0, 520 of type E 1.0, 0 of type E -1.0, 2281 of type E 0.0, 520 of type E 1.0, 208 of type E -1.0,
227 of type E other, 0 of type G 0.0, 0 of type G 1.0, 326 of type E other, 0 of type G 0.0, 52 of type G 1.0,
376 of type G other, 4056 of type L 0.0, 41756 of type L 1.0, 33 of type G other, 2270 of type L 0.0, 35028 of type L 1.0,
1508 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other, 1456 of type L other, 0 of type Range 0.0->1.0, 0 of type Range other,
0 of type Free 0 of type Free
Continuous objective value is 239817 - 9.92 seconds Continuous objective value is 2560 - 24.20 seconds
Cgl0002I 40560 variables fixed Cgl0002I 38773 variables fixed
Cgl0003I 0 fixed, 208 tightened bounds, 31984 strengthened rows, 69557 substitutions Cgl0003I 0 fixed, 416 tightened bounds, 26485 strengthened rows, 49102 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 4437 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 3627 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 2091 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 1395 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 1067 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 599 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 143 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 11 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 135 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 5 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 126 strengthened rows, 0 substitutions Cgl0003I 0 fixed, 0 tightened bounds, 3 strengthened rows, 0 substitutions
Cgl0003I 0 fixed, 0 tightened bounds, 120 strengthened rows, 0 substitutions Cgl0004I processed model has 9381 rows, 8734 columns (8398 integer (7982 of which binary)) and 64789 elements
Cgl0003I 0 fixed, 0 tightened bounds, 113 strengthened rows, 0 substitutions Cbc0038I Initial state - 321 integers unsatisfied sum - 91.7677
Cgl0004I processed model has 10896 rows, 9762 columns (9672 integer (9464 of which binary)) and 72490 elements Cbc0038I Pass 1: (28.38 seconds) suminf. 2.86955 (8) obj. 4945.48 iterations 1696
Cbc0038I Initial state - 346 integers unsatisfied sum - 76.2913 Cbc0038I Pass 2: (28.40 seconds) suminf. 3.40577 (10) obj. 5000.2 iterations 23
Cbc0038I Pass 1: (15.76 seconds) suminf. 33.26604 (123) obj. 249238 iterations 1545 Cbc0038I Pass 3: (28.41 seconds) suminf. 2.34720 (10) obj. 5037.45 iterations 132
Cbc0038I Pass 2: (15.78 seconds) suminf. 25.78093 (112) obj. 251318 iterations 269 Cbc0038I Pass 4: (28.43 seconds) suminf. 0.68053 (6) obj. 5205.81 iterations 14
Cbc0038I Pass 3: (15.80 seconds) suminf. 25.79137 (111) obj. 251456 iterations 69 Cbc0038I Pass 5: (28.43 seconds) suminf. 0.68053 (6) obj. 5205.81 iterations 0
Cbc0038I Pass 4: (15.82 seconds) suminf. 21.19438 (98) obj. 249900 iterations 423 Cbc0038I Pass 6: (28.45 seconds) suminf. 0.66667 (2) obj. 4934.07 iterations 151
Cbc0038I Pass 5: (15.84 seconds) suminf. 21.83309 (100) obj. 250336 iterations 56 Cbc0038I Solution found of 4934.07
Cbc0038I Pass 6: (15.86 seconds) suminf. 20.71492 (94) obj. 249739 iterations 149 Cbc0038I Branch and bound needed to clear up 2 general integers
Cbc0038I Pass 7: (15.88 seconds) suminf. 20.09167 (98) obj. 252364 iterations 33 Cbc0038I Full problem 9381 rows 8734 columns, reduced to 58 rows 112 columns
Cbc0038I Pass 8: (15.91 seconds) suminf. 19.76241 (84) obj. 250731 iterations 323 Cbc0038I Mini branch and bound could not fix general integers
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
Cbc0038I No solution found this major pass Cbc0038I No solution found this major pass
Cbc0038I Before mini branch and bound, 9127 integers at bound fixed and 42 continuous 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 10896 rows 9762 columns, reduced to 514 rows 451 columns Cbc0038I Full problem 9381 rows 8734 columns, reduced to 135 rows 145 columns
Cbc0038I Mini branch and bound did not improve solution (16.47 seconds) Cbc0038I Mini branch and bound did not improve solution (29.22 seconds)
Cbc0038I After 16.47 seconds - Feasibility pump exiting - took 0.94 seconds Cbc0038I After 29.22 seconds - Feasibility pump exiting - took 1.01 seconds
Cbc0012I Integer solution of 258618.43 found by DiveCoefficient after 3400 iterations and 0 nodes (23.00 seconds) Cbc0012I Integer solution of 4162.5731 found by DiveCoefficient after 0 iterations and 0 nodes (29.38 seconds)
Cbc0031I 95 added rows had average density of 558.45263 Cbc0011I Exiting as integer gap of 1602.5731 less than 2000 or 0%%
Cbc0013I At root node, 95 cuts changed objective from 239816.84 to 258618.43 in 10 passes Cbc0001I Search completed - best objective 4162.57311524356, took 0 iterations and 0 nodes (29.39 seconds)
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)
Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost
Cuts at root node changed objective from 239817 to 258618 Cuts at root node changed objective from 2560 to 2560
Probing was tried 10 times and created 181 cuts of which 0 were active after adding rounds of cuts (2.128 seconds) 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 10 times and created 301 cuts of which 0 were active after adding rounds of cuts (1.454 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 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.057 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 10 times and created 1 cuts of which 0 were active after adding rounds of cuts (0.017 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 10 times and created 122 cuts of which 0 were active after adding rounds of cuts (0.155 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 10 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.024 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 10 times and created 171 cuts of which 0 were active after adding rounds of cuts (0.580 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 Enumerated nodes: 0
Total iterations: 3400 Total iterations: 0
Time (CPU seconds): 23.58 Time (CPU seconds): 29.88
Time (Wallclock seconds): 23.80 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
+17 -9
View File
@@ -23,8 +23,8 @@ sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth")
Rota = RotaBuilder(datetime.date(2020, 9, 7), Rota = RotaBuilder(datetime.date(2020, 9, 7),
weeks_to_rota=weeks_to_rota, weeks_to_rota=weeks_to_rota,
balance_offset_modifier=1, balance_offset_modifier=4,
max_weekend_frequency=1, max_weekend_frequency=2,
max_night_frequency=2) max_night_frequency=2)
rota_collections = { rota_collections = {
@@ -300,7 +300,7 @@ with open('trainees.csv', newline='') as f:
name, site, grade, fte, nwd, end_date, oop, extra = row name, site, grade, fte, nwd, end_date, oop, extra = row
# Ignore trainees if fte == 0 (what are they doing here anyway) # Ignore trainees if fte == 0 (what are they doing here anyway)
if fte == 0: if fte == "0":
continue continue
nwds = nwd.split(",").title() if nwd else None 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 oop = oop.split("-") if oop else None
#print(nwds, end_date, oop) #print(nwds, end_date, oop)
for rot in rota_collections: 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), Worker(Rota, n, name, site.lower(), int(grade[2]), int(fte),
nwds, end_date, oop)) nwds, end_date, oop))
with open("rotas.html", "w") as f: with open("rotas.html", "w") as f:
f.write("<html><body>") f.write("""<html>
<head>
<link rel="stylesheet" type="text/css" href="timetable.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="s.js" defer></script>
</head>
<body>""")
for rot in rota_collections: for rot in rota_collections:
print("Running rota: ", rot) print("Running rota: ", rot)
@@ -340,8 +348,8 @@ for rot in rota_collections:
Rota.model, Rota.model,
tee=True, tee=True,
options={ options={
"seconds": 3200, "seconds": 10200,
"allow": 2200, "allow": 2000,
}, },
logfile="{}.log".format(rot) logfile="{}.log".format(rot)
) # solve the model with the, options="seconds=60" selected solver ) # 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( week_table = ResultsHolder.get_work_table(
) # list with the required workers ) # 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( worker_timetable_brief = ResultsHolder.get_worker_timetable_brief(
show_prefs=False) show_prefs=False)
@@ -370,7 +378,7 @@ for rot in rota_collections:
f.write("\n") f.write("\n")
f.write("\n\n") f.write("\n\n")
f.write("<pre>{}</pre>".format(worker_timetable_brief)) f.write(ResultsHolder.get_worker_timetable_html(table_name=rot))
f.write("\n\n") f.write("\n\n")
f.write("<pre>{}</pre>".format(worker_shift_summary)) f.write("<pre>{}</pre>".format(worker_shift_summary))
f.write("\n\n\n") f.write("\n\n\n")
+99
View File
@@ -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(`<div class='worker-summary'><span>Total shifts: ${total_shifts}, </span><span>Weekends: ${weekends_worked}, </span><span>Training days lost: ${days_lost}, </span><span class=''>${sc}</span></div>`)
})
$("th.worker").append($("<button>Toggle Summary</button>").click(() => {
$(".rota-day").toggle();
$(".worker-summary").toggle();
}))
+328 -54
View File
@@ -119,6 +119,8 @@ class RotaBuilder(object):
"balance_blocks": True, "balance_blocks": True,
"balance_shifts": True, "balance_shifts": True,
"balance_weekends": True, "balance_weekends": True,
"prevent_monday_after_full_weekends": False,
"prevent_fridays_before_full_weekends": True,
} }
def build_model(self): def build_model(self):
@@ -209,17 +211,19 @@ class RotaBuilder(object):
initialize=0, initialize=0,
) )
self.model.shift_count_t1 = Var( if self.constraint_options["balance_shifts"]:
((worker.id) for worker in self.workers),
domain=NonNegativeReals,
initialize=0,
)
self.model.shift_count_t2 = Var( self.model.shift_count_t1 = Var(
((worker.id) for worker in self.workers), ((worker.id) for worker in self.workers),
domain=NonNegativeReals, domain=NonNegativeReals,
initialize=0, 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"]: if self.constraint_options["balance_nights"]:
# We also try to even out the night shifts seperately # We also try to even out the night shifts seperately
@@ -284,7 +288,7 @@ class RotaBuilder(object):
self.model.works_weekend = Var( self.model.works_weekend = Var(
((worker.id, week) for worker in self.workers ((worker.id, week) for worker in self.workers
for week in self.weeks), for week in self.weeks),
domain=Binary, domain=Binary,
initialize=0, initialize=0,
) )
@@ -295,7 +299,6 @@ class RotaBuilder(object):
initialize=0, initialize=0,
) )
self.model.weekend_shift_count_t1 = Var( self.model.weekend_shift_count_t1 = Var(
((worker.id) for worker in self.workers), ((worker.id) for worker in self.workers),
domain=NonNegativeReals, domain=NonNegativeReals,
@@ -331,10 +334,12 @@ class RotaBuilder(object):
def availability_init(model, wid, week, day): def availability_init(model, wid, week, day):
if (wid, week, day) in self.unavailable_to_work: if (wid, week, day) in self.unavailable_to_work:
# print((wid, week, day)) #print((wid, week, day))
return 0 return 0
return 1 return 1
#print(self.unavailable_to_work)
self.model.available = Param( self.model.available = Param(
((worker.id, week, day) for worker in self.workers ((worker.id, week, day) for worker in self.workers
for week, day in self.get_week_day_combinations()), for week, day in self.get_week_day_combinations()),
@@ -545,9 +550,6 @@ class RotaBuilder(object):
worker.fte_adj) worker.fte_adj)
worker.shift_target_number[shift.name] = target_shifts 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: if shift.hard_constrain_shift:
adjusted_balance_offset = shift.balance_offset adjusted_balance_offset = shift.balance_offset
@@ -590,12 +592,14 @@ class RotaBuilder(object):
# t1-t2 is the target # t1-t2 is the target
# As the objective is to minimise t1+t2 and t1 and t2 are positive reals # 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) # t1+t2 approximates the absolute target (which otherwise requires a quadratic solver)
self.model.constraints.add( if self.constraint_options["balance_shifts"]:
self.model.shift_count_t1[worker.id] - self.model.constraints.add(
self.model.shift_count_t2[worker.id] == sum( self.model.shift_count_t1[worker.id] -
(self.model.shift_count[worker.id, shift.name] - self.model.shift_count_t2[worker.id] == sum(
worker.shift_target_number[shift.name]) * (self.model.shift_count[worker.id, shift.name] -
shift.balance_weighting for shift in self.get_shifts())) worker.shift_target_number[shift.name]) *
shift.balance_weighting
for shift in self.get_shifts()))
#if "night" not in shift.constraints)) #if "night" not in shift.constraints))
if self.constraint_options["balance_nights"]: if self.constraint_options["balance_nights"]:
@@ -603,15 +607,15 @@ class RotaBuilder(object):
worker.shift_target_number[shift.name] worker.shift_target_number[shift.name]
for shift in self.get_shifts_with_constraint("night")) for shift in self.get_shifts_with_constraint("night"))
min_shifts = night_shift_target_number - 20 # min_shifts = night_shift_target_number - 20
max_shifts = night_shift_target_number + 20 # max_shifts = night_shift_target_number + 20
self.model.constraints.add( # self.model.constraints.add(
inequality( # inequality(
min_shifts, # min_shifts,
self.model.night_shift_count[worker.id], # self.model.night_shift_count[worker.id],
max_shifts, # max_shifts,
)) # ))
self.model.constraints.add( self.model.constraints.add(
self.model.night_shift_count_t1[worker.id] - self.model.night_shift_count_t1[worker.id] -
@@ -619,6 +623,7 @@ class RotaBuilder(object):
self.model.night_shift_count[worker.id] - self.model.night_shift_count[worker.id] -
night_shift_target_number) night_shift_target_number)
# This may need to be updated
xU = 6 xU = 6
xL = 1 xL = 1
self.model.constraints.add( self.model.constraints.add(
@@ -644,6 +649,52 @@ class RotaBuilder(object):
# self.model.constraints.add( # self.model.constraints.add(
# self.model.night_shift_count_w[worker.id] >= 0) # 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 # Ensure worker is not allocated shifts on non working days
if worker.nwd: if worker.nwd:
for week, day, shift in self.get_all_shiftclass_combinations(): 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, 0 == self.model.works[worker.id, week, day,
shift.name]) shift.name])
# for week_blocks in self.get_week_block_iterator( if self.constraint_options["balance_blocks"]:
# self.max_night_frequency): for week_blocks in self.get_week_block_iterator(
# if self.get_shifts_with_constraint("night"): self.max_night_frequency):
# # Prevent nights more than once every n weeks if self.get_shifts_with_constraint("night"):
# self.model.constraints.add(1 >= sum( # Prevent nights more than once every n weeks
# self.model.shift_week_worker_assigned[shift.name, week, self.model.constraints.add(1 >= sum(
# worker.id] self.model.shift_week_worker_assigned[shift.name,
# for week in week_blocks week,
# for shift in self.get_shifts_with_constraint("night"))) 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( for week_blocks in self.get_week_block_iterator(
# self.max_weekend_frequency): self.max_weekend_frequency):
# # Prevent weekend shifts more than once every n weeks # Prevent weekend shifts more than once every n weeks
# self.model.constraints.add( self.model.constraints.add(
# 1 >= sum(self.model.works_weekend[worker.id, week] 1 >= sum(self.model.works_weekend[worker.id, week]
# for week in week_blocks)) for week in week_blocks))
for week in self.weeks: 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 # # 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 # # 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] n2week, n2day = weeks_days[n]
n2 = 0 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): if self.get_shift_names_by_day(day):
# Unable to work (hard constraint not preference) # Unable to work (hard constraint not preference)
self.model.constraints.add( self.model.constraints.add(
@@ -793,6 +882,13 @@ class RotaBuilder(object):
shift] shift]
for shift in self.get_shift_names_by_day(n2day) for shift in self.get_shift_names_by_day(n2day)
if shift != constraint_shift.name)) 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( self.model.constraints.add(
1 >= self.model.works[worker.id, week, day, 1 >= self.model.works[worker.id, week, day,
constraint_shift.name] + constraint_shift.name] +
@@ -816,7 +912,7 @@ class RotaBuilder(object):
# c = len(workers) # c = len(workers)
balance_modifier_constant = 500 balance_modifier_constant = 1
if self.constraint_options["balance_shifts"]: if self.constraint_options["balance_shifts"]:
shift_balancing = sum(balance_modifier_constant * shift_balancing = sum(balance_modifier_constant *
@@ -827,7 +923,7 @@ class RotaBuilder(object):
shift_balancing = 0 shift_balancing = 0
if self.constraint_options["balance_nights"]: if self.constraint_options["balance_nights"]:
night_balance_modifier_constant = 1 night_balance_modifier_constant = 10
night_shift_balancing = sum( night_shift_balancing = sum(
night_balance_modifier_constant * night_balance_modifier_constant *
self.model.night_shift_count_w[(worker.id)] self.model.night_shift_count_w[(worker.id)]
@@ -837,6 +933,15 @@ class RotaBuilder(object):
else: else:
night_shift_balancing = 0 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 preference_constant = 10
# Preferences # Preferences
preferences = sum( preferences = sum(
@@ -860,16 +965,16 @@ class RotaBuilder(object):
if self.constraint_options["balance_blocks"]: if self.constraint_options["balance_blocks"]:
blocks_balancing = sum( blocks_balancing = sum(
100 * self.model.blocks_assigned[week, shift] 1 * self.model.blocks_assigned[week, shift]
for week in self.weeks for week in self.weeks
for shift in self.shifts_to_assign_as_blocks()) for shift in self.shifts_to_assign_as_blocks())
else: else:
blocks_balancing = 0 blocks_balancing = 0
return night_shift_balancing #return weekend_shift_balancing + blocks_balancing
#return shift_balancing + preferences + blocks_balancing #return shift_balancing + preferences + blocks_balancing
#return shift_balancing + preferences + nights_site_balancing + 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) # add objective function to the model. rule (pass function) or expr (pass expression directly)
self.model.obj = Objective(rule=obj_rule, sense=minimize) self.model.obj = Objective(rule=obj_rule, sense=minimize)
@@ -1120,6 +1225,20 @@ class RotaBuilder(object):
def get_workers_total_fte(self): def get_workers_total_fte(self):
return self.full_time_equivalent 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): class RotaResults(object):
def __init__(self, rota, results): def __init__(self, rota, results):
@@ -1193,9 +1312,9 @@ class RotaResults(object):
return timetable return timetable
def get_worker_timetable_brief(self, def get_worker_timetable_brief(self,
show_prefs=True, show_prefs=False,
marker_every=19, marker_every=30,
show_unavailable=True): show_unavailable=False):
model = self.rota.model model = self.rota.model
week_string = "{:20}".format("-Week-") + "".join( week_string = "{:20}".format("-Week-") + "".join(
[7 * str("{}".format(w))[-1:] for w in self.rota.weeks]) [7 * str("{}".format(w))[-1:] for w in self.rota.weeks])
@@ -1253,6 +1372,112 @@ class RotaResults(object):
timetable.insert(0, days_string) timetable.insert(0, days_string)
return "\n".join(timetable) return "\n".join(timetable)
def get_worker_timetable_html(self,
include_html_tag=False,
table_name="Test"):
model = self.rota.model
timetable = []
date_row = ["<th class='worker'></th>"]
n = 0
for week, day in self.rota.get_week_day_combinations():
d = self.rota.start_date + datetime.timedelta(n)
date_row.append("<th title='{}'>Week {}: {}</th>".format(
d, week, day))
n = n + 1
timetable.append("<tr class='data-row'>{}</tr>".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 = [
"<td title='Site: {}' class='worker {}' data-nwds='{}' data-site='{}' data-worker='{}' data-fte='{}' data-fte_adj='{}' data-end_date='{}'>{} ({}) [{}]</td>"
.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(
"<td title='{} ({})' class='rota-day {}' data-shift='{}' data-available='{}' data-date='{}' data-week='{}' data-day='{}'>{}</td>"
.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("<tr class='worker-row'>{}</tr>".format(
"".join(w)))
#timetable.append("<tr>{}</tr>".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 = """
<body>
<div class="table-div" id="{}">
<table>{}</table>
</div>
</body>
""".format(table_name, "\n".join(timetable))
if include_html_tag:
html = """<html>
<head>
<link rel="stylesheet" type="text/css" href="timetable.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="s.js" defer></script>
</head>
{}</html>""".format(html)
return html
def get_shift_summary(self): def get_shift_summary(self):
works = self.rota.model.works works = self.rota.model.works
timetable = { timetable = {
@@ -1282,6 +1507,35 @@ class RotaResults(object):
total_shifts, ", ".join(l))) total_shifts, ", ".join(l)))
return "\n".join(t) 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): #def get_no_preference(no_pref):
# """Extract to a list the workers not satisfied with their weekend preference.""" # """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] # return [worker.id for worker in workers if no_pref[worker.id].value == 1]
@@ -1332,4 +1586,24 @@ class RotaResults(object):
1), 1),
"balance: {},".format( "balance: {},".format(
self.rota.model.night_shift_count_w[worker.id].value), self.rota.model.night_shift_count_w[worker.id].value),
) )
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),
)
+27 -17
View File
@@ -17,15 +17,28 @@ import operator
use_neos = False use_neos = False
weeks_to_rota = 26 weeks_to_rota = 12
time_to_run = 1200
allow = 3000
sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth") sites = ("truro", "exeter", "torquay", "barnstaple", "plymouth")
Rota = RotaBuilder(datetime.date(2020, 9, 7), Rota = RotaBuilder(datetime.date(2020, 9, 7),
weeks_to_rota=weeks_to_rota, weeks_to_rota=weeks_to_rota,
balance_offset_modifier=1, balance_offset_modifier=8,
max_weekend_frequency=1, max_weekend_frequency=2,
max_night_frequency=1) 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( Rota.add_shifts(
# SingleShift(("exeter", ), "exeter_twilight", 12.5, days[:5]), # SingleShift(("exeter", ), "exeter_twilight", 12.5, days[:5]),
@@ -107,7 +120,7 @@ Rota.add_shifts(
"night_weekday", "night_weekday",
12.25, 12.25,
days[:4], days[:4],
balance_offset=4, balance_offset=2,
balance_weighting=1, balance_weighting=1,
#hard_constrain_shift=False, #hard_constrain_shift=False,
workers_required=3, workers_required=3,
@@ -119,7 +132,7 @@ Rota.add_shifts(
"night_weekend", "night_weekend",
12.25, 12.25,
days[4:], days[4:],
balance_offset=3, balance_offset=2,
balance_weighting=1, balance_weighting=1,
#hard_constrain_shift=False, #hard_constrain_shift=False,
workers_required=3, workers_required=3,
@@ -208,19 +221,12 @@ else:
Worker(Rota, n, name, site.lower(), int(grade[2]), int(fte), Worker(Rota, n, name, site.lower(), int(grade[2]), int(fte),
nwds, end_date, oop)) 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) print(0)
Rota.build_shifts_and_workers() Rota.build_shifts_and_workers()
Rota.build_model() Rota.build_model()
#print(Rota.get_worker_details())
print(1) print(1)
opt = SolverFactory('cbc') # choose a solver opt = SolverFactory('cbc') # choose a solver
#opt = SolverFactory('ipopt') # choose a solver #opt = SolverFactory('ipopt') # choose a solver
@@ -234,8 +240,8 @@ else:
Rota.model, Rota.model,
tee=True, tee=True,
options={ options={
"seconds": 1200, "seconds": time_to_run,
"allow": 15, "allow": allow,
}, },
logfile="test.log" logfile="test.log"
) # solve the model with the, options="seconds=60" selected solver ) # 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(worker_timetable_brief)
print(Rota.get_workers_total_fte()) 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: # for i in ResultsHolder.rota.model.blocks_worker_shift_count:
# n = ResultsHolder.rota.model.blocks_worker_shift_count[i].value # n = ResultsHolder.rota.model.blocks_worker_shift_count[i].value
+81
View File
@@ -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;
}
+5 -1
View File
@@ -57,6 +57,9 @@ class Worker:
if end_oop_date > Rota.rota_end_date: if end_oop_date > Rota.rota_end_date:
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 oop_length = (end_oop_date - start_oop_date).days
days_to_work = days_to_work - oop_length days_to_work = days_to_work - oop_length
@@ -85,9 +88,10 @@ class Worker:
self.fte_adj = self.fte * self.proportion_rota_to_work self.fte_adj = self.fte * self.proportion_rota_to_work
def __lt__(self, other): def __lt__(self, other):
return (self.site, self.grade, self.name) < ( return (self.site, self.grade, self.fte_adj, self.name) < (
other.site, other.site,
other.grade, other.grade,
other.fte_adj,
other.name, other.name,
) )