Thu, 26 Oct 2017 16:54:29 +0300
Remove assumptions and added some api stuff
#!/usr/bin/env python3 from configparser import ConfigParser from math import inf replacements = { "ylioppilaskylä-itä": "ylioppilaskylä", "ylioppilaskylä-länsi": "ylioppilaskylä", "jokila": "lieto", "piispala": "lieto", 'saaro': 'ruissalo', 'silvola': 'vahto', 'hemmola': 'vahto', 'paasniittu': 'rusko', 'kahari': 'rusko', 'kemiö': 'kemiönsaari', 'kasnäs': 'kemiönsaari', 'pernon telakka': 'perno', 'paimion sairaala': 'paimio', 'hanhijoki': 'paimio', } region_info = ConfigParser() region_info.read('regions.ini') municipalities = set(region_info.sections()) municipalities_per_region = {} for municipality in municipalities: for region in region_info[municipality].keys(): municipalities_per_region[region] = municipality for place_from, place_to in replacements.items(): municipalities_per_region[place_to] = municipalities_per_region[place_from] def simplify_name(name): name = replacements.get(name, name) return name def reduce_schedule(route, trip_length, whole = False, long = False): length = ((trip_length / 600) * 3 + len(route) * 2) / 5 if not route: return '' have_already = set() i = 0 while i < len(route): if route[i] in replacements: route[i] = replacements[route[i]] if route[i] in have_already: del route[i] else: have_already.add(route[i]) i += 1 priorities = { 'ihala': 150, 'mylly': 200, 'kuninkoja': 150, 'moikoinen': 100, 'raisio': 150, 'kukola': 50, 'kaistarniemi': 75, 'papinsaari': 80, 'oriniemi': 50, 'pikisaari': 50, 'häppilä': 20, 'haarla': 80, 'ylioppilaskylä': 50, 'halinen': 70, 'kakskerta': 200, 'pansio': 50, 'räntämäki': 25, 'verkahovi': 25, 'skanssi': 200, 'vaala': 20, 'varissuo': 60, 'kohmo': 80, 'kupittaa': 70, 'kupittaa as': 120, 'kauppatori': inf, 'lentoasema': 50, 'runosmäki': 50, 'lieto': 100, 'lieto as': 200, 'ilmarinen': 50, 'vahto': 50, 'rusko': 200, 'oriketo': 50, 'harittu': 40, 'jäkärlä': 150, 'moisio': 150, 'paattinen': 25, 'kaarina': 200, 'naantali': 200, 'uittamo': 50, 'piikkiö': 100, 'paimio': 100, 'pargas': 100, 'nagu': 100, 'yli-maaria': 60, 'saramäki': 50, 'tarvasjoki': 100, 'marttila': 100, 'koski tl': 100, 'katariina': 50, 'länsikeskus': 30, 'kaanaa': 100, 'satava': 50, 'suikkila': 50, 'raunistula': 50, 'räntämäki': 50, 'pääskyvuori': 100, 'logomo': 100, 'rymättylä': 50, "sauvo": 500, "kemiönsaari": 500, 'suovuori': 300, 'eerikvalla': 50, 'petäsmäki': 50, 'tortinmäki': 50, 'aura': 100, 'friskala': -1, 'merimasku': 50, 'turkuhalli': 100, 'messukeskus': 100, 'naantalin pikatie': 25, 'helsingin valtatie': 25, 'lauste': 25, 'pompo': 25, 'loukinainen': 25, 'tuorla': 25, 'satakunnantie': 25, 'hepokulta': 25, 'nättinummi': 25, 'nummenmäki': 10, 'kurala': 10, 'itäharju': 25, 'vasaramäki': 25, 'pohjola': 25, 'iso-heikkilä': 25, 'patterinhaka': 25, 'illoinen': 50, 'luolavuori': 25, 'mäntymäki': 25, 'kurjenmäki': 25, 'kuusisto': 25, 'rautatieasema': 25, 'majakkaranta': 25, 'itäranta': 25, 'martti': 25, 'vähä-heikkilä': 25, 'särkilahti': 25, 'urusvuori': 25, 'port arthur': 25, } if 'kauppatori' not in route: priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] from_place = route[0] destination = route[-1] reitti_arvot = {} f = lambda i: i**-0.3 factor = 1 / max(f(i + 1) for i in range(len(route))) while priorities.get(route[-1], 0) < 0: del route[-1] destination = route[-1] for i, stop in enumerate(route): # muunna indeksi siten että myöhemmät alueet korostuvat i = f(i + 1) * factor # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset i *= priorities.get(stop, 1) reitti_arvot[stop] = i # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin 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(route) \ if reitti_arvot[stop] >= 1 ], key = lambda stop: -stop[1]) if long: weights = weights[:4] else: # enintään neljä tulee kylttiin weights = weights[:3] # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois try: if weights[2][0] != destination and weights[2][1] < (725 / length ** 0.8): del weights[2] except IndexError: pass try: 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 sign tulee oikeinpäin weights = sorted(weights, key = lambda weight_data: weight_data[2]) # muodostetaan sign.. sign = [paino[0] for paino in weights] to_place = sign[-1] #nearby_municipalities = {'Turku', 'Raisio', 'Naantali', 'Kaarina', 'Lieto'} #if from_place != to_place: # municipality_from = municipalities_per_region.get(from_place) # municipality_to = municipalities_per_region.get(to_place) # if municipality_from and municipality_to and municipality_from not in nearby_municipalities | {municipality_to} and municipality_to not in nearby_municipalities: # def convert_region(region): # municipality = municipalities_per_region.get(region, region) # if municipality != municipality_from: # return municipality # else: # return region # sign = [convert_region(region) for region in sign] old_sign = sign.copy() sign = [] for place in old_sign: if place not in sign: sign.append(place) if whole: sign = [from_place] + sign if not sign: sign = [destination] return sign