-
Notifications
You must be signed in to change notification settings - Fork 0
/
solver.py
executable file
·77 lines (62 loc) · 2.61 KB
/
solver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#! /usr/bin/python3
import argparse
import logging
import re
from rides_io import parse_input, dump_rides
from score import Score
def set_log_level(args):
if args.debug:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
def get_file_out_name(file_in_name):
basename_search = re.search("(.*)\.in", file_in_name)
if basename_search:
return basename_search.group(1) + '.out'
else:
return 'default.out'
def get_solver(name):
if name == 'flow':
from solvers.flowsolver import FlowSolver
return FlowSolver()
elif name == 'car':
from solvers.carsolver import CarSolver
return CarSolver()
else: # ride
from solvers.ridesolver import RideSolver
return RideSolver()
def print_score(score, args):
if args.rides:
print(
"rides: {0:,} = {1:,} (taken) + {2:,} (left)".format(score.assigned + score.unassigned, score.assigned, score.unassigned))
if args.wait:
print("wait time: {0:,}".format(score.wait_time))
if args.score:
print("score: {0:,} = {1:,} + {2:,} (bonus)".format(score.total(), score.raw_score, score.bonus_score))
else:
print("score: {0:,}".format(score.total()))
def main():
parser = argparse.ArgumentParser(description='assign rides to cars')
parser.add_argument('file_in', type=str, nargs='+', help='<file basename>.in file input')
parser.add_argument('--solver', type=str, default='ride', choices=('ride', 'flow', 'car'), help='solver')
parser.add_argument('--debug', action='store_true', help='for debug purpose')
parser.add_argument('--wait', action='store_true', help='display wait time')
parser.add_argument('--rides', action='store_true', help='display rides taken and left')
parser.add_argument('--score', action='store_true', help='display raw score and bonus score')
parser.add_argument('--progress', action='store_true', help='display progress bar')
args = parser.parse_args()
set_log_level(args)
solver = get_solver(args.solver)
score_total = Score()
batch = len(args.file_in) > 1 # several input files
for file_in in args.file_in:
(rides_list, rows, columns, vehicles, rides, bonus, steps) = parse_input(file_in)
solution, score = solver.get_solution(rides_list, rows, columns, vehicles, rides, bonus, steps, args)
print_score(score, args)
score_total.add(score)
file_out = get_file_out_name(file_in)
dump_rides(solution, file_out)
if batch:
print_score(score_total, args)
if __name__ == "__main__":
main()