busroute.py

changeset 24
e6bdb9c54096
parent 22
3d094a804af8
child 27
f89504285945
equal deleted inserted replaced
23:3a495bc4b7b5 24:e6bdb9c54096
1 #!/usr/bin/env python3 1 #!/usr/bin/env python3
2 def supista_reitti(reitti, ajomatka, kokonainen = False): 2 def reduce_schedule(reitti, trip_length, whole = False):
3 length = ((ajomatka / 600) + len(reitti)) / 2 3 length = ((trip_length / 600) + len(reitti)) / 2
4 def abstract_sign(sign): 4 def abstract_sign(sign):
5 abstractions = { 5 abstractions = {
6 'Moikoinen': 'Hirvensalo', 6 'Moikoinen': 'Hirvensalo',
7 'Maanpää': 'Hirvensalo', 7 'Maanpää': 'Hirvensalo',
8 'Papinsaari': 'Hirvensalo', 8 'Papinsaari': 'Hirvensalo',
56 if reitti[i] in have_already: 56 if reitti[i] in have_already:
57 del reitti[i] 57 del reitti[i]
58 else: 58 else:
59 have_already.add(reitti[i]) 59 have_already.add(reitti[i])
60 i += 1 60 i += 1
61 prioriteetit = { 61 priorities = {
62 'Ihala': 150, 62 'Ihala': 150,
63 'Kauppakeskus Mylly': 200, 63 'Kauppakeskus Mylly': 200,
64 'Kuninkoja': 80, 64 'Kuninkoja': 80,
65 'Moikoinen': 35, 65 'Moikoinen': 35,
66 'Raision keskusta': 100, 66 'Raision keskusta': 100,
120 "Sauvo": 500, 120 "Sauvo": 500,
121 "Kemiönsaari": 500, 121 "Kemiönsaari": 500,
122 } 122 }
123 123
124 if 'Kauppatori' not in reitti: 124 if 'Kauppatori' not in reitti:
125 prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] 125 priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori']
126 126
127 # nimiä joista voidaan joustaa tarvittaessa 127 # nimiä joista voidaan joustaa tarvittaessa
128 helpot_supistukset = { 128 abbreviations = {
129 'Raision keskusta': 'Raisio', 129 'Raision keskusta': 'Raisio',
130 'Ruskon keskusta': 'Rusko', 130 'Ruskon keskusta': 'Rusko',
131 'Naantalin keskusta': 'Naantali', 131 'Naantalin keskusta': 'Naantali',
132 'Kaarinan keskusta': 'Kaarina', 132 'Kaarinan keskusta': 'Kaarina',
133 'Kauppakeskus Mylly': 'Mylly', 133 'Kauppakeskus Mylly': 'Mylly',
134 } 134 }
135 135
136 # jos ei nyt millään vaan mahdu muuten... 136 from_place = reitti[0]
137 vakavat_supistukset = { 137 destination = reitti[-1]
138 'Kauppatori': 'Tori',
139 'Ylioppilaskylä': 'Yo-kylä',
140 }
141
142 lähtö = reitti[0]
143 määränpää = reitti[-1]
144 reitti_arvot = {} 138 reitti_arvot = {}
145 f = lambda i: i**-0.3 139 f = lambda i: i**-0.3
146 jakaja = max(f(i + 1) for i in range(len(reitti))) 140 factor = 1 / max(f(i + 1) for i in range(len(reitti)))
147 for i, pysäkki in enumerate(reitti): 141 for i, stop in enumerate(reitti):
148 # muunna indeksi siten että myöhemmät alueet korostuvat 142 # muunna indeksi siten että myöhemmät alueet korostuvat
149 i = f(i + 1) / jakaja 143 i = f(i + 1) * factor
150 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset 144 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
151 i *= prioriteetit.get(pysäkki, 1) 145 i *= priorities.get(stop, 1)
152 reitti_arvot[pysäkki] = i 146 reitti_arvot[stop] = i
153 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin 147 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
154 if lähtö in reitti_arvot: 148 if from_place in reitti_arvot:
155 reitti_arvot[lähtö] = 0 149 reitti_arvot[from_place] = 0
156 # varmista että määränpää tulee kylttiin 150 # varmista että destination tulee kylttiin
157 reitti_arvot[määränpää] = 1e10 151 reitti_arvot[destination] = 1e10
158 # muodosta kyltti-tiedot järjestettynä reittiarvon mukaan 152 # muodosta sign-tiedot järjestettynä reittiarvon mukaan
159 painot = sorted([ 153 weights = sorted([
160 (pysäkki, reitti_arvot[pysäkki], i) \ 154 (stop, reitti_arvot[stop], i) \
161 for i, pysäkki in enumerate(reitti) \ 155 for i, stop in enumerate(reitti) \
162 if reitti_arvot[pysäkki] >= 1 156 if reitti_arvot[stop] >= 1
163 ], key = lambda pysäkki: -pysäkki[1]) 157 ], key = lambda stop: -stop[1])
164 # enintään neljä tulee kylttiin 158 # enintään neljä tulee kylttiin
165 painot = painot[:3] 159 weights = weights[:3]
166 # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois 160 # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois
167 try: 161 try:
168 if painot[2][0] != määränpää and painot[2][1] < (1000 / length ** 1.15): 162 if weights[2][0] != destination and weights[2][1] < (1000 / length ** 1.15):
169 del painot[2] 163 del weights[2]
170 except IndexError: 164 except IndexError:
171 pass 165 pass
172 try: 166 try:
173 if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15): 167 if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15):
174 del painot[1] 168 del weights[1]
175 except IndexError: 169 except IndexError:
176 pass 170 pass
177 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin 171 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin
178 painot = sorted(painot, key = lambda paino: paino[2]) 172 weights = sorted(weights, key = lambda paino: paino[2])
179 # muodostetaan kyltti.. 173 # muodostetaan sign..
180 kyltti = [paino[0] for paino in painot] 174 sign = [paino[0] for paino in weights]
181 #kyltti = abstract_sign(kyltti) 175 #sign = abstract_sign(sign)
182 # supista nimet jos mahdollista 176 # supista nimet jos mahdollista
183 def viimeistele(kyltti, supistus_taso = 0): 177 def finalise(sign, abbreviation_level = 0):
184 if supistus_taso > 0: 178 if abbreviation_level > 0:
185 kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] 179 sign = [abbreviations.get(paikka, paikka) for paikka in sign]
186 if supistus_taso > 1: 180 return sign
187 kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] 181 result = finalise(sign)
188 return kyltti 182 for i in range(len(sign) - 1):
189 tulos = viimeistele(kyltti) 183 if sign[i + 1].startswith(sign[i]):
190 for i in range(len(kyltti) - 1): 184 del sign[i]
191 if kyltti[i + 1].startswith(kyltti[i]): 185 if len(' - '.join(sign)) > 20:
192 del kyltti[i] 186 result = finalise(sign, abbreviation_level = 1)
193 if len(' - '.join(kyltti)) > 20: 187 if whole:
194 tulos = viimeistele(kyltti, supistus_taso = 1) 188 result = [from_place] + result
195 if len(' - '.join(kyltti)) > 70: 189 short_from_place = replacements.get(from_place, from_place)
196 tulos = viimeistele(kyltti, supistus_taso = 2) 190 if (
197 if kokonainen: 191 short_from_place != result[-1]
198 tulos = [lähtö] + tulos 192 and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'}
199 lyhyt_lähtö = replacements.get(lähtö, lähtö) 193 and result[-1] in eksoalueet | {'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'}: 194 ):
201 tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] 195 result = ['Turku' if k == 'Kauppatori' else k for k in result]
202 return tulos 196 return result

mercurial