Skip to content

Commit

Permalink
enabled usage of remaining time in heuristics for feasible solutions,…
Browse files Browse the repository at this point in the history
… added time-stamps on output folders, added mip-gap information to outputs
  • Loading branch information
Philipp Brendel committed Apr 1, 2022
1 parent 93cc222 commit 1994fbf
Showing 1 changed file with 90 additions and 30 deletions.
120 changes: 90 additions & 30 deletions paper.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ def main(configs, time_limit_total, time_limit_b, out_dir, approach, time_window
out_dir = os.path.join('output', 'paper', out_dir)
if not os.path.exists(out_dir):
os.makedirs(out_dir)
else:
time_stamp = datetime.now().strftime("%Y_%m_%d-%H_%M_%S")
out_dir = os.path.join(out_dir, time_stamp)
os.makedirs(out_dir)
logger = setup_logger('logger', os.path.join(out_dir, 'my_log.log'),
formatter=['%(asctime)s:%(message)s',
'%H:%M:%S'])
Expand Down Expand Up @@ -127,35 +131,79 @@ def main(configs, time_limit_total, time_limit_b, out_dir, approach, time_window
res_frame.to_csv(os.path.join(out_dir, 'tmp_results.csv'))
logger.info(f'Finished part B: Best Limit: {best_limit} in file {best_res}')

# Part C: warm-start with remaining time
if best_res is None:
logger.info('Could not find feasible solution, skipping warm-start...\n')
else:
yaml_dict['constrain_vehicles'] = best_limit
yaml_dict['objective'] = 1
while_flag = True
while while_flag:
time_passed = time.time() - start_time
time_left = time_limit_total - time_passed
yaml_dict['TimeLimit'] = time_left
logger.info(f'Using remaining {time_left} s with warm_start')
sk = my_sk(yaml_dict, out_dir=tmp_out)
sk.preprocess()
w, s_n, s_v, f, z, e = read_results(best_res)
grb_mod = sk.solve(w_start=w, s_n_start=s_n, s_v_start=s_v,
f_start=f, z_start=z, e_start=e)
if hasattr(grb_mod, 'objVal'):
sk.postprocess(grb_mod)
logger.info(f'Final objective {grb_mod.objVal}\n')
obj_val = grb_mod.obj_val
v_limit = yaml_dict['v_max']
# Part C: warm-start with remaining time
if best_res is None:
logger.info('Could not find feasible solution, '
+ f'retrying with Vehicle Limit: {v_limit} '
+ f'for remaining {time_left} seconds:')
yaml_dict['constrain_vehicles'] = v_limit
yaml_dict['objective'] = 0
yaml_dict['TimeLimit'] = time_left

# re run
sk = my_sk(yaml_dict, out_dir=tmp_out)
sk.preprocess()
grb_mod = sk.solve()

if grb_mod.status == 2:
sk.postprocess(grb_mod)
best_limit = yaml_dict['v_max']
best_res = os.path.join(tmp_out, (sk.instance_str + '.txt'))
logger.info(f'Feasible after {grb_mod.runtime} s')
status = 'FEASIBLE'
else:
# still no solution -> exit
while_flag = False
if grb_mod.status == 3:
logger.info(f'Infeasible after {grb_mod.runtime} s')
status = 'INFEASIBLE'
elif grb_mod.status == 9:
logger.info(f'Timeout after {grb_mod.runtime} s')
status = 'TIMEOUT'
else:
logger.info(f'grb_mod status returned: {grb_mod.status}')
status = grb_mod.status
res_frame = res_frame.append({'config': config_name,
't': t,
'v_limit': yaml_dict['v_max'],
'status': status,
'runtime': grb_mod.runtime}, ignore_index=True)
res_frame.to_csv(os.path.join(out_dir, 'tmp_results.csv'))
else:
logger.info('No Objective value -> failed warmstart?\n')
obj_val = 'None'
res_frame = res_frame.append({'config': config_name + '_warmstart',
't': t,
'v_limit': best_limit,
'status': grb_mod.status,
'runtime': grb_mod.runtime,
'obj_val': obj_val}, ignore_index=True)
res_frame.to_csv(os.path.join(out_dir, 'tmp_results.csv'))
# this part only once
yaml_dict['constrain_vehicles'] = best_limit
yaml_dict['objective'] = 1
yaml_dict['TimeLimit'] = time_left
logger.info(f'Using remaining {time_left} s with warm_start')
sk = my_sk(yaml_dict, out_dir=tmp_out)
sk.preprocess()
w, s_n, s_v, f, z, e = read_results(best_res)
grb_mod = sk.solve(w_start=w, s_n_start=s_n, s_v_start=s_v,
f_start=f, z_start=z, e_start=e)
if hasattr(grb_mod, 'objVal'):
sk.postprocess(grb_mod)
logger.info(f'Final objective {grb_mod.objVal}\n')
obj_val = grb_mod.obj_val
mip_gap = '{:.2f}'.format(100.0 * grb_mod.MIPGap)
else:
logger.info('No Objective value -> failed warmstart?\n')
obj_val = 'None'
mip_gap = 'None'
res_frame = res_frame.append({'config': config_name + '_warmstart',
't': t,
'v_limit': best_limit,
'status': grb_mod.status,
'runtime': grb_mod.runtime,
'obj_val': obj_val,
'mip_gap': mip_gap}, ignore_index=True)
res_frame.to_csv(os.path.join(out_dir, 'tmp_results.csv'))
# exit while loop
while_flag = False

res_frame.to_csv(os.path.join(out_dir, 'results.csv'))

Expand All @@ -168,6 +216,10 @@ def main_naive(configs, time_limit, out_dir, time_windows):
out_dir = os.path.join('output', 'paper', out_dir)
if not os.path.exists(out_dir):
os.makedirs(out_dir)
else:
time_stamp = datetime.now().strftime("%Y_%m_%d-%H_%M_%S")
out_dir = os.path.join(out_dir, time_stamp)
os.makedirs(out_dir)
logger = setup_logger('logger', os.path.join(out_dir, 'my_log.log'),
formatter=['%(asctime)s:%(message)s',
'%H:%M:%S'])
Expand Down Expand Up @@ -198,24 +250,29 @@ def main_naive(configs, time_limit, out_dir, time_windows):
logger.info(f'Feasible after {grb_mod.runtime} s')
logger.info(f'Final objective {grb_mod.objVal}')
obj_val = grb_mod.objVal
mip_gap = '{:.2f}'.format(100.0 * grb_mod.MIPGap)
elif grb_mod.status == 3:
status = 'INFEASIBLE'
logger.info(f'Infeasible after {grb_mod.runtime} s')
obj_val = 'None'
obj_val = None
mip_gap = None
elif grb_mod.status == 9:
status = 'TIMEOUT'
logger.info(f'Timeout after {grb_mod.runtime} s')
if hasattr(grb_mod, 'objVal'):
logger.info(f'Objective: {grb_mod.objVal}')
obj_val = grb_mod.objVal
mip_gap = '{:.2f}'.format(100.0 * grb_mod.MIPGap)
else:
obj_val = None
mip_gap = None

res_frame = res_frame.append({'config': config_name,
't': t,
'status': status,
'runtime': grb_mod.runtime,
'obj_val': obj_val},
'obj_val': obj_val,
'mip_gap': mip_gap},
ignore_index=True)
res_frame.to_csv(os.path.join(out_dir, 'tmp_results.csv'))

Expand All @@ -237,10 +294,13 @@ def main_naive(configs, time_limit, out_dir, time_windows):
help='Output (sub-)directory to be used')
parser.add_argument('-t', '--timelimit', type=int,
dest='timelimit', default=86400,
help='TimeLimit')
help='Time Limit for full optimization')
parser.add_argument('-tw', '--timewindow', type=int,
dest='timewindow', default=5,
help='Time Window of Simulation (hours)')
parser.add_argument('-tlb', '--timelimit_b', type=int,
dest='timelimit_b', default=1800,
help='Time Limit for finding Feasibility in Part B (seconds)')

args = parser.parse_args()

Expand All @@ -260,7 +320,7 @@ def main_naive(configs, time_limit, out_dir, time_windows):

# 2.0, 3.0 , 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
time_windows = [args.timewindow]
time_limit_b = 1800
time_limit_b = args.timelimit_b
time_limit_total = args.timelimit

if args.approach == 'naive':
Expand Down

0 comments on commit 1994fbf

Please sign in to comment.