My System is as follows:
Optimize the value of O_t based on each value of L_t from 1 to 240 according to the below equations.
O_t = O1+O2+O3+O4
O1= LS1+3×D
O2=3×LS2+4×S
O3=S+3×D
O4= LS4×4+7×D
L_t = LS1+LS2+LS3+LS4+LS5+LS6
L_t = (S+D)/5
Desired outputs: Values of S, D, LS1, LS2, LS3, LS4, LS5, LS6 that result in the highest possible value of O_t for each value of L_t
Constraints:
LS1+LS2+LS3+LS4+LS5+LS6=L_t
O_t=O1+O2+O3+O4
How I am currently attempting to solve the system of equations: Optimized brute force. Generate a list of all possible S, D, and LS1-6 values, calculate O_t, and check against the previous maximum.
My code currently works (I am assuming since has been tested on smaller numbers and works well) but takes multiple days of running to solve for any large numbers. Here is my current code optimized as much as I can.
import numpy as np
import numba as nb
from tqdm import tqdm
@nb.njit
def calculate_O(LS1, LS2, LS3, LS4, LS5, LS6, S, D):
O1 = LS1 + 3 * D
O2 = 3 * LS2 + 4 * S
O3 = S + 3 * D
O4 = LS4 * 4 + 7 * D
return O1 + O2 + O3 + O4
@nb.njit
def find_optimal_value(L_t, possible_S_values, possible_D_values):
max_O = -np.inf
max_LS1 = 0
max_LS2 = 0
max_LS3 = 0
max_LS4 = 0
max_LS5 = 0
max_LS6 = 0
max_S = 0
max_D = 0
LS1_init = 11
LS2_init = 11
LS3_init = 11
LS4_init = 11
LS5_init = 11
LS6_init = 11
S_init = 2
D_init = 0
if L_t < 15:
LS_max = 5
elif L_t < 30:
LS_max = 10
elif L_t < 50:
LS_max = 15
elif L_t < 60:
LS_max = 17
elif L_t < 90:
LS_max = 20
elif L_t < 120:
LS_max = 25
elif L_t < 150:
LS_max = 30
elif L_t < 180:
LS_max = 35
elif L_t < 210:
LS_max = 40
elif L_t < 240:
LS_max = 45
for LS1 in range(L_t + 1):
if LS1 > LS_max:
continue
if LS1 + LS1_init > 50:
continue
for LS2 in range(L_t + 1 - LS1):
if LS2 > LS_max:
continue
if LS2 + LS2_init > 50:
continue
for LS3 in range(L_t + 1 - LS1 - LS2):
if LS3 > LS_max:
continue
if LS3 + LS3_init > 50:
continue
for LS5 in range(L_t + 1 - LS1 - LS2 - LS3):
if LS5 > LS_max:
continue
if LS5 + LS5_init > 50:
continue
for LS6 in range(L_t + 1 - LS1 - LS2 - LS3 - LS5):
if LS6 > LS_max:
continue
if LS6 + LS6_init > 50:
continue
LS4 = L_t - LS1 - LS2 - LS3 - LS5 - LS6
if LS4 > LS_max:
continue
if LS4 + LS4_init > 50:
continue
for S in possible_S_values:
D = 5 * L_t - S
if D < 0:
break
if S > 5 * L_t:
continue
if LS4 >= 0 and S >= 0 and LS1 + LS2 + LS3 + LS4 + LS5 + LS6 == L_t:
O = calculate_O(LS1+LS1_init, LS2+LS2_init, LS3+LS3_init, LS4+LS4_init, LS5+LS5_init, LS6+LS6_init, S+S_init, D+D_init)
if O > max_O:
max_O = O
max_LS1 = LS1
max_LS2 = LS2
max_LS3 = LS3
max_LS4 = LS4
max_LS5 = LS5
max_LS6 = LS6
max_S = S
max_D = D
return (max_LS1+LS1_init, max_LS2+LS2_init, max_LS3+LS3_init, max_LS4+LS4_init, max_LS5+LS5_init, max_LS6+LS6_init, max_S+S_init, max_D+D_init, max_O)
L_t_values = range(1, 100)
optimal_values = {}
for L_t in tqdm(L_t_values):
possible_S_values = np.arange(0, 5 * L_t + 1)
possible_D_values = np.arange(0, 5 * L_t + 1)
max_LS1, max_LS2, max_LS3, max_LS4, max_LS5, max_LS6, max_S, max_D, max_O = find_optimal_value(L_t, possible_S_values, possible_D_values)
optimal_values[L_t] = {'LS1': max_LS1, 'LS2': max_LS2, 'LS3': max_LS3, 'LS4': max_LS4, 'LS5': max_LS5,'LS6': max_LS6, 'S': max_S, 'D': max_D, 'O_t': max_O}
print('{:<5s}{:<10s}{:<10s}{:<10s}{:<10s}{:<10s}{:<10s}{:<10s}{:<10s}{:<10s}'.format('L_t', 'LS1', 'LS2', 'LS3', 'LS4', 'LS5', 'LS6', 'S', 'D', 'O_t'))
for L_t in L_t_values:
values = optimal_values[L_t]
print('{:<5d}{:<10d}{:<10d}{:<10d}{:<10d}{:<10d}{:<10d}{:<10d}{:<10d}{:<10.2f}'.format(L_t, values['LS1'], values['LS2'], values['LS3'], values['LS4'], values['LS5'], values['LS6'], values['S'], values['D'], values['O_t']))
Note: this isn't for a class so any module for optimization is on the table as well as any other language - as long as it accurately completes the task in a reasonable timeframe.
Do not brute-force this problem. This is a classic (and somewhat easy) linear programming problem.
Your written constraints fail to mention that L, S and D have a lower bound of 0, and S and D have an upper bound of 5Lt. If these constraints are not enforced then the problem is unbounded.
You have not specified the upper bound of LS when L_t == 240. I assume that it continues the trend and is 50.
The following executes in 0.08 s. It should not take "multiple days" nor should it take multiple minutes.
import pandas as pd
import pulp
'''
O_t = O1+O2+O3+O4
O1= LS1+3×D
O2=3×LS2+4×S
O3=S+3×D
O4= LS4×4+7×D
L_t = LS1+LS2+LS3+LS4+LS5+LS6
L_t = (S+D)/5
Variable to be maximized is O_t
LS1, LS2, LS3, LS4, LS5, LS6, S, and D must all be whole numbers.
LS1+LS2+LS3+LS4+LS5+LS6=L_t
O_t=O1+O2+O3+O4
output prints optimal values of LS1, LS2, LS3, LS4, LS5, LS6, S, and D for each value of L_t
L_t<15 then LS1,2,3,4,5,6 cannot exceed 5
L_t<30 then LS1,2,3,4,5,6 cannot exceed 10
L_t<50 then LS1,2,3,4,5,6 cannot exceed 15
L_t<60 then LS1,2,3,4,5,6 cannot exceed 17
L_t<90 then LS1,2,3,4,5,6 cannot exceed 20
L_t<120 then LS1,2,3,4,5,6 cannot exceed 25
L_t<150 then LS1,2,3,4,5,6 cannot exceed 30
L_t<180 then LS1,2,3,4,5,6 cannot exceed 35
L_t<210 then LS1,2,3,4,5,6 cannot exceed 40
L_t<240 then LS1,2,3,4,5,6 cannot exceed 45
'''
pd.set_option('display.max_columns', None)
df = pd.DataFrame(index=pd.RangeIndex(start=1, stop=241, name='L_t'))
maxima = pd.Series(
name='L_smax',
index=pd.Index(name='L_t', data=(
15, 30, 50, 60, 90, 120, 150, 180, 210, 240, 270)),
data=(5, 10, 15, 17, 20, 25, 30, 35, 40, 45, 50))
df['L_smax'] = pd.merge_asof(
left=df, right=maxima,
left_index=True, right_index=True,
direction='forward', allow_exact_matches=False)
def make_L(row: pd.Series) -> pd.Series:
L_t = row.name
suffix = f'({L_t:03d})'
LS1, LS2, LS3, LS4, LS5, LS6 = LS = [
pulp.LpVariable(name=f'LS{i}{suffix}', cat=pulp.LpInteger, lowBound=0, upBound=row.L_smax)
for i in range(1, 7)]
S = pulp.LpVariable(name='S' + suffix, cat=pulp.LpInteger, lowBound=0, upBound=5*L_t)
D = pulp.LpVariable(name='D' + suffix, cat=pulp.LpInteger, lowBound=0, upBound=5*L_t)
O1 = LS1 + 3*D
O2 = 3*LS2 + 4*S
O3 = S + 3*D
O4 = 4*LS4 + 7*D
O_t = O1 + O2 + O3 + O4
prob.addConstraint(name='L_tsum' + suffix, constraint=L_t == pulp.lpSum(LS))
prob.addConstraint(name='L_tSD' + suffix, constraint=L_t*5 == S + D)
return pd.Series(
data=(*LS, S, D, O_t),
index=('LS1', 'LS2', 'LS3', 'LS4', 'LS5', 'LS6', 'S', 'D', 'O_t'))
prob = pulp.LpProblem(name='multiaxis', sense=pulp.LpMaximize)
df = pd.concat((df, df.apply(make_L, axis=1)), axis=1)
prob.objective = pulp.lpSum(df.O_t)
print(df)
print()
print(prob)
prob.solve()
assert prob.status == pulp.LpStatusOptimal
result = pd.concat((
df.L_smax,
df.iloc[:, 1:-1].applymap(pulp.LpVariable.value),
df.O_t.apply(pulp.LpAffineExpression.value),
), axis=1)
with pd.option_context('display.max_rows', None):
print(result)
L_smax LS1 LS2 LS3 LS4 LS5 LS6 \
L_t
1 5 LS1(001) LS2(001) LS3(001) LS4(001) LS5(001) LS6(001)
2 5 LS1(002) LS2(002) LS3(002) LS4(002) LS5(002) LS6(002)
3 5 LS1(003) LS2(003) LS3(003) LS4(003) LS5(003) LS6(003)
4 5 LS1(004) LS2(004) LS3(004) LS4(004) LS5(004) LS6(004)
5 5 LS1(005) LS2(005) LS3(005) LS4(005) LS5(005) LS6(005)
.. ... ... ... ... ... ... ...
236 45 LS1(236) LS2(236) LS3(236) LS4(236) LS5(236) LS6(236)
237 45 LS1(237) LS2(237) LS3(237) LS4(237) LS5(237) LS6(237)
238 45 LS1(238) LS2(238) LS3(238) LS4(238) LS5(238) LS6(238)
239 45 LS1(239) LS2(239) LS3(239) LS4(239) LS5(239) LS6(239)
240 50 LS1(240) LS2(240) LS3(240) LS4(240) LS5(240) LS6(240)
S D O_t
L_t
1 S(001) D(001) {LS1(001): 1, D(001): 13, LS2(001): 3, S(001):...
2 S(002) D(002) {LS1(002): 1, D(002): 13, LS2(002): 3, S(002):...
3 S(003) D(003) {LS1(003): 1, D(003): 13, LS2(003): 3, S(003):...
4 S(004) D(004) {LS1(004): 1, D(004): 13, LS2(004): 3, S(004):...
5 S(005) D(005) {LS1(005): 1, D(005): 13, LS2(005): 3, S(005):...
.. ... ... ...
236 S(236) D(236) {LS1(236): 1, D(236): 13, LS2(236): 3, S(236):...
237 S(237) D(237) {LS1(237): 1, D(237): 13, LS2(237): 3, S(237):...
238 S(238) D(238) {LS1(238): 1, D(238): 13, LS2(238): 3, S(238):...
239 S(239) D(239) {LS1(239): 1, D(239): 13, LS2(239): 3, S(239):...
240 S(240) D(240) {LS1(240): 1, D(240): 13, LS2(240): 3, S(240):...
[240 rows x 10 columns]
multiaxis:
MAXIMIZE
13*D(001) + ... + 5*S(239) + 5*S(240) + 0
SUBJECT TO
L_tsum(001): LS1(001) + LS2(001) + LS3(001) + LS4(001) + LS5(001) + LS6(001)
= 1
...
0 <= S(236) <= 1180 Integer
0 <= S(237) <= 1185 Integer
0 <= S(238) <= 1190 Integer
0 <= S(239) <= 1195 Integer
0 <= S(240) <= 1200 Integer
Welcome to the CBC MILP Solver
Version: 2.10.3
Build Date: Dec 15 2019
command line - .venv\lib\site-packages\pulp\solverdir\cbc\win\64\cbc.exe Temp\5c4bdbccaed24aafaf2911972835bd01-pulp.mps max timeMode elapsed branch printingOptions all solution Temp\5c4bdbccaed24aafaf2911972835bd01-pulp.sol (default strategy 1)
At line 2 NAME MODEL
At line 3 ROWS
At line 485 COLUMNS
At line 7446 RHS
At line 7927 BOUNDS
At line 9848 ENDATA
Problem MODEL has 480 rows, 1920 columns and 1920 elements
Coin0008I MODEL read with 0 errors
Option for timeMode changed from cpu to elapsed
Continuous objective value is 1.93204e+06 - 0.01 seconds
Cgl0003I 0 fixed, 66 tightened bounds, 0 strengthened rows, 0 substitutions
Cgl0004I processed model has 232 rows, 727 columns (727 integer (0 of which binary)) and 727 elements
Cutoff increment increased from 1e-05 to 0.9999
Cbc0038I Initial state - 0 integers unsatisfied sum - 5.40012e-13
Cbc0038I Solution found of -1.93204e+06
Cbc0038I Cleaned solution of -1.93204e+06
Cbc0038I Before mini branch and bound, 727 integers at bound fixed and 0 continuous of which 39 were internal integer and 0 internal continuous
Cbc0038I Mini branch and bound did not improve solution (0.04 seconds)
Cbc0038I After 0.04 seconds - Feasibility pump exiting with objective of -1.93204e+06 - took 0.00 seconds
Cbc0012I Integer solution of -1932044 found by feasibility pump after 0 iterations and 0 nodes (0.04 seconds)
Cbc0001I Search completed - best objective -1932044, took 0 iterations and 0 nodes (0.04 seconds)
Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost
Cuts at root node changed objective from -1.93204e+06 to -1.93204e+06
Probing was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Gomory was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Knapsack was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
Clique was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
MixedIntegerRounding2 was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
FlowCover was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
TwoMirCuts was tried 0 times and created 0 cuts of which 0 were active after adding rounds of cuts (0.000 seconds)
ZeroHalf 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
Objective value: 1932044.00000000
Enumerated nodes: 0
Total iterations: 0
Time (CPU seconds): 0.05
Time (Wallclock seconds): 0.05
Option for printingOptions changed from normal to all
Total time (CPU seconds): 0.08 (Wallclock seconds): 0.08
L_smax LS1 LS2 LS3 LS4 LS5 LS6 S D O_t
L_t
1 5 0.0 0.0 0.0 1.0 0.0 0.0 0.0 5.0 69.0
2 5 0.0 0.0 0.0 2.0 0.0 0.0 0.0 10.0 138.0
3 5 0.0 0.0 0.0 3.0 0.0 0.0 0.0 15.0 207.0
...
239 45 45.0 45.0 45.0 45.0 14.0 45.0 0.0 1195.0 15895.0
240 50 50.0 50.0 50.0 50.0 0.0 40.0 0.0 1200.0 16000.0
To model your initial conditions is somewhat easy - just modify the variable bounds and add offsets to some of the affine expressions. However. For any Lt >= 235 the problem is infeasible. Do you see why?
import pandas as pd
import pulp
pd.set_option('display.max_columns', None)
df = pd.DataFrame(index=pd.RangeIndex(start=1, stop=235, name='L_t'))
maxima = pd.Series(
name='L_smax',
index=pd.Index(name='L_t', data=(
15, 30, 50, 60, 90, 120, 150, 180, 210, 240, 270)),
data=(5, 10, 15, 17, 20, 25, 30, 35, 40, 45, 50))
df['L_smax'] = pd.merge_asof(
left=df, right=maxima,
left_index=True, right_index=True,
direction='forward', allow_exact_matches=False)
def make_L(row: pd.Series) -> pd.Series:
L_t = row.name
suffix = f'({L_t:03d})'
L_init = 11
S_init = 2
D_init = 0
LS = [
pulp.LpVariable(
name=f'LS{i}{suffix}', cat=pulp.LpInteger, lowBound=0,
upBound=min(50 - L_init, row.L_smax))
for i in range(1, 7)]
S = pulp.LpVariable(name='S' + suffix, cat=pulp.LpInteger, lowBound=0, upBound=5*L_t)
D = pulp.LpVariable(name='D' + suffix, cat=pulp.LpInteger, lowBound=0, upBound=5*L_t)
prob.addConstraint(name='L_tsum' + suffix, constraint=L_t == pulp.lpSum(LS))
prob.addConstraint(name='L_tSD' + suffix, constraint=L_t*5 == S + D)
Lo = [L + L_init for L in LS]
Lo1, Lo2, Lo3, Lo4, Lo5, Lo6 = Lo
Do = D + D_init
So = S + S_init
O1 = Lo1 + 3*Do
O2 = 3*Lo2 + 4*So
O3 = So + 3*Do
O4 = 4*Lo4 + 7*Do
O_t = O1 + O2 + O3 + O4
return pd.Series(
data=(*Lo, So, Do, O_t),
index=('LS1', 'LS2', 'LS3', 'LS4', 'LS5', 'LS6', 'S', 'D', 'O_t'))
prob = pulp.LpProblem(name='multiaxis', sense=pulp.LpMaximize)
df = pd.concat((df, df.apply(make_L, axis=1)), axis=1)
prob.objective = pulp.lpSum(df.O_t)
print(df)
print()
print(prob)
prob.solve()
assert prob.status == pulp.LpStatusOptimal
result = pd.concat((
df.L_smax,
df.iloc[:, 1:].applymap(pulp.LpAffineExpression.value),
), axis=1)
with pd.option_context('display.max_rows', None):
print(result)
L_smax LS1 LS2 LS3 LS4 LS5 LS6 S D O_t
L_t
1 5 11.0 11.0 11.0 12.0 11.0 11.0 2.0 5.0 167.0
2 5 11.0 11.0 11.0 13.0 11.0 11.0 2.0 10.0 236.0
3 5 11.0 11.0 11.0 14.0 11.0 11.0 2.0 15.0 305.0
4 5 11.0 11.0 11.0 15.0 11.0 11.0 2.0 20.0 374.0
5 5 11.0 11.0 11.0 16.0 11.0 11.0 2.0 25.0 443.0
6 5 11.0 12.0 11.0 16.0 11.0 11.0 2.0 30.0 511.0
7 5 11.0 13.0 11.0 16.0 11.0 11.0 2.0 35.0 579.0
8 5 11.0 14.0 11.0 16.0 11.0 11.0 2.0 40.0 647.0
9 5 11.0 15.0 11.0 16.0 11.0 11.0 2.0 45.0 715.0
10 5 11.0 16.0 11.0 16.0 11.0 11.0 2.0 50.0 783.0
11 5 12.0 16.0 11.0 16.0 11.0 11.0 2.0 55.0 849.0
12 5 13.0 16.0 11.0 16.0 11.0 11.0 2.0 60.0 915.0
13 5 14.0 16.0 11.0 16.0 11.0 11.0 2.0 65.0 981.0
14 5 15.0 16.0 11.0 16.0 11.0 11.0 2.0 70.0 1047.0
15 10 11.0 16.0 11.0 21.0 11.0 11.0 2.0 75.0 1128.0
16 10 11.0 17.0 11.0 21.0 11.0 11.0 2.0 80.0 1196.0
17 10 11.0 18.0 11.0 21.0 11.0 11.0 2.0 85.0 1264.0
18 10 11.0 19.0 11.0 21.0 11.0 11.0 2.0 90.0 1332.0
19 10 11.0 20.0 11.0 21.0 11.0 11.0 2.0 95.0 1400.0
20 10 11.0 21.0 11.0 21.0 11.0 11.0 2.0 100.0 1468.0
21 10 12.0 21.0 11.0 21.0 11.0 11.0 2.0 105.0 1534.0
22 10 13.0 21.0 11.0 21.0 11.0 11.0 2.0 110.0 1600.0
23 10 14.0 21.0 11.0 21.0 11.0 11.0 2.0 115.0 1666.0
24 10 15.0 21.0 11.0 21.0 11.0 11.0 2.0 120.0 1732.0
25 10 16.0 21.0 11.0 21.0 11.0 11.0 2.0 125.0 1798.0
26 10 17.0 21.0 11.0 21.0 11.0 11.0 2.0 130.0 1864.0
27 10 18.0 21.0 11.0 21.0 11.0 11.0 2.0 135.0 1930.0
28 10 19.0 21.0 11.0 21.0 11.0 11.0 2.0 140.0 1996.0
29 10 20.0 21.0 11.0 21.0 11.0 11.0 2.0 145.0 2062.0
30 15 11.0 26.0 11.0 26.0 11.0 11.0 2.0 150.0 2153.0
31 15 12.0 26.0 11.0 26.0 11.0 11.0 2.0 155.0 2219.0
32 15 13.0 26.0 11.0 26.0 11.0 11.0 2.0 160.0 2285.0
33 15 14.0 26.0 11.0 26.0 11.0 11.0 2.0 165.0 2351.0
34 15 15.0 26.0 11.0 26.0 11.0 11.0 2.0 170.0 2417.0
35 15 16.0 26.0 11.0 26.0 11.0 11.0 2.0 175.0 2483.0
36 15 17.0 26.0 11.0 26.0 11.0 11.0 2.0 180.0 2549.0
37 15 18.0 26.0 11.0 26.0 11.0 11.0 2.0 185.0 2615.0
38 15 19.0 26.0 11.0 26.0 11.0 11.0 2.0 190.0 2681.0
39 15 20.0 26.0 11.0 26.0 11.0 11.0 2.0 195.0 2747.0
40 15 21.0 26.0 11.0 26.0 11.0 11.0 2.0 200.0 2813.0
41 15 22.0 26.0 11.0 26.0 11.0 11.0 2.0 205.0 2879.0
42 15 23.0 26.0 11.0 26.0 11.0 11.0 2.0 210.0 2945.0
43 15 24.0 26.0 11.0 26.0 11.0 11.0 2.0 215.0 3011.0
44 15 25.0 26.0 11.0 26.0 11.0 11.0 2.0 220.0 3077.0
45 15 26.0 26.0 11.0 26.0 11.0 11.0 2.0 225.0 3143.0
46 15 26.0 26.0 11.0 26.0 12.0 11.0 2.0 230.0 3208.0
47 15 26.0 26.0 13.0 26.0 11.0 11.0 2.0 235.0 3273.0
48 15 26.0 26.0 14.0 26.0 11.0 11.0 2.0 240.0 3338.0
49 15 26.0 26.0 15.0 26.0 11.0 11.0 2.0 245.0 3403.0
50 17 27.0 28.0 11.0 28.0 11.0 11.0 2.0 250.0 3483.0
51 17 28.0 28.0 11.0 28.0 11.0 11.0 2.0 255.0 3549.0
52 17 28.0 28.0 12.0 28.0 11.0 11.0 2.0 260.0 3614.0
53 17 28.0 28.0 13.0 28.0 11.0 11.0 2.0 265.0 3679.0
54 17 28.0 28.0 11.0 28.0 14.0 11.0 2.0 270.0 3744.0
55 17 28.0 28.0 11.0 28.0 11.0 15.0 2.0 275.0 3809.0
56 17 28.0 28.0 11.0 28.0 16.0 11.0 2.0 280.0 3874.0
57 17 28.0 28.0 17.0 28.0 11.0 11.0 2.0 285.0 3939.0
58 17 28.0 28.0 18.0 28.0 11.0 11.0 2.0 290.0 4004.0
59 17 28.0 28.0 19.0 28.0 11.0 11.0 2.0 295.0 4069.0
60 20 31.0 31.0 11.0 31.0 11.0 11.0 2.0 300.0 4158.0
61 20 31.0 31.0 11.0 31.0 12.0 11.0 2.0 305.0 4223.0
62 20 31.0 31.0 11.0 31.0 13.0 11.0 2.0 310.0 4288.0
63 20 31.0 31.0 11.0 31.0 14.0 11.0 2.0 315.0 4353.0
64 20 31.0 31.0 11.0 31.0 15.0 11.0 2.0 320.0 4418.0
65 20 31.0 31.0 11.0 31.0 11.0 16.0 2.0 325.0 4483.0
66 20 31.0 31.0 11.0 31.0 17.0 11.0 2.0 330.0 4548.0
67 20 31.0 31.0 18.0 31.0 11.0 11.0 2.0 335.0 4613.0
68 20 31.0 31.0 19.0 31.0 11.0 11.0 2.0 340.0 4678.0
69 20 31.0 31.0 20.0 31.0 11.0 11.0 2.0 345.0 4743.0
70 20 31.0 31.0 21.0 31.0 11.0 11.0 2.0 350.0 4808.0
71 20 31.0 31.0 22.0 31.0 11.0 11.0 2.0 355.0 4873.0
72 20 31.0 31.0 23.0 31.0 11.0 11.0 2.0 360.0 4938.0
73 20 31.0 31.0 24.0 31.0 11.0 11.0 2.0 365.0 5003.0
74 20 31.0 31.0 25.0 31.0 11.0 11.0 2.0 370.0 5068.0
75 20 31.0 31.0 11.0 31.0 26.0 11.0 2.0 375.0 5133.0
76 20 31.0 31.0 11.0 31.0 11.0 27.0 2.0 380.0 5198.0
77 20 31.0 31.0 11.0 31.0 28.0 11.0 2.0 385.0 5263.0
78 20 31.0 31.0 29.0 31.0 11.0 11.0 2.0 390.0 5328.0
79 20 31.0 31.0 30.0 31.0 11.0 11.0 2.0 395.0 5393.0
80 20 31.0 31.0 11.0 31.0 11.0 31.0 2.0 400.0 5458.0
81 20 31.0 31.0 11.0 31.0 31.0 12.0 2.0 405.0 5523.0
82 20 31.0 31.0 13.0 31.0 31.0 11.0 2.0 410.0 5588.0
83 20 31.0 31.0 31.0 31.0 11.0 14.0 2.0 415.0 5653.0
84 20 31.0 31.0 11.0 31.0 31.0 15.0 2.0 420.0 5718.0
85 20 31.0 31.0 16.0 31.0 11.0 31.0 2.0 425.0 5783.0
86 20 31.0 31.0 11.0 31.0 17.0 31.0 2.0 430.0 5848.0
87 20 31.0 31.0 31.0 31.0 11.0 18.0 2.0 435.0 5913.0
88 20 31.0 31.0 19.0 31.0 31.0 11.0 2.0 440.0 5978.0
89 20 31.0 31.0 31.0 31.0 20.0 11.0 2.0 445.0 6043.0
90 25 36.0 36.0 26.0 36.0 11.0 11.0 2.0 450.0 6148.0
91 25 36.0 36.0 27.0 36.0 11.0 11.0 2.0 455.0 6213.0
92 25 36.0 36.0 11.0 36.0 11.0 28.0 2.0 460.0 6278.0
93 25 36.0 36.0 11.0 36.0 11.0 29.0 2.0 465.0 6343.0
94 25 36.0 36.0 11.0 36.0 30.0 11.0 2.0 470.0 6408.0
95 25 36.0 36.0 11.0 36.0 31.0 11.0 2.0 475.0 6473.0
96 25 36.0 36.0 11.0 36.0 32.0 11.0 2.0 480.0 6538.0
97 25 36.0 36.0 11.0 36.0 11.0 33.0 2.0 485.0 6603.0
98 25 36.0 36.0 34.0 36.0 11.0 11.0 2.0 490.0 6668.0
99 25 36.0 36.0 35.0 36.0 11.0 11.0 2.0 495.0 6733.0
100 25 36.0 36.0 11.0 36.0 36.0 11.0 2.0 500.0 6798.0
101 25 36.0 36.0 11.0 36.0 36.0 12.0 2.0 505.0 6863.0
102 25 36.0 36.0 11.0 36.0 36.0 13.0 2.0 510.0 6928.0
103 25 36.0 36.0 11.0 36.0 36.0 14.0 2.0 515.0 6993.0
104 25 36.0 36.0 36.0 36.0 11.0 15.0 2.0 520.0 7058.0
105 25 36.0 36.0 36.0 36.0 16.0 11.0 2.0 525.0 7123.0
106 25 36.0 36.0 36.0 36.0 17.0 11.0 2.0 530.0 7188.0
107 25 36.0 36.0 36.0 36.0 18.0 11.0 2.0 535.0 7253.0
108 25 36.0 36.0 11.0 36.0 36.0 19.0 2.0 540.0 7318.0
109 25 36.0 36.0 20.0 36.0 36.0 11.0 2.0 545.0 7383.0
110 25 36.0 36.0 36.0 36.0 11.0 21.0 2.0 550.0 7448.0
111 25 36.0 36.0 36.0 36.0 22.0 11.0 2.0 555.0 7513.0
112 25 36.0 36.0 23.0 36.0 11.0 36.0 2.0 560.0 7578.0
113 25 36.0 36.0 36.0 36.0 24.0 11.0 2.0 565.0 7643.0
114 25 36.0 36.0 36.0 36.0 25.0 11.0 2.0 570.0 7708.0
115 25 36.0 36.0 26.0 36.0 11.0 36.0 2.0 575.0 7773.0
116 25 36.0 36.0 27.0 36.0 11.0 36.0 2.0 580.0 7838.0
117 25 36.0 36.0 36.0 36.0 28.0 11.0 2.0 585.0 7903.0
118 25 36.0 36.0 36.0 36.0 29.0 11.0 2.0 590.0 7968.0
119 25 36.0 36.0 30.0 36.0 36.0 11.0 2.0 595.0 8033.0
120 30 41.0 41.0 11.0 41.0 41.0 11.0 2.0 600.0 8138.0
121 30 41.0 41.0 11.0 41.0 12.0 41.0 2.0 605.0 8203.0
122 30 41.0 41.0 13.0 41.0 41.0 11.0 2.0 610.0 8268.0
123 30 41.0 41.0 41.0 41.0 14.0 11.0 2.0 615.0 8333.0
124 30 41.0 41.0 15.0 41.0 41.0 11.0 2.0 620.0 8398.0
125 30 41.0 41.0 41.0 41.0 16.0 11.0 2.0 625.0 8463.0
126 30 41.0 41.0 17.0 41.0 11.0 41.0 2.0 630.0 8528.0
127 30 41.0 41.0 41.0 41.0 11.0 18.0 2.0 635.0 8593.0
128 30 41.0 41.0 41.0 41.0 19.0 11.0 2.0 640.0 8658.0
129 30 41.0 41.0 20.0 41.0 41.0 11.0 2.0 645.0 8723.0
130 30 41.0 41.0 11.0 41.0 41.0 21.0 2.0 650.0 8788.0
131 30 41.0 41.0 11.0 41.0 41.0 22.0 2.0 655.0 8853.0
132 30 41.0 41.0 11.0 41.0 41.0 23.0 2.0 660.0 8918.0
133 30 41.0 41.0 11.0 41.0 41.0 24.0 2.0 665.0 8983.0
134 30 41.0 41.0 41.0 41.0 25.0 11.0 2.0 670.0 9048.0
135 30 41.0 41.0 41.0 41.0 26.0 11.0 2.0 675.0 9113.0
136 30 41.0 41.0 27.0 41.0 41.0 11.0 2.0 680.0 9178.0
137 30 41.0 41.0 28.0 41.0 11.0 41.0 2.0 685.0 9243.0
138 30 41.0 41.0 41.0 41.0 11.0 29.0 2.0 690.0 9308.0
139 30 41.0 41.0 41.0 41.0 11.0 30.0 2.0 695.0 9373.0
140 30 41.0 41.0 31.0 41.0 11.0 41.0 2.0 700.0 9438.0
141 30 41.0 41.0 11.0 41.0 32.0 41.0 2.0 705.0 9503.0
142 30 41.0 41.0 41.0 41.0 11.0 33.0 2.0 710.0 9568.0
143 30 41.0 41.0 34.0 41.0 41.0 11.0 2.0 715.0 9633.0
144 30 41.0 41.0 35.0 41.0 41.0 11.0 2.0 720.0 9698.0
145 30 41.0 41.0 36.0 41.0 11.0 41.0 2.0 725.0 9763.0
146 30 41.0 41.0 41.0 41.0 11.0 37.0 2.0 730.0 9828.0
147 30 41.0 41.0 41.0 41.0 38.0 11.0 2.0 735.0 9893.0
148 30 41.0 41.0 39.0 41.0 41.0 11.0 2.0 740.0 9958.0
149 30 41.0 41.0 11.0 41.0 41.0 40.0 2.0 745.0 10023.0
150 35 46.0 46.0 46.0 46.0 21.0 11.0 2.0 750.0 10128.0
151 35 46.0 46.0 46.0 46.0 11.0 22.0 2.0 755.0 10193.0
152 35 46.0 46.0 11.0 46.0 46.0 23.0 2.0 760.0 10258.0
153 35 46.0 46.0 46.0 46.0 24.0 11.0 2.0 765.0 10323.0
154 35 46.0 46.0 46.0 46.0 11.0 25.0 2.0 770.0 10388.0
155 35 46.0 46.0 26.0 46.0 11.0 46.0 2.0 775.0 10453.0
156 35 46.0 46.0 46.0 46.0 27.0 11.0 2.0 780.0 10518.0
157 35 46.0 46.0 46.0 46.0 11.0 28.0 2.0 785.0 10583.0
158 35 46.0 46.0 46.0 46.0 11.0 29.0 2.0 790.0 10648.0
159 35 46.0 46.0 30.0 46.0 11.0 46.0 2.0 795.0 10713.0
160 35 46.0 46.0 11.0 46.0 31.0 46.0 2.0 800.0 10778.0
161 35 46.0 46.0 32.0 46.0 46.0 11.0 2.0 805.0 10843.0
162 35 46.0 46.0 33.0 46.0 46.0 11.0 2.0 810.0 10908.0
163 35 46.0 46.0 46.0 46.0 11.0 34.0 2.0 815.0 10973.0
164 35 46.0 46.0 46.0 46.0 11.0 35.0 2.0 820.0 11038.0
165 35 46.0 46.0 36.0 46.0 11.0 46.0 2.0 825.0 11103.0
166 35 46.0 46.0 46.0 46.0 11.0 37.0 2.0 830.0 11168.0
167 35 46.0 46.0 46.0 46.0 38.0 11.0 2.0 835.0 11233.0
168 35 46.0 46.0 11.0 46.0 39.0 46.0 2.0 840.0 11298.0
169 35 46.0 46.0 40.0 46.0 11.0 46.0 2.0 845.0 11363.0
170 35 46.0 46.0 41.0 46.0 46.0 11.0 2.0 850.0 11428.0
171 35 46.0 46.0 11.0 46.0 46.0 42.0 2.0 855.0 11493.0
172 35 46.0 46.0 11.0 46.0 46.0 43.0 2.0 860.0 11558.0
173 35 46.0 46.0 44.0 46.0 46.0 11.0 2.0 865.0 11623.0
174 35 46.0 46.0 46.0 46.0 11.0 45.0 2.0 870.0 11688.0
175 35 46.0 46.0 46.0 46.0 46.0 11.0 2.0 875.0 11753.0
176 35 46.0 46.0 46.0 46.0 46.0 12.0 2.0 880.0 11818.0
177 35 46.0 46.0 46.0 46.0 46.0 13.0 2.0 885.0 11883.0
178 35 46.0 46.0 46.0 46.0 46.0 14.0 2.0 890.0 11948.0
179 35 46.0 46.0 46.0 46.0 46.0 15.0 2.0 895.0 12013.0
180 40 50.0 50.0 50.0 50.0 35.0 11.0 2.0 900.0 12110.0
181 40 50.0 50.0 50.0 50.0 11.0 36.0 2.0 905.0 12175.0
182 40 50.0 50.0 50.0 50.0 11.0 37.0 2.0 910.0 12240.0
183 40 50.0 50.0 50.0 50.0 38.0 11.0 2.0 915.0 12305.0
184 40 50.0 50.0 50.0 50.0 39.0 11.0 2.0 920.0 12370.0
185 40 50.0 50.0 50.0 50.0 11.0 40.0 2.0 925.0 12435.0
186 40 50.0 50.0 50.0 50.0 11.0 41.0 2.0 930.0 12500.0
187 40 50.0 50.0 11.0 50.0 42.0 50.0 2.0 935.0 12565.0
188 40 50.0 50.0 43.0 50.0 11.0 50.0 2.0 940.0 12630.0
189 40 50.0 50.0 11.0 50.0 50.0 44.0 2.0 945.0 12695.0
190 40 50.0 50.0 50.0 50.0 45.0 11.0 2.0 950.0 12760.0
191 40 50.0 50.0 50.0 50.0 46.0 11.0 2.0 955.0 12825.0
192 40 50.0 50.0 11.0 50.0 50.0 47.0 2.0 960.0 12890.0
193 40 50.0 50.0 50.0 50.0 48.0 11.0 2.0 965.0 12955.0
194 40 50.0 50.0 11.0 50.0 50.0 49.0 2.0 970.0 13020.0
195 40 50.0 50.0 50.0 50.0 50.0 11.0 2.0 975.0 13085.0
196 40 50.0 50.0 12.0 50.0 50.0 50.0 2.0 980.0 13150.0
197 40 50.0 50.0 50.0 50.0 50.0 13.0 2.0 985.0 13215.0
198 40 50.0 50.0 14.0 50.0 50.0 50.0 2.0 990.0 13280.0
199 40 50.0 50.0 50.0 50.0 15.0 50.0 2.0 995.0 13345.0
200 40 50.0 50.0 50.0 50.0 50.0 16.0 2.0 1000.0 13410.0
201 40 50.0 50.0 50.0 50.0 17.0 50.0 2.0 1005.0 13475.0
202 40 50.0 50.0 50.0 50.0 50.0 18.0 2.0 1010.0 13540.0
203 40 50.0 50.0 50.0 50.0 19.0 50.0 2.0 1015.0 13605.0
204 40 50.0 50.0 50.0 50.0 20.0 50.0 2.0 1020.0 13670.0
205 40 50.0 50.0 50.0 50.0 21.0 50.0 2.0 1025.0 13735.0
206 40 50.0 50.0 50.0 50.0 50.0 22.0 2.0 1030.0 13800.0
207 40 50.0 50.0 50.0 50.0 50.0 23.0 2.0 1035.0 13865.0
208 40 50.0 50.0 24.0 50.0 50.0 50.0 2.0 1040.0 13930.0
209 40 50.0 50.0 25.0 50.0 50.0 50.0 2.0 1045.0 13995.0
210 45 50.0 50.0 50.0 50.0 50.0 26.0 2.0 1050.0 14060.0
211 45 50.0 50.0 50.0 50.0 50.0 27.0 2.0 1055.0 14125.0
212 45 50.0 50.0 28.0 50.0 50.0 50.0 2.0 1060.0 14190.0
213 45 50.0 50.0 50.0 50.0 29.0 50.0 2.0 1065.0 14255.0
214 45 50.0 50.0 50.0 50.0 30.0 50.0 2.0 1070.0 14320.0
215 45 50.0 50.0 50.0 50.0 50.0 31.0 2.0 1075.0 14385.0
216 45 50.0 50.0 50.0 50.0 50.0 32.0 2.0 1080.0 14450.0
217 45 50.0 50.0 50.0 50.0 50.0 33.0 2.0 1085.0 14515.0
218 45 50.0 50.0 50.0 50.0 34.0 50.0 2.0 1090.0 14580.0
219 45 50.0 50.0 50.0 50.0 50.0 35.0 2.0 1095.0 14645.0
220 45 50.0 50.0 50.0 50.0 36.0 50.0 2.0 1100.0 14710.0
221 45 50.0 50.0 50.0 50.0 50.0 37.0 2.0 1105.0 14775.0
222 45 50.0 50.0 38.0 50.0 50.0 50.0 2.0 1110.0 14840.0
223 45 50.0 50.0 50.0 50.0 39.0 50.0 2.0 1115.0 14905.0
224 45 50.0 50.0 50.0 50.0 50.0 40.0 2.0 1120.0 14970.0
225 45 50.0 50.0 50.0 50.0 41.0 50.0 2.0 1125.0 15035.0
226 45 50.0 50.0 42.0 50.0 50.0 50.0 2.0 1130.0 15100.0
227 45 50.0 50.0 50.0 50.0 43.0 50.0 2.0 1135.0 15165.0
228 45 50.0 50.0 44.0 50.0 50.0 50.0 2.0 1140.0 15230.0
229 45 50.0 50.0 50.0 50.0 45.0 50.0 2.0 1145.0 15295.0
230 45 50.0 50.0 50.0 50.0 46.0 50.0 2.0 1150.0 15360.0
231 45 50.0 50.0 50.0 50.0 47.0 50.0 2.0 1155.0 15425.0
232 45 50.0 50.0 50.0 50.0 50.0 48.0 2.0 1160.0 15490.0
233 45 50.0 50.0 50.0 50.0 50.0 49.0 2.0 1165.0 15555.0
234 45 50.0 50.0 50.0 50.0 50.0 50.0 2.0 1170.0 15620.0