busroute.py

changeset 72
65408ed066b3
parent 71
d2e19670b772
child 75
4f8a67d5d79e
equal deleted inserted replaced
71:d2e19670b772 72:65408ed066b3
1 #!/usr/bin/env python3 1 #!/usr/bin/env python3
2 2
3 from configparser import ConfigParser 3 from configparser import ConfigParser
4 from math import inf 4 from math import inf
5 5 from misc import profile
6 replacements = {
7 "ylioppilaskylä-itä": "ylioppilaskylä",
8 "ylioppilaskylä-länsi": "ylioppilaskylä",
9 "jokila": "lieto",
10 "piispala": "lieto",
11 'saaro': 'ruissalo',
12 'silvola': 'vahto',
13 'hemmola': 'vahto',
14 'paasniittu': 'rusko',
15 'kahari': 'rusko',
16 'kemiö': 'kemiönsaari',
17 'kasnäs': 'kemiönsaari',
18 'pernon telakka': 'perno',
19 'paimion sairaala': 'paimio',
20 'hanhijoki': 'paimio',
21 }
22
23 region_info = ConfigParser() 6 region_info = ConfigParser()
24 region_info.read('regions.ini') 7 region_info.read('regions.ini')
25 municipalities = set(region_info.sections())
26 municipalities_per_region = {}
27
28 for municipality in municipalities:
29 for region in region_info[municipality].keys():
30 municipalities_per_region[region] = municipality
31
32 for place_from, place_to in replacements.items():
33 municipalities_per_region[place_to] = municipalities_per_region[place_from]
34 8
35 def simplify_name(name): 9 def simplify_name(name):
36 name = replacements.get(name, name) 10 name = profile['replacements'].get(name, name)
37 return name 11 return name
38 12
39 def reduce_schedule(route, trip_length, whole = False, long = False): 13 def reduce_schedule(route, trip_length, whole = False, long = False):
14 priorities = profile['priorities']
40 length = ((trip_length / 600) * 3 + len(route) * 2) / 5 15 length = ((trip_length / 600) * 3 + len(route) * 2) / 5
41 if not route: 16 if not route:
42 return '' 17 return ''
43 have_already = set() 18 have_already = set()
44 i = 0 19 i = 0
45 while i < len(route): 20 while i < len(route):
46 if route[i] in replacements: 21 if route[i] in profile['replacements']:
47 route[i] = replacements[route[i]] 22 route[i] = profile['replacements'][route[i]]
48 if route[i] in have_already: 23 if route[i] in have_already:
49 del route[i] 24 del route[i]
50 else: 25 else:
51 have_already.add(route[i]) 26 have_already.add(route[i])
52 i += 1 27 i += 1
53 priorities = {
54 'ihala': 150,
55 'mylly': 200,
56 'kuninkoja': 150,
57 'moikoinen': 100,
58 'raisio': 150,
59 'kukola': 50,
60 'kaistarniemi': 75,
61 'papinsaari': 80,
62 'oriniemi': 50,
63 'pikisaari': 50,
64 'häppilä': 20,
65 'haarla': 80,
66 'ylioppilaskylä': 50,
67 'halinen': 70,
68 'kakskerta': 200,
69 'pansio': 50,
70 'räntämäki': 25,
71 'verkahovi': 25,
72 'skanssi': 200,
73 'vaala': 20,
74 'varissuo': 60,
75 'kohmo': 80,
76 'kupittaa': 70,
77 'kupittaa as': 120,
78 'kauppatori': inf,
79 'lentoasema': 50,
80 'runosmäki': 50,
81 'lieto': 100,
82 'lieto as': 200,
83 'ilmarinen': 50,
84 'vahto': 50,
85 'rusko': 200,
86 'oriketo': 50,
87 'harittu': 40,
88 'jäkärlä': 150,
89 'moisio': 150,
90 'paattinen': 25,
91 'kaarina': 200,
92 'naantali': 200,
93 'uittamo': 50,
94 'piikkiö': 100,
95 'paimio': 100,
96 'pargas': 100,
97 'nagu': 100,
98 'yli-maaria': 60,
99 'saramäki': 50,
100 'tarvasjoki': 100,
101 'marttila': 100,
102 'koski tl': 100,
103 'katariina': 50,
104 'länsikeskus': 30,
105 'kaanaa': 100,
106 'satava': 50,
107 'suikkila': 50,
108 'raunistula': 50,
109 'räntämäki': 50,
110 'pääskyvuori': 100,
111 'logomo': 100,
112 'rymättylä': 50,
113 "sauvo": 500,
114 "kemiönsaari": 500,
115 'suovuori': 300,
116 'eerikvalla': 50,
117 'petäsmäki': 50,
118 'tortinmäki': 50,
119 'aura': 100,
120 'friskala': -1,
121 'merimasku': 50,
122 'turkuhalli': 100,
123 'messukeskus': 100,
124 'naantalin pikatie': 25,
125 'helsingin valtatie': 25,
126 'lauste': 25,
127 'pompo': 25,
128 'loukinainen': 25,
129 'tuorla': 25,
130 'satakunnantie': 25,
131 'hepokulta': 25,
132 'nättinummi': 25,
133 'nummenmäki': 10,
134 'kurala': 10,
135 'itäharju': 25,
136 'vasaramäki': 25,
137 'pohjola': 25,
138 'iso-heikkilä': 25,
139 'patterinhaka': 25,
140 'illoinen': 50,
141 'luolavuori': 25,
142 'mäntymäki': 25,
143 'kurjenmäki': 25,
144 'kuusisto': 25,
145 'rautatieasema': 25,
146 'majakkaranta': 25,
147 'itäranta': 25,
148 'martti': 25,
149 'vähä-heikkilä': 25,
150 'särkilahti': 25,
151 'urusvuori': 25,
152 'port arthur': 25,
153 }
154 28
155 if 'kauppatori' not in route: 29 # if 'kauppatori' not in route:
156 priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] 30 # priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori']
157 31
158 from_place = route[0] 32 from_place = route[0]
159 destination = route[-1] 33 destination = route[-1]
160 reitti_arvot = {} 34 reitti_arvot = {}
161 f = lambda i: i**-0.3 35 f = lambda i: i**-0.3
162 factor = 1 / max(f(i + 1) for i in range(len(route))) 36 factor = 1 / max(f(i + 1) for i in range(len(route)))
163 while priorities.get(route[-1], 0) < 0: 37 while float(priorities.get(route[-1], 0)) < 0:
164 del route[-1] 38 del route[-1]
165 destination = route[-1] 39 destination = route[-1]
166 for i, stop in enumerate(route): 40 for i, stop in enumerate(route):
167 # muunna indeksi siten että myöhemmät alueet korostuvat 41 # muunna indeksi siten että myöhemmät alueet korostuvat
168 i = f(i + 1) * factor 42 i = f(i + 1) * factor
169 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset 43 # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
170 i *= priorities.get(stop, 1) 44 i *= float(priorities.get(stop, 1))
171 reitti_arvot[stop] = i 45 reitti_arvot[stop] = i
172 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin 46 # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
173 if from_place in reitti_arvot: 47 if from_place in reitti_arvot:
174 reitti_arvot[from_place] = 0 48 reitti_arvot[from_place] = 0
175 # varmista että destination tulee kylttiin 49 # varmista että destination tulee kylttiin
199 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin 73 # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin
200 weights = sorted(weights, key = lambda weight_data: weight_data[2]) 74 weights = sorted(weights, key = lambda weight_data: weight_data[2])
201 # muodostetaan sign.. 75 # muodostetaan sign..
202 sign = [paino[0] for paino in weights] 76 sign = [paino[0] for paino in weights]
203 to_place = sign[-1] 77 to_place = sign[-1]
204 #nearby_municipalities = {'Turku', 'Raisio', 'Naantali', 'Kaarina', 'Lieto'}
205 #if from_place != to_place:
206 # municipality_from = municipalities_per_region.get(from_place)
207 # municipality_to = municipalities_per_region.get(to_place)
208 # if municipality_from and municipality_to and municipality_from not in nearby_municipalities | {municipality_to} and municipality_to not in nearby_municipalities:
209 # def convert_region(region):
210 # municipality = municipalities_per_region.get(region, region)
211 # if municipality != municipality_from:
212 # return municipality
213 # else:
214 # return region
215 # sign = [convert_region(region) for region in sign]
216 old_sign = sign.copy() 78 old_sign = sign.copy()
217 sign = [] 79 sign = []
218 for place in old_sign: 80 for place in old_sign:
219 if place not in sign: 81 if place not in sign:
220 sign.append(place) 82 sign.append(place)

mercurial