Fri, 01 Dec 2017 08:04:57 +0200
Asioita
| 5 | 1 | #!/usr/bin/env python3 |
| 27 | 2 | |
| 52 | 3 | from configparser import ConfigParser |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
4 | from math import inf |
| 72 | 5 | from misc import profile |
| 52 | 6 | region_info = ConfigParser() |
| 7 | region_info.read('regions.ini') | |
| 8 | ||
| 27 | 9 | def simplify_name(name): |
| 72 | 10 | name = profile['replacements'].get(name, name) |
| 27 | 11 | return name |
| 12 | ||
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
13 | def reduce_schedule(route, trip_length, whole = False, long = False): |
| 72 | 14 | priorities = profile['priorities'] |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
15 | length = ((trip_length / 600) * 3 + len(route) * 2) / 5 |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
16 | if not route: |
| 5 | 17 | return '' |
| 18 | have_already = set() | |
| 19 | i = 0 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
20 | while i < len(route): |
| 72 | 21 | if route[i] in profile['replacements']: |
| 22 | route[i] = profile['replacements'][route[i]] | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
23 | if route[i] in have_already: |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
24 | del route[i] |
| 5 | 25 | else: |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
26 | have_already.add(route[i]) |
| 5 | 27 | i += 1 |
| 28 | ||
| 72 | 29 | # if 'kauppatori' not in route: |
| 30 | # priorities['länsikeskus'] = priorities['skanssi'] = priorities['kauppatori'] | |
| 5 | 31 | |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
32 | from_place = route[0] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
33 | destination = route[-1] |
| 5 | 34 | reitti_arvot = {} |
| 22 | 35 | f = lambda i: i**-0.3 |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
36 | factor = 1 / max(f(i + 1) for i in range(len(route))) |
| 72 | 37 | while float(priorities.get(route[-1], 0)) < 0: |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
38 | del route[-1] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
39 | destination = route[-1] |
|
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
40 | for i, stop in enumerate(route): |
| 5 | 41 | # 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
|
42 | i = f(i + 1) * factor |
| 5 | 43 | # ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset |
| 72 | 44 | i *= float(priorities.get(stop, 1)) |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
45 | reitti_arvot[stop] = i |
| 5 | 46 | # 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
|
47 | if from_place in reitti_arvot: |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
48 | reitti_arvot[from_place] = 0 |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
49 | # varmista että destination tulee kylttiin |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
50 | reitti_arvot[destination] = 1e10 |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
51 | # muodosta sign-tiedot järjestettynä reittiarvon mukaan |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
52 | weights = sorted([ |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
53 | (stop, reitti_arvot[stop], i) \ |
|
71
d2e19670b772
Remove assumptions and added some api stuff
Teemu Piippo <teemu@hecknology.net>
parents:
68
diff
changeset
|
54 | for i, stop in enumerate(route) \ |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
55 | if reitti_arvot[stop] >= 1 |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
56 | ], key = lambda stop: -stop[1]) |
| 68 | 57 | if long: |
| 58 | weights = weights[:4] | |
| 59 | else: | |
| 60 | # enintään neljä tulee kylttiin | |
| 61 | weights = weights[:3] | |
| 62 | # jos kolmas kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan se pois | |
| 63 | try: | |
| 64 | if weights[2][0] != destination and weights[2][1] < (725 / length ** 0.8): | |
| 65 | del weights[2] | |
| 66 | except IndexError: | |
| 67 | pass | |
| 68 | try: | |
| 69 | if weights[1][0] != destination and weights[1][1] < (500 / length ** 1.15): | |
| 70 | del weights[1] | |
| 71 | except IndexError: | |
| 72 | pass | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
73 | # lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin |
| 52 | 74 | 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
|
75 | # muodostetaan sign.. |
|
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
76 | sign = [paino[0] for paino in weights] |
| 52 | 77 | to_place = sign[-1] |
| 78 | old_sign = sign.copy() | |
| 79 | sign = [] | |
| 80 | for place in old_sign: | |
| 81 | if place not in sign: | |
| 82 | sign.append(place) | |
|
24
e6bdb9c54096
Yhtenäistetty ohjelmakoodin kieli englanniksi
Teemu Piippo <teemu@hecknology.net>
parents:
22
diff
changeset
|
83 | if whole: |
| 52 | 84 | sign = [from_place] + sign |
| 85 | if not sign: | |
| 86 | sign = [destination] | |
| 87 | return sign |