busroute.py

changeset 22
3d094a804af8
parent 21
6a0394d5a159
child 24
e6bdb9c54096
equal deleted inserted replaced
21:6a0394d5a159 22:3d094a804af8
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",
39 'Saaro': 'Ruissalo', 43 'Saaro': 'Ruissalo',
40 'Silvola': 'Vahto', 44 'Silvola': 'Vahto',
41 'Hemmola': 'Vahto', 45 'Hemmola': 'Vahto',
42 'Paasniittu': 'Ruskon keskusta', 46 'Paasniittu': 'Ruskon keskusta',
43 'Kahari': 'Ruskon keskusta', 47 'Kahari': 'Ruskon keskusta',
48 'Kemiö': 'Kemiönsaari',
49 'Kasnäs': 'Kemiönsaari',
44 } 50 }
45 have_already = set() 51 have_already = set()
46 i = 0 52 i = 0
47 while i < len(reitti): 53 while i < len(reitti):
48 if reitti[i] in replacements: 54 if reitti[i] in replacements:
54 i += 1 60 i += 1
55 prioriteetit = { 61 prioriteetit = {
56 'Ihala': 150, 62 'Ihala': 150,
57 'Kauppakeskus Mylly': 200, 63 'Kauppakeskus Mylly': 200,
58 'Kuninkoja': 80, 64 'Kuninkoja': 80,
59 'Moikoinen': 50, 65 'Moikoinen': 35,
60 'Raision keskusta': 100, 66 'Raision keskusta': 100,
61 'Friskala': 20, 67 'Friskala': 20,
62 'Kukola': 50, 68 'Kukola': 50,
63 'Kaistarniemi': 50, 69 'Kaistarniemi': 50,
64 'Papinsaari': 50, 70 'Papinsaari': 50,
79 'Kupittaa': 70, 85 'Kupittaa': 70,
80 'Kauppatori': 1e15, 86 'Kauppatori': 1e15,
81 'Lentoasema': 50, 87 'Lentoasema': 50,
82 'Runosmäki': 50, 88 'Runosmäki': 50,
83 'Lieto': 100, 89 'Lieto': 100,
84 'Liedon asemanseutu': 200, 90 'Lieto as': 200,
85 'Ilmarinen': 50, 91 'Ilmarinen': 50,
86 'Vahto': 50, 92 'Vahto': 50,
87 'Ruskon keskusta': 200, 93 'Ruskon keskusta': 200,
88 'Oriketo': 30, 94 'Oriketo': 30,
89 'Harittu': 40, 95 'Harittu': 40,
107 'Suikkila': 50, 113 'Suikkila': 50,
108 'Raunistula': 50, 114 'Raunistula': 50,
109 'Räntämäki': 50, 115 'Räntämäki': 50,
110 'Moisio': 25, 116 'Moisio': 25,
111 'Pääskyvuori': 100, 117 'Pääskyvuori': 100,
112 'Rautatieasema': 100, 118 'Rautatieasema': 50,
113 'Rymättylä': 50, 119 'Rymättylä': 50,
120 "Sauvo": 500,
121 "Kemiönsaari": 500,
114 } 122 }
115 123
116 if 'Kauppatori' not in reitti: 124 if 'Kauppatori' not in reitti:
117 prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] 125 prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori']
118 126
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

mercurial