1 #!/usr/bin/env python3 |
1 #!/usr/bin/env python3 |
2 def supista_reitti(reitti, kokonainen = False): |
2 def supista_reitti(reitti, ajomatka, kokonainen = False): |
|
3 length = ((ajomatka / 600) + len(reitti)) / 2 |
3 def abstract_sign(sign): |
4 def abstract_sign(sign): |
4 abstractions = { |
5 abstractions = { |
5 'Moikoinen': 'Hirvensalo', |
6 'Moikoinen': 'Hirvensalo', |
6 'Maanpää': 'Hirvensalo', |
7 'Maanpää': 'Hirvensalo', |
7 'Papinsaari': 'Hirvensalo', |
8 'Papinsaari': 'Hirvensalo', |
27 else: |
28 else: |
28 result.append(place) |
29 result.append(place) |
29 return result |
30 return result |
30 if not reitti: |
31 if not reitti: |
31 return '' |
32 return '' |
32 kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'} |
33 eksoalueet = { |
|
34 'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki', |
|
35 'Kaivopuisto', |
|
36 } |
33 replacements = { |
37 replacements = { |
34 "Ylioppilaskylä-Itä": "Ylioppilaskylä", |
38 "Ylioppilaskylä-Itä": "Ylioppilaskylä", |
35 "Ylioppilaskylä-Länsi": "Ylioppilaskylä", |
39 "Ylioppilaskylä-Länsi": "Ylioppilaskylä", |
36 "Caribia": "Ylioppilaskylä", |
40 "Caribia": "Ylioppilaskylä", |
37 "Jokila": "Lieto", |
41 "Jokila": "Lieto", |
120 helpot_supistukset = { |
128 helpot_supistukset = { |
121 'Raision keskusta': 'Raisio', |
129 'Raision keskusta': 'Raisio', |
122 'Ruskon keskusta': 'Rusko', |
130 'Ruskon keskusta': 'Rusko', |
123 'Naantalin keskusta': 'Naantali', |
131 'Naantalin keskusta': 'Naantali', |
124 'Kaarinan keskusta': 'Kaarina', |
132 'Kaarinan keskusta': 'Kaarina', |
125 'Liedon asemanseutu': 'Lieto as.', |
|
126 'Kauppakeskus Mylly': 'Mylly', |
133 'Kauppakeskus Mylly': 'Mylly', |
127 } |
134 } |
128 |
135 |
129 # jos ei nyt millään vaan mahdu muuten... |
136 # jos ei nyt millään vaan mahdu muuten... |
130 vakavat_supistukset = { |
137 vakavat_supistukset = { |
133 } |
140 } |
134 |
141 |
135 lähtö = reitti[0] |
142 lähtö = reitti[0] |
136 määränpää = reitti[-1] |
143 määränpää = reitti[-1] |
137 reitti_arvot = {} |
144 reitti_arvot = {} |
138 f = lambda i: i**-0.6 |
145 f = lambda i: i**-0.3 |
139 jakaja = max(f(i + 1) for i in range(len(reitti))) |
146 jakaja = max(f(i + 1) for i in range(len(reitti))) |
140 for i, pysäkki in enumerate(reitti): |
147 for i, pysäkki in enumerate(reitti): |
141 # muunna indeksi siten että myöhemmät alueet korostuvat |
148 # muunna indeksi siten että myöhemmät alueet korostuvat |
142 i = f(i + 1) / jakaja |
149 i = f(i + 1) / jakaja |
143 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
150 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
153 (pysäkki, reitti_arvot[pysäkki], i) \ |
160 (pysäkki, reitti_arvot[pysäkki], i) \ |
154 for i, pysäkki in enumerate(reitti) \ |
161 for i, pysäkki in enumerate(reitti) \ |
155 if reitti_arvot[pysäkki] >= 1 |
162 if reitti_arvot[pysäkki] >= 1 |
156 ], key = lambda pysäkki: -pysäkki[1]) |
163 ], key = lambda pysäkki: -pysäkki[1]) |
157 # enintään neljä tulee kylttiin |
164 # enintään neljä tulee kylttiin |
158 painot = painot[:4] |
165 painot = painot[:3] |
159 # jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois |
166 # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois |
160 if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5): |
167 try: |
161 del painot[3] |
168 if painot[2][0] != määränpää and painot[2][1] < (1000 / length ** 1.15): |
162 # sama kolmannelle |
169 del painot[2] |
163 if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5): |
170 except IndexError: |
164 del painot[2] |
171 pass |
165 if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (150 / len(reitti) ** 1.5): |
172 try: |
166 del painot[1] |
173 if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15): |
|
174 del painot[1] |
|
175 except IndexError: |
|
176 pass |
167 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin |
177 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin |
168 painot = sorted(painot, key = lambda paino: paino[2]) |
178 painot = sorted(painot, key = lambda paino: paino[2]) |
169 # muodostetaan kyltti.. |
179 # muodostetaan kyltti.. |
170 kyltti = [paino[0] for paino in painot] |
180 kyltti = [paino[0] for paino in painot] |
171 kyltti = abstract_sign(kyltti) |
181 #kyltti = abstract_sign(kyltti) |
172 # supista nimet jos mahdollista |
182 # supista nimet jos mahdollista |
173 def viimeistele(kyltti, supistus_taso = 0): |
183 def viimeistele(kyltti, supistus_taso = 0): |
174 if supistus_taso > 0: |
184 if supistus_taso > 0: |
175 kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] |
185 kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] |
176 if supistus_taso > 1: |
186 if supistus_taso > 1: |
177 kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] |
187 kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] |
178 return kyltti |
188 return kyltti |
179 tulos = viimeistele(kyltti) |
189 tulos = viimeistele(kyltti) |
|
190 for i in range(len(kyltti) - 1): |
|
191 if kyltti[i + 1].startswith(kyltti[i]): |
|
192 del kyltti[i] |
180 if len(' - '.join(kyltti)) > 20: |
193 if len(' - '.join(kyltti)) > 20: |
181 tulos = viimeistele(kyltti, supistus_taso = 1) |
194 tulos = viimeistele(kyltti, supistus_taso = 1) |
182 if len(' - '.join(kyltti)) > 70: |
195 if len(' - '.join(kyltti)) > 70: |
183 tulos = viimeistele(kyltti, supistus_taso = 2) |
196 tulos = viimeistele(kyltti, supistus_taso = 2) |
184 if kokonainen: |
197 if kokonainen: |
185 tulos = [lähtö] + tulos |
198 tulos = [lähtö] + tulos |
186 lyhyt_lähtö = replacements.get(lähtö, lähtö) |
199 lyhyt_lähtö = replacements.get(lähtö, lähtö) |
187 if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}: |
200 if lyhyt_lähtö != tulos[-1] and helpot_supistukset.get(lyhyt_lähtö, lyhyt_lähtö) in eksoalueet | {'Kauppatori'} and tulos[-1] in eksoalueet | {'Kauppatori'}: |
188 tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] |
201 tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] |
189 return tulos |
202 return tulos |