1 #!/usr/bin/env python3 |
1 #!/usr/bin/env python3 |
2 |
2 |
3 from configparser import ConfigParser |
3 from configparser import ConfigParser |
4 from math import inf |
4 from math import inf |
5 |
5 from misc import profile |
6 replacements = { |
|
7 "ylioppilaskylä-itä": "ylioppilaskylä", |
|
8 "ylioppilaskylä-länsi": "ylioppilaskylä", |
|
9 "jokila": "lieto", |
|
10 "piispala": "lieto", |
|
11 'saaro': 'ruissalo', |
|
12 'silvola': 'vahto', |
|
13 'hemmola': 'vahto', |
|
14 'paasniittu': 'rusko', |
|
15 'kahari': 'rusko', |
|
16 'kemiö': 'kemiönsaari', |
|
17 'kasnäs': 'kemiönsaari', |
|
18 'pernon telakka': 'perno', |
|
19 'paimion sairaala': 'paimio', |
|
20 'hanhijoki': 'paimio', |
|
21 } |
|
22 |
|
23 region_info = ConfigParser() |
6 region_info = ConfigParser() |
24 region_info.read('regions.ini') |
7 region_info.read('regions.ini') |
25 municipalities = set(region_info.sections()) |
|
26 municipalities_per_region = {} |
|
27 |
|
28 for municipality in municipalities: |
|
29 for region in region_info[municipality].keys(): |
|
30 municipalities_per_region[region] = municipality |
|
31 |
|
32 for place_from, place_to in replacements.items(): |
|
33 municipalities_per_region[place_to] = municipalities_per_region[place_from] |
|
34 |
8 |
35 def simplify_name(name): |
9 def simplify_name(name): |
36 name = replacements.get(name, name) |
10 name = profile['replacements'].get(name, name) |
37 return name |
11 return name |
38 |
12 |
39 def reduce_schedule(route, trip_length, whole = False, long = False): |
13 def reduce_schedule(route, trip_length, whole = False, long = False): |
|
14 priorities = profile['priorities'] |
40 length = ((trip_length / 600) * 3 + len(route) * 2) / 5 |
15 length = ((trip_length / 600) * 3 + len(route) * 2) / 5 |
41 if not route: |
16 if not route: |
42 return '' |
17 return '' |
43 have_already = set() |
18 have_already = set() |
44 i = 0 |
19 i = 0 |
45 while i < len(route): |
20 while i < len(route): |
46 if route[i] in replacements: |
21 if route[i] in profile['replacements']: |
47 route[i] = replacements[route[i]] |
22 route[i] = profile['replacements'][route[i]] |
48 if route[i] in have_already: |
23 if route[i] in have_already: |
49 del route[i] |
24 del route[i] |
50 else: |
25 else: |
51 have_already.add(route[i]) |
26 have_already.add(route[i]) |
52 i += 1 |
27 i += 1 |
53 priorities = { |
|
54 'ihala': 150, |
|
55 'mylly': 200, |
|
56 'kuninkoja': 150, |
|
57 'moikoinen': 100, |
|
58 'raisio': 150, |
|
59 'kukola': 50, |
|
60 'kaistarniemi': 75, |
|
61 'papinsaari': 80, |
|
62 'oriniemi': 50, |
|
63 'pikisaari': 50, |
|
64 'häppilä': 20, |
|
65 'haarla': 80, |
|
66 'ylioppilaskylä': 50, |
|
67 'halinen': 70, |
|
68 'kakskerta': 200, |
|
69 'pansio': 50, |
|
70 'räntämäki': 25, |
|
71 'verkahovi': 25, |
|
72 'skanssi': 200, |
|
73 'vaala': 20, |
|
74 'varissuo': 60, |
|
75 'kohmo': 80, |
|
76 'kupittaa': 70, |
|
77 'kupittaa as': 120, |
|
78 'kauppatori': inf, |
|
79 'lentoasema': 50, |
|
80 'runosmäki': 50, |
|
81 'lieto': 100, |
|
82 'lieto as': 200, |
|
83 'ilmarinen': 50, |
|
84 'vahto': 50, |
|
85 'rusko': 200, |
|
86 'oriketo': 50, |
|
87 'harittu': 40, |
|
88 'jäkärlä': 150, |
|
89 'moisio': 150, |
|
90 'paattinen': 25, |
|
91 'kaarina': 200, |
|
92 'naantali': 200, |
|
93 'uittamo': 50, |
|
94 'piikkiö': 100, |
|
95 'paimio': 100, |
|
96 'pargas': 100, |
|
97 'nagu': 100, |
|
98 'yli-maaria': 60, |
|
99 'saramäki': 50, |
|
100 'tarvasjoki': 100, |
|
101 'marttila': 100, |
|
102 'koski tl': 100, |
|
103 'katariina': 50, |
|
104 'länsikeskus': 30, |
|
105 'kaanaa': 100, |
|
106 'satava': 50, |
|
107 'suikkila': 50, |
|
108 'raunistula': 50, |
|
109 'räntämäki': 50, |
|
110 'pääskyvuori': 100, |
|
111 'logomo': 100, |
|
112 'rymättylä': 50, |
|
113 "sauvo": 500, |
|
114 "kemiönsaari": 500, |
|
115 'suovuori': 300, |
|
116 'eerikvalla': 50, |
|
117 'petäsmäki': 50, |
|
118 'tortinmäki': 50, |
|
119 'aura': 100, |
|
120 'friskala': -1, |
|
121 'merimasku': 50, |
|
122 'turkuhalli': 100, |
|
123 'messukeskus': 100, |
|
124 'naantalin pikatie': 25, |
|
125 'helsingin valtatie': 25, |
|
126 'lauste': 25, |
|
127 'pompo': 25, |
|
128 'loukinainen': 25, |
|
129 'tuorla': 25, |
|
130 'satakunnantie': 25, |
|
131 'hepokulta': 25, |
|
132 'nättinummi': 25, |
|
133 'nummenmäki': 10, |
|
134 'kurala': 10, |
|
135 'itäharju': 25, |
|
136 'vasaramäki': 25, |
|
137 'pohjola': 25, |
|
138 'iso-heikkilä': 25, |
|
139 'patterinhaka': 25, |
|
140 'illoinen': 50, |
|
141 'luolavuori': 25, |
|
142 'mäntymäki': 25, |
|
143 'kurjenmäki': 25, |
|
144 'kuusisto': 25, |
|
145 'rautatieasema': 25, |
|
146 'majakkaranta': 25, |
|
147 'itäranta': 25, |
|
148 'martti': 25, |
|
149 'vähä-heikkilä': 25, |
|
150 'särkilahti': 25, |
|
151 'urusvuori': 25, |
|
152 'port arthur': 25, |
|
153 } |
|
154 |
28 |
155 if 'kauppatori' not in route: |
29 # if 'kauppatori' not in route: |
156 priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] |
30 # priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] |
157 |
31 |
158 from_place = route[0] |
32 from_place = route[0] |
159 destination = route[-1] |
33 destination = route[-1] |
160 reitti_arvot = {} |
34 reitti_arvot = {} |
161 f = lambda i: i**-0.3 |
35 f = lambda i: i**-0.3 |
162 factor = 1 / max(f(i + 1) for i in range(len(route))) |
36 factor = 1 / max(f(i + 1) for i in range(len(route))) |
163 while priorities.get(route[-1], 0) < 0: |
37 while float(priorities.get(route[-1], 0)) < 0: |
164 del route[-1] |
38 del route[-1] |
165 destination = route[-1] |
39 destination = route[-1] |
166 for i, stop in enumerate(route): |
40 for i, stop in enumerate(route): |
167 # muunna indeksi siten että myöhemmät alueet korostuvat |
41 # muunna indeksi siten että myöhemmät alueet korostuvat |
168 i = f(i + 1) * factor |
42 i = f(i + 1) * factor |
169 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
43 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
170 i *= priorities.get(stop, 1) |
44 i *= float(priorities.get(stop, 1)) |
171 reitti_arvot[stop] = i |
45 reitti_arvot[stop] = i |
172 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin |
46 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin |
173 if from_place in reitti_arvot: |
47 if from_place in reitti_arvot: |
174 reitti_arvot[from_place] = 0 |
48 reitti_arvot[from_place] = 0 |
175 # varmista että destination tulee kylttiin |
49 # varmista että destination tulee kylttiin |
199 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin |
73 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin |
200 weights = sorted(weights, key = lambda weight_data: weight_data[2]) |
74 weights = sorted(weights, key = lambda weight_data: weight_data[2]) |
201 # muodostetaan sign.. |
75 # muodostetaan sign.. |
202 sign = [paino[0] for paino in weights] |
76 sign = [paino[0] for paino in weights] |
203 to_place = sign[-1] |
77 to_place = sign[-1] |
204 #nearby_municipalities = {'Turku', 'Raisio', 'Naantali', 'Kaarina', 'Lieto'} |
|
205 #if from_place != to_place: |
|
206 # municipality_from = municipalities_per_region.get(from_place) |
|
207 # municipality_to = municipalities_per_region.get(to_place) |
|
208 # if municipality_from and municipality_to and municipality_from not in nearby_municipalities | {municipality_to} and municipality_to not in nearby_municipalities: |
|
209 # def convert_region(region): |
|
210 # municipality = municipalities_per_region.get(region, region) |
|
211 # if municipality != municipality_from: |
|
212 # return municipality |
|
213 # else: |
|
214 # return region |
|
215 # sign = [convert_region(region) for region in sign] |
|
216 old_sign = sign.copy() |
78 old_sign = sign.copy() |
217 sign = [] |
79 sign = [] |
218 for place in old_sign: |
80 for place in old_sign: |
219 if place not in sign: |
81 if place not in sign: |
220 sign.append(place) |
82 sign.append(place) |