auto-sync: 2026-05-06 20:40:01

This commit is contained in:
Stream
2026-05-06 20:40:01 +03:00
parent 8ba1860170
commit 149c2fb68d

View File

@@ -954,8 +954,8 @@ async def _build_segmented_route(req: RouteRequest) -> dict:
segment_alternatives.append(data["routes"]) segment_alternatives.append(data["routes"])
# Для каждого сегмента берём до 3 вариантов чтобы не взорвать комбинаторику # Для каждого сегмента берём до 5 вариантов чтобы не взорвать комбинаторику
max_per_segment = 3 max_per_segment = 5
trimmed = [alts[:max_per_segment] for alts in segment_alternatives] trimmed = [alts[:max_per_segment] for alts in segment_alternatives]
all_combos = list(itertools.product(*trimmed)) all_combos = list(itertools.product(*trimmed))
@@ -981,15 +981,24 @@ async def _build_segmented_route(req: RouteRequest) -> dict:
"legs": [leg for r in combo for leg in r.get("legs", [])], "legs": [leg for r in combo for leg in r.get("legs", [])],
}) })
# Дедупликация: если дистанции отличаются менее чем на 2% — считать дублем # Дедупликация по геометрии (не по дистанции)
def _route_signature(coords: list) -> tuple:
"""Сигнатура маршрута: несколько контрольных точек по геометрии."""
n = len(coords)
if n == 0:
return ()
indices = [0, n//4, n//2, 3*n//4, n-1]
return tuple(
(round(coords[i][0], 3), round(coords[i][1], 3))
for i in indices if i < n
)
seen_sigs = set()
deduped: list = [] deduped: list = []
for route in combined_routes: for route in combined_routes:
is_dup = False sig = _route_signature(route["geometry"]["coordinates"])
for existing in deduped: if sig not in seen_sigs:
if abs(route["distance"] - existing["distance"]) / max(existing["distance"], 1) < 0.02: seen_sigs.add(sig)
is_dup = True
break
if not is_dup:
deduped.append(route) deduped.append(route)
# Топ-5 # Топ-5