Thu, 31 Aug 2017 21:30:34 +0300
Hups
5 | 1 | #!/usr/bin/env python3 |
27 | 2 | |
52 | 3 | from configparser import ConfigParser |
4 | ||
27 | 5 | replacements = { |
52 | 6 | "ylioppilaskylä-itä": "ylioppilaskylä", |
7 | "ylioppilaskylä-länsi": "ylioppilaskylä", | |
8 | "jokila": "lieto", | |
9 | "piispala": "lieto", | |
10 | 'saaro': 'ruissalo', | |
11 | 'silvola': 'vahto', | |
12 | 'hemmola': 'vahto', | |
13 | 'paasniittu': 'ruskon keskusta', | |
14 | 'kahari': 'ruskon keskusta', | |
15 | 'kemiö': 'kemiönsaari', | |
16 | 'kasnäs': 'kemiönsaari', | |
17 | 'pernon telakka': 'perno', | |
27 | 18 | } |
19 | ||
20 | # nimiä joista voidaan joustaa tarvittaessa | |
21 | abbreviations = { | |
52 | 22 | 'raision keskusta': 'raisio', |
23 | 'ruskon keskusta': 'rusko', | |
24 | 'naantalin keskusta': 'naantali', | |
25 | 'kaarinan keskusta': 'kaarina', | |
26 | 'kauppakeskus mylly': 'mylly', | |
27 | 27 | } |
28 | ||
52 | 29 | region_info = ConfigParser() |
30 | region_info.read('regions.ini') | |
31 | municipalities = set(region_info.sections()) | |
32 | municipalities_per_region = {} | |
33 | ||
34 | for municipality in municipalities: | |
35 | for region in region_info[municipality].keys(): | |
36 | municipalities_per_region[region] = municipality | |
37 | ||
38 | for place_from, place_to in replacements.items(): | |
39 | municipalities_per_region[place_to] = municipalities_per_region[place_from] | |
40 | ||
27 | 41 | def simplify_name(name): |
42 | name = replacements.get(name, name) | |
43 | name = abbreviations.get(name, name) | |
44 | return name | |
45 | ||
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
46 | def reduce_schedule(reitti, trip_length, whole = False): |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
47 | length = ((trip_length / 600) + len(reitti)) / 2 |
5 | 48 | if not reitti: |
49 | return '' | |
50 | have_already = set() | |
51 | i = 0 | |
52 | while i < len(reitti): | |
53 | if reitti[i] in replacements: | |
54 | reitti[i] = replacements[reitti[i]] | |
55 | if reitti[i] in have_already: | |
56 | del reitti[i] | |
57 | else: | |
58 | have_already.add(reitti[i]) | |
59 | i += 1 | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
60 | priorities = { |
52 | 61 | 'ihala': 150, |
62 | 'kauppakeskus mylly': 200, | |
63 | 'kuninkoja': 80, | |
64 | 'moikoinen': 80, | |
65 | 'raision keskusta': 150, | |
66 | 'kukola': 50, | |
67 | 'kaistarniemi': 50, | |
68 | 'papinsaari': 50, | |
69 | 'oriniemi': 50, | |
70 | 'pikisaari': 50, | |
71 | 'häppilä': 20, | |
72 | 'haarla': 80, | |
73 | 'ylioppilaskylä': 50, | |
74 | 'halinen': 70, | |
75 | 'kakskerta': 200, | |
76 | 'pansio': 50, | |
77 | 'räntämäki': 10, | |
78 | 'verkahovi': 20, | |
79 | 'skanssi': 200, | |
80 | 'vaala': 20, | |
81 | 'varissuo': 60, | |
82 | 'kohmo': 80, | |
83 | 'kupittaa': 70, | |
84 | 'kauppatori': 1e15, | |
85 | 'lentoasema': 50, | |
86 | 'runosmäki': 50, | |
87 | 'lieto': 100, | |
88 | 'lieto as': 200, | |
89 | 'ilmarinen': 50, | |
90 | 'vahto': 50, | |
91 | 'ruskon keskusta': 200, | |
92 | 'oriketo': 50, | |
93 | 'harittu': 40, | |
94 | 'jäkärlä': 50, | |
95 | 'paattinen': 100, | |
96 | 'kaarinan keskusta': 200, | |
97 | 'naantalin keskusta': 200, | |
98 | 'uittamo': 50, | |
99 | 'piikkiö': 100, | |
100 | 'paimio': 100, | |
101 | 'pargas': 100, | |
102 | 'nagu': 100, | |
103 | 'yli-maaria': 70, | |
104 | 'saramäki': 50, | |
105 | 'tarvasjoki': 100, | |
106 | 'marttila': 100, | |
107 | 'koski tl': 100, | |
108 | 'katariina': 50, | |
109 | 'länsikeskus': 50, | |
110 | 'kaanaa': 100, | |
111 | 'satava': 50, | |
112 | 'suikkila': 50, | |
113 | 'raunistula': 50, | |
114 | 'räntämäki': 50, | |
115 | 'moisio': 25, | |
116 | 'pääskyvuori': 100, | |
53 | 117 | #'rautatieasema': 50, |
52 | 118 | 'logomo': 100, |
119 | 'rymättylä': 50, | |
120 | "sauvo": 500, | |
121 | "kemiönsaari": 500, | |
122 | 'suovuori': 300, | |
123 | 'eerikvalla': 50, | |
124 | 'petäsmäki': 50, | |
125 | 'tortinmäki': 50, | |
126 | 'aura': 100, | |
127 | 'friskala': -1, | |
128 | 'merimasku': 50, | |
53 | 129 | 'turkuhalli': 100, |
130 | 'messukeskus': 100, | |
5 | 131 | } |
132 | ||
52 | 133 | if 'kauppatori' not in reitti: |
134 | priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] | |
5 | 135 | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
136 | from_place = reitti[0] |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
137 | destination = reitti[-1] |
5 | 138 | reitti_arvot = {} |
22 | 139 | f = lambda i: i**-0.3 |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
140 | factor = 1 / max(f(i + 1) for i in range(len(reitti))) |
45
ddf7c58091ef
Ota se friskala pois kyltistä
Teemu Piippo <teemu@hecknology.net>
parents:
44
diff
changeset
|
141 | while priorities.get(reitti[-1], 0) < 0: |
ddf7c58091ef
Ota se friskala pois kyltistä
Teemu Piippo <teemu@hecknology.net>
parents:
44
diff
changeset
|
142 | del reitti[-1] |
ddf7c58091ef
Ota se friskala pois kyltistä
Teemu Piippo <teemu@hecknology.net>
parents:
44
diff
changeset
|
143 | destination = reitti[-1] |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
144 | for i, stop in enumerate(reitti): |
5 | 145 | # muunna indeksi siten että myöhemmät alueet korostuvat |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
146 | i = f(i + 1) * factor |
5 | 147 | # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
148 | i *= priorities.get(stop, 1) |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
149 | reitti_arvot[stop] = i |
5 | 150 | # nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
151 | if from_place in reitti_arvot: |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
152 | reitti_arvot[from_place] = 0 |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
153 | # varmista että destination tulee kylttiin |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
154 | reitti_arvot[destination] = 1e10 |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
155 | # muodosta sign-tiedot järjestettynä reittiarvon mukaan |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
156 | weights = sorted([ |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
157 | (stop, reitti_arvot[stop], i) \ |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
158 | for i, stop in enumerate(reitti) \ |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
159 | if reitti_arvot[stop] >= 1 |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
160 | ], key = lambda stop: -stop[1]) |
5 | 161 | # enintään neljä tulee kylttiin |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
162 | weights = weights[:3] |
22 | 163 | # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois |
164 | try: | |
45
ddf7c58091ef
Ota se friskala pois kyltistä
Teemu Piippo <teemu@hecknology.net>
parents:
44
diff
changeset
|
165 | if weights[2][0] != destination and weights[2][1] < (725 / length ** 0.8): |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
166 | del weights[2] |
22 | 167 | except IndexError: |
168 | pass | |
169 | try: | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
170 | if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15): |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
171 | del weights[1] |
22 | 172 | except IndexError: |
173 | pass | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
174 | # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin |
52 | 175 | weights = sorted(weights, key = lambda weight_data: weight_data[2]) |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
176 | # muodostetaan sign.. |
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
177 | sign = [paino[0] for paino in weights] |
52 | 178 | to_place = sign[-1] |
179 | if from_place != to_place: | |
180 | municipality_from = municipalities_per_region.get(from_place) | |
181 | municipality_to = municipalities_per_region.get(to_place) | |
182 | if municipality_from and municipality_to and municipality_from not in ['Turku', municipality_to]: | |
183 | def convert_region(region): | |
184 | municipality = municipalities_per_region.get(region, region) | |
185 | if municipality != municipality_from: | |
186 | return municipality | |
187 | else: | |
188 | return region | |
189 | sign = [convert_region(region) for region in sign] | |
190 | # supista nimet tarvittaessa | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
191 | if len(' - '.join(sign)) > 20: |
52 | 192 | sign = [abbreviations.get(place, place) for place in sign] |
193 | old_sign = sign.copy() | |
194 | sign = [] | |
195 | for place in old_sign: | |
196 | if place not in sign: | |
197 | sign.append(place) | |
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
198 | if whole: |
52 | 199 | sign = [from_place] + sign |
200 | if not sign: | |
201 | sign = [destination] | |
202 | return sign |