busroute.py

changeset 22
3d094a804af8
parent 21
6a0394d5a159
child 24
e6bdb9c54096
--- a/busroute.py	Tue Jun 13 00:47:24 2017 +0300
+++ b/busroute.py	Tue Jun 20 09:37:43 2017 +0300
@@ -1,5 +1,6 @@
 #!/usr/bin/env python3
-def supista_reitti(reitti, kokonainen = False):
+def supista_reitti(reitti, ajomatka, kokonainen = False):
+	length = ((ajomatka / 600) + len(reitti)) / 2
 	def abstract_sign(sign):
 		abstractions = {
 			'Moikoinen': 'Hirvensalo',
@@ -29,7 +30,10 @@
 		return result
 	if not reitti:
 		return ''
-	kunnat = {'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki'}
+	eksoalueet = {
+		'Turku', 'Naantali', 'Lieto', 'Aura', 'Kaarina', 'Pargas', 'Marttila', 'Somero', 'Koski Tl', 'Tarvasjoki',
+		'Kaivopuisto',
+	}
 	replacements = {
 		"Ylioppilaskylä-Itä": "Ylioppilaskylä",
 		"Ylioppilaskylä-Länsi": "Ylioppilaskylä",
@@ -41,6 +45,8 @@
 		'Hemmola': 'Vahto',
 		'Paasniittu': 'Ruskon keskusta',
 		'Kahari': 'Ruskon keskusta',
+		'Kemiö': 'Kemiönsaari',
+		'Kasnäs': 'Kemiönsaari',
 	}
 	have_already = set()
 	i = 0
@@ -56,7 +62,7 @@
 		'Ihala': 150,
 		'Kauppakeskus Mylly': 200,
 		'Kuninkoja': 80,
-		'Moikoinen': 50,
+		'Moikoinen': 35,
 		'Raision keskusta': 100,
 		'Friskala': 20,
 		'Kukola': 50,
@@ -81,7 +87,7 @@
 		'Lentoasema': 50,
 		'Runosmäki': 50,
 		'Lieto': 100,
-		'Liedon asemanseutu': 200,
+		'Lieto as': 200,
 		'Ilmarinen': 50,
 		'Vahto': 50,
 		'Ruskon keskusta': 200,
@@ -109,8 +115,10 @@
 		'Räntämäki': 50,
 		'Moisio': 25,
 		'Pääskyvuori': 100,
-		'Rautatieasema': 100,
+		'Rautatieasema': 50,
 		'Rymättylä': 50,
+		"Sauvo": 500,
+		"Kemiönsaari": 500,
 	}
 
 	if 'Kauppatori' not in reitti:
@@ -122,7 +130,6 @@
 		'Ruskon keskusta': 'Rusko',
 		'Naantalin keskusta': 'Naantali',
 		'Kaarinan keskusta': 'Kaarina',
-		'Liedon asemanseutu': 'Lieto as.',
 		'Kauppakeskus Mylly': 'Mylly',
 	}
 
@@ -135,7 +142,7 @@
 	lähtö = reitti[0]
 	määränpää = reitti[-1]
 	reitti_arvot = {}
-	f = lambda i: i**-0.6
+	f = lambda i: i**-0.3
 	jakaja = max(f(i + 1) for i in range(len(reitti)))
 	for i, pysäkki in enumerate(reitti):
 		# muunna indeksi siten että myöhemmät alueet korostuvat
@@ -155,20 +162,23 @@
 		if reitti_arvot[pysäkki] >= 1
 		], key = lambda pysäkki: -pysäkki[1])
 	# enintään neljä tulee kylttiin
-	painot = painot[:4]
-	# jos neljäs kylttiarvo ei ole tarpeeksi merkittävä suhteessa reitin pituuteen niin otetaan neljäs pois
-	if len(painot) == 4 and painot[3][0] != määränpää and painot[3][1] < (4000 / len(reitti) ** 1.5):
-		del painot[3]
-	# sama kolmannelle
-	if len(painot) == 3 and painot[2][0] != määränpää and painot[2][1] < (500 / len(reitti) ** 1.5):
-		del painot[2]
-	if len(painot) == 2 and painot[1][0] != määränpää and painot[1][1] < (150 / len(reitti) ** 1.5):
-		del painot[1]
+	painot = painot[: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]
+	except IndexError:
+		pass
+	try:
+		if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15):
+			del painot[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)
+	#kyltti = abstract_sign(kyltti)
 	# supista nimet jos mahdollista
 	def viimeistele(kyltti, supistus_taso = 0):
 		if supistus_taso > 0:
@@ -177,6 +187,9 @@
 			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:
@@ -184,6 +197,6 @@
 	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 kunnat | {'Kauppatori'} and tulos[-1] in kunnat | {'Kauppatori'}:
+	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

mercurial