auto-sync: 2026-05-06 20:40:01
This commit is contained in:
@@ -954,8 +954,8 @@ async def _build_segmented_route(req: RouteRequest) -> dict:
|
||||
|
||||
segment_alternatives.append(data["routes"])
|
||||
|
||||
# Для каждого сегмента берём до 3 вариантов чтобы не взорвать комбинаторику
|
||||
max_per_segment = 3
|
||||
# Для каждого сегмента берём до 5 вариантов чтобы не взорвать комбинаторику
|
||||
max_per_segment = 5
|
||||
trimmed = [alts[:max_per_segment] for alts in segment_alternatives]
|
||||
|
||||
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", [])],
|
||||
})
|
||||
|
||||
# Дедупликация: если дистанции отличаются менее чем на 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 = []
|
||||
for route in combined_routes:
|
||||
is_dup = False
|
||||
for existing in deduped:
|
||||
if abs(route["distance"] - existing["distance"]) / max(existing["distance"], 1) < 0.02:
|
||||
is_dup = True
|
||||
break
|
||||
if not is_dup:
|
||||
sig = _route_signature(route["geometry"]["coordinates"])
|
||||
if sig not in seen_sigs:
|
||||
seen_sigs.add(sig)
|
||||
deduped.append(route)
|
||||
|
||||
# Топ-5
|
||||
|
||||
Reference in New Issue
Block a user