--- a/busroute.py Tue Jun 20 09:39:42 2017 +0300 +++ b/busroute.py Tue Jun 20 10:27:52 2017 +0300 @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -def supista_reitti(reitti, ajomatka, kokonainen = False): - length = ((ajomatka / 600) + len(reitti)) / 2 +def reduce_schedule(reitti, trip_length, whole = False): + length = ((trip_length / 600) + len(reitti)) / 2 def abstract_sign(sign): abstractions = { 'Moikoinen': 'Hirvensalo', @@ -58,7 +58,7 @@ else: have_already.add(reitti[i]) i += 1 - prioriteetit = { + priorities = { 'Ihala': 150, 'Kauppakeskus Mylly': 200, 'Kuninkoja': 80, @@ -122,10 +122,10 @@ } if 'Kauppatori' not in reitti: - prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori'] + priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori'] # nimiä joista voidaan joustaa tarvittaessa - helpot_supistukset = { + abbreviations = { 'Raision keskusta': 'Raisio', 'Ruskon keskusta': 'Rusko', 'Naantalin keskusta': 'Naantali', @@ -133,70 +133,64 @@ 'Kauppakeskus Mylly': 'Mylly', } - # jos ei nyt millään vaan mahdu muuten... - vakavat_supistukset = { - 'Kauppatori': 'Tori', - 'Ylioppilaskylä': 'Yo-kylä', - } - - lähtö = reitti[0] - määränpää = reitti[-1] + from_place = reitti[0] + destination = reitti[-1] reitti_arvot = {} f = lambda i: i**-0.3 - jakaja = max(f(i + 1) for i in range(len(reitti))) - for i, pysäkki in enumerate(reitti): + factor = 1 / max(f(i + 1) for i in range(len(reitti))) + for i, stop in enumerate(reitti): # muunna indeksi siten että myöhemmät alueet korostuvat - i = f(i + 1) / jakaja + i = f(i + 1) * factor # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset - i *= prioriteetit.get(pysäkki, 1) - reitti_arvot[pysäkki] = i + i *= priorities.get(stop, 1) + reitti_arvot[stop] = i # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin - if lähtö in reitti_arvot: - reitti_arvot[lähtö] = 0 - # varmista että määränpää tulee kylttiin - reitti_arvot[määränpää] = 1e10 - # muodosta kyltti-tiedot järjestettynä reittiarvon mukaan - painot = sorted([ - (pysäkki, reitti_arvot[pysäkki], i) \ - for i, pysäkki in enumerate(reitti) \ - if reitti_arvot[pysäkki] >= 1 - ], key = lambda pysäkki: -pysäkki[1]) + if from_place in reitti_arvot: + reitti_arvot[from_place] = 0 + # varmista että destination tulee kylttiin + reitti_arvot[destination] = 1e10 + # muodosta sign-tiedot järjestettynä reittiarvon mukaan + weights = sorted([ + (stop, reitti_arvot[stop], i) \ + for i, stop in enumerate(reitti) \ + if reitti_arvot[stop] >= 1 + ], key = lambda stop: -stop[1]) # enintään neljä tulee kylttiin - painot = painot[:3] + weights = weights[:3] # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois try: - if painot[2][0] != määränpää and painot[2][1] < (1000 / length ** 1.15): - del painot[2] + if weights[2][0] != destination and weights[2][1] < (1000 / length ** 1.15): + del weights[2] except IndexError: pass try: - if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15): - del painot[1] + if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15): + del weights[1] except IndexError: pass - # lajitellaan painoarvot uudestaan reittijärjestykseen jotta kyltti tulee oikeinpäin - painot = sorted(painot, key = lambda paino: paino[2]) - # muodostetaan kyltti.. - kyltti = [paino[0] for paino in painot] - #kyltti = abstract_sign(kyltti) + # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin + weights = sorted(weights, key = lambda paino: paino[2]) + # muodostetaan sign.. + sign = [paino[0] for paino in weights] + #sign = abstract_sign(sign) # supista nimet jos mahdollista - def viimeistele(kyltti, supistus_taso = 0): - if supistus_taso > 0: - kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti] - if supistus_taso > 1: - kyltti = [vakavat_supistukset.get(paikka, paikka) for paikka in kyltti] - return kyltti - tulos = viimeistele(kyltti) - for i in range(len(kyltti) - 1): - if kyltti[i + 1].startswith(kyltti[i]): - del kyltti[i] - if len(' - '.join(kyltti)) > 20: - tulos = viimeistele(kyltti, supistus_taso = 1) - if len(' - '.join(kyltti)) > 70: - tulos = viimeistele(kyltti, supistus_taso = 2) - if kokonainen: - tulos = [lähtö] + tulos - lyhyt_lähtö = replacements.get(lähtö, lähtö) - 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'}: - tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos] - return tulos + def finalise(sign, abbreviation_level = 0): + if abbreviation_level > 0: + sign = [abbreviations.get(paikka, paikka) for paikka in sign] + return sign + result = finalise(sign) + for i in range(len(sign) - 1): + if sign[i + 1].startswith(sign[i]): + del sign[i] + if len(' - '.join(sign)) > 20: + result = finalise(sign, abbreviation_level = 1) + if whole: + result = [from_place] + result + short_from_place = replacements.get(from_place, from_place) + if ( + short_from_place != result[-1] + and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'} + and result[-1] in eksoalueet | {'Kauppatori'} + ): + result = ['Turku' if k == 'Kauppatori' else k for k in result] + return result