busroute.py

changeset 24
e6bdb9c54096
parent 22
3d094a804af8
child 27
f89504285945
--- a/busroute.py	Tue Jun 20 09:39:42 2017 +0300
+++ b/busroute.py	Tue Jun 20 10:27:52 2017 +0300
@@ -1,6 +1,6 @@
 #!/usr/bin/env python3
-def supista_reitti(reitti, ajomatka, kokonainen = False):
-	length = ((ajomatka / 600) + len(reitti)) / 2
+def reduce_schedule(reitti, trip_length, whole = False):
+	length = ((trip_length / 600) + len(reitti)) / 2
 	def abstract_sign(sign):
 		abstractions = {
 			'Moikoinen': 'Hirvensalo',
@@ -58,7 +58,7 @@
 		else:
 			have_already.add(reitti[i])
 			i += 1
-	prioriteetit = {
+	priorities = {
 		'Ihala': 150,
 		'Kauppakeskus Mylly': 200,
 		'Kuninkoja': 80,
@@ -122,10 +122,10 @@
 	}
 
 	if 'Kauppatori' not in reitti:
-		prioriteetit['Länsikeskus'] = prioriteetit['Skanssi'] = prioriteetit['Kauppatori']
+		priorities['Länsikeskus'] = priorities['Skanssi'] = priorities['Kauppatori']
 
 	# nimiä joista voidaan joustaa tarvittaessa
-	helpot_supistukset = {
+	abbreviations = {
 		'Raision keskusta': 'Raisio',
 		'Ruskon keskusta': 'Rusko',
 		'Naantalin keskusta': 'Naantali',
@@ -133,70 +133,64 @@
 		'Kauppakeskus Mylly': 'Mylly',
 	}
 
-	# jos ei nyt millään vaan mahdu muuten...
-	vakavat_supistukset = {
-		'Kauppatori': 'Tori',
-		'Ylioppilaskylä': 'Yo-kylä',
-	}
-
-	lähtö = reitti[0]
-	määränpää = reitti[-1]
+	from_place = reitti[0]
+	destination = reitti[-1]
 	reitti_arvot = {}
 	f = lambda i: i**-0.3
-	jakaja = max(f(i + 1) for i in range(len(reitti)))
-	for i, pysäkki in enumerate(reitti):
+	factor = 1 / max(f(i + 1) for i in range(len(reitti)))
+	for i, stop in enumerate(reitti):
 		# muunna indeksi siten että myöhemmät alueet korostuvat
-		i = f(i + 1) / jakaja
+		i = f(i + 1) * factor
 		# ota prioriteetti huomioon, jotkin alueet ovat tärkeämpiä kyltissä kuin toiset
-		i *= prioriteetit.get(pysäkki, 1)
-		reitti_arvot[pysäkki] = i
+		i *= priorities.get(stop, 1)
+		reitti_arvot[stop] = i
 	# nollaa lähtöpaikan arvo ettei se mitenkään tule kylttiin
-	if lähtö in reitti_arvot:
-		reitti_arvot[lähtö] = 0
-	# varmista että määränpää tulee kylttiin
-	reitti_arvot[määränpää] = 1e10
-	# muodosta kyltti-tiedot järjestettynä reittiarvon mukaan
-	painot = sorted([
-		(pysäkki, reitti_arvot[pysäkki], i) \
-		for i, pysäkki in enumerate(reitti) \
-		if reitti_arvot[pysäkki] >= 1
-		], key = lambda pysäkki: -pysäkki[1])
+	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(reitti) \
+		if reitti_arvot[stop] >= 1
+		], key = lambda stop: -stop[1])
 	# enintään neljä tulee kylttiin
-	painot = painot[:3]
+	weights = weights[: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]
+		if weights[2][0] != destination and weights[2][1] < (1000 / length ** 1.15):
+			del weights[2]
 	except IndexError:
 		pass
 	try:
-		if painot[1][0] != määränpää and painot[1][1] < (500 / length ** 1.15):
-			del painot[1]
+		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 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)
+	# lajitellaan painoarvot uudestaan reittijärjestykseen jotta sign tulee oikeinpäin
+	weights = sorted(weights, key = lambda paino: paino[2])
+	# muodostetaan sign..
+	sign = [paino[0] for paino in weights]
+	#sign = abstract_sign(sign)
 	# supista nimet jos mahdollista
-	def viimeistele(kyltti, supistus_taso = 0):
-		if supistus_taso > 0:
-			kyltti = [helpot_supistukset.get(paikka, paikka) for paikka in kyltti]
-		if supistus_taso > 1:
-			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:
-		tulos = viimeistele(kyltti, supistus_taso = 2)
-	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 eksoalueet | {'Kauppatori'} and tulos[-1] in eksoalueet | {'Kauppatori'}:
-		tulos = ['Turku' if k == 'Kauppatori' else k for k in tulos]
-	return tulos
+	def finalise(sign, abbreviation_level = 0):
+		if abbreviation_level > 0:
+			sign = [abbreviations.get(paikka, paikka) for paikka in sign]
+		return sign
+	result = finalise(sign)
+	for i in range(len(sign) - 1):
+		if sign[i + 1].startswith(sign[i]):
+			del sign[i]
+	if len(' - '.join(sign)) > 20:
+		result = finalise(sign, abbreviation_level = 1)
+	if whole:
+		result = [from_place] + result
+	short_from_place = replacements.get(from_place, from_place)
+	if (
+		short_from_place != result[-1]
+		and abbreviations.get(short_from_place, short_from_place) in eksoalueet | {'Kauppatori'}
+		and result[-1] in eksoalueet | {'Kauppatori'}
+	):
+		result = ['Turku' if k == 'Kauppatori' else k for k in result]
+	return result

mercurial