Pull to refresh

Comments 87

Интересно читать с точки зрения визуализации данных на python.
Но по метро уже есть 3d схема, которую можно повертеть:схема метро
Это не та 3d схема про которую вы подумали, это граф по времени между станциями
хм, там же написано большими буквами «Модель Московского метро в 3D» :D
Вы, как автор, понимаете какая ось что значает. Было бы здорово, если бы читатель тоже понимал.
в нормальных институтах сразу 2 ставили за отсутствие единиц измерений в формулах и отсутствие названия и единиц измерений у координат на графиках.

Единицы измерения в этом пространстве — часы. Расстояние между любой парой станций по прямой равно времени, которое нужно затратить на поездку с учётом пересадок (в часах)

Оси не имеют физического смысла. На картинке отрисован граф, не схема. Расстояние между двумя любыми точками (например, на разных линиях) — это время поездки.
Ошибся уровнем, вопрос топикстартеру Sakhar.
Ну а пользоваться как? Куда вбить два названия станций, и увидеть время и маршрут? Или вбить одно название и время, и увидеть, куда можно за это время доехать? Подозреваемый Х сел в метро на станции С, где он может выйти через 10 минут?

А по названию статьи я подумал, что вы глубину залегания станций на схеме отразили, в центре должно было бы интересное макраме визуализироваться…
скажите, а русский — ваш родной язык? про Питон не спрашиваю, он точно родной, владеете вы им превосходно

Тогда к чему вопрос? Как не может у человека быть двух Родин, так не может быть и двух родных языков.

а) может (гуглить по слову «билингвы»)
б) научитесь понимать юмор и сарказм. Сложно, но у вас получится
научитесь понимать юмор и сарказм
сказал человек, не распознавший сарказм

Автрры тупых шуток любят говорить "учись понимать юмор". Учиться делать вид, что смешна каждая тупизна — вредно.

На любую шутку найдется тот, кто не поймет. Но потом обязательно скажет, что это не потому, что он не понял, а потому, что "тупизна"

Нужно просто дошучивать в позитив, как будто бы понял шутку, и улучшить её
Только на хабре можно найти людей так серьезно разбирающих юмор.

Я бы сказал, что родной язык автора математика, что встречается реже, чем Питон.
P.S. За красивое и приятное оформление кода автору респект. Это важнее, чем использование всех возможностей языка

Родной язык не означает что априори можешь говорить/писать идеально и правильно.
идите от обратного: если язык НЕ родной, то это дает индульгенцию. А если родной, то писать так косноязычно как автор — позор.

Было бы итересно посмотреть на то, как новые линии (МЦД, БКЛ) и кто чаще будет пользоваться ими.

Можно ли скачать граф с названием станций в каком-то общедоступным в формате чтобы покрутить на досуге? Те, что в статье крутятся так быстро, ничего не понятно

Я немного опасаюсь того, что взял информацию из apk-файла яндекс метро для андроида, поэтому не знаю, можно ли выложить граф, полученный из него. Граф можно сохранить, выполнив следующий код
names = json.loads(codecs.open( "l10n.json", "r", "utf_8_sig" ).read() )
graph = json.loads(codecs.open( "data.json", "r", "utf_8_sig" ).read() )
G=nx.Graph()
for node in graph['nodes']['items']:
    G.add_node(node['id'])
#graph['links']
for link in graph['links']['items']:
    #G.add_edges_from([(link['fromNodeId'],link['toNodeId'])])
    G.add_edge(link['fromNodeId'], link['toNodeId'], length=link['attributes']['time'])
nodestoremove=[]
for node in G.nodes():
    if len(G.edges(node))<2:
        nodestoremove.append(node)
for node in nodestoremove:
    G.remove_node(node)
labels={}
for node in G.nodes():
    try:
        labels[node]=names['keysets']['generated'][nodeStdict[node]+'-name']['ru']
    except: labels[node]='error'
G = nx.relabel_nodes(G, labels)
nx.write_gml(G, "path_where_graph_should_be_saved.gml")

Файлы с JSON из приложения должны находиться в той же папке что и код. В результате генерируется граф в формате gml с названиями, связями и временами в пути.
Большое спасибо, но я имел ввиду лишь 3D модель: вращающиеся штуки в статье ужасны в отличие от прекрасного кода
Класс, спасибо, слона-то я и не заметил шапку то-проглядел
Присоединяюсь к комментарию выше, допилите конвертацию для браузера и выложите, очень интересный анализ.

Кстати, для полного обоснования утверждения вроде «На севере москвы, судя по плану, происходит частичное дублирование Серой и салатовой ветками — они находятся рядом в пространстве времен путешествий» в схему все же надо вводить еще одну точку — многоэтажку, где живет пользователь, тогда все встает на свои места.
добавил ссылку на схему метро на js Добавить js скрипт непосредственно в html поста не получилось — похоже на хабре это запрещено из соображений безопасности.
Интересное исследование! Думаю, что метро не помешали хорды в некоторых местах, а не еще одно кольцо.
Нельзя планировать без учёта пригородных электричек и наземного транспорта, метро строилось очень интересно и поначалу дублировало автобусные линии. Да, пройти ногами от «Библиотеки Ленина» до «Третьяковской» быстрее, что подтверждается и этой публикацией, но вот на Юге Москвы от красной до рыжей веток очень удобно добираться наземкой, «парковщиков», отъедающих по две полосы, куда-нибудь деть, и никакая хорда не понадобится. А с фиолетовой-восточной никуда по земле толком не уедешь, зато там есть автовокзал, в итоге по утрам она вмёртвую стопорится.
Любопытно было бы взглянуть и сравнить варианты с МЦК и без МЦК. По идее ветки должны были с вводом МЦК как-то стянуться.

Расстояние между точками — время поездки именно на метро, без другого транспорта?
Тогда две близкие на земле линии будут настолько удалены на схеме, как далеко пересадка между ними.

Круто, спасибо за вашу работу. Впечатляет длина чёрных линий. Я предполагал, что переход занимает много времени, но чтобы настолько...

Занятно если есть такие маршруты, где быстрее проехать больше станций, чем идти по переходу.
Всегда пользуюсь эмпирическим правилом: время в пути равно (число перегонов + 2 x число пересадок) x 3 минуты. Понятно, что между разными станциями расстояния существенно разные, но на практике всё хорошо усредняется, и при поездках через пол-города формула даёт точность не хуже пяти минут.
На практике, в той части города, где есть выбор пересадок, различия перегонов пренебрежимо малы.
Спасибо за формулу.
Перегон в московском метро 1,5-4 минуты, чаще всего 3. А пересадку при условии отсутствия толп и очередей достаточно точно можно закладывать в 5 минут.
ЗЫ извините за занудство, просто когда-то развлекался гонками на метро.

Странно, откуда у вас получился такой разброс? По моим измерениям, которые я проводил в течение 10 лет, стандартное расстояние между 2 станциями составляет 2 мин 30 сек, включая простой поезда на самой станции. Т. е. последний перегон может быть чуть короче, за счет того, что выходишь из поезда, и время его остановки уже не нужно учитывать.

Вот схема от 2006го с указанием времени на перегонах. С момента «двери закрылись» до «двери открылись» действительно может пройти 4 минуты, например, на Юге зелёной ветки.
А может и поболее. На западе Арбатско-Покровской.

На западе голубой ветки не наблюдаю никаких аномалий. Разве что среднее время перегона чуть меньше моей оценки в 2,5 минуты.

Арбатско-Покровская — это синяя, а не голубая. Посмотрите между Крылатским и Строгино.

Я потому так и написал, потому что арбатско-покровскую линию перекроили, и на карте 2006-года, которую мы в этой ветке обсуждаем Строгино вообще нет.


Яндекс.метро показывает 7 мин. Вполне возможно. Там река, поэтому перегон длиннее других.

Точность этой схемы слишком низкая. На ней шкала измерений 1 минута. Если верить этой же схеме, то для перегона Чистые пруды — Лубянка относительная погрешность составляет 100%.


Впрочем, на больших расстояниях эта схема подтверждает мои данные.


Серпуховская — Бульвар Дмитрия Донского: средняя длина перегона 2 мин 27 сек
Октябрьская — Битцевский парк: 2 мин 33 сек
Парк Культуры — Юго-Западная: ровно 2 мин 30 сек


Как я уже написал, в 2,5 минуты на перегон входит также пребывание поезда на станции. Если перегон занимает 2 минуты, то поезд будет стоять на станциях 30 секунд. Причем этот интервал может быть заполнен ожиданием с разных концов перегона и может зависеть от направления движения. Скажем, при движении от Лубянки к Чистым прудам, поезд задержится на Чистых прудах, а в обратную сторону — на Лубянке.


На юге зеленой ветки это правило, очевидно, не соблюдается. Подозреваю, что есть некий фиксированный интервал, который используют для составления расписаний, и время в пути вместе с временем остановки кратно этому интервалу. Например, перегон Спортивная-Университет всегда был точно равен двум стандартным перегонам. Когда между ними появилась станция Воробьевы горы, общее время в пути на красной линии не изменилось. Думаю, на зеленой ветке из-за промзоны и Москва-реки перегоны сделаны с несколькими пропусками станций, но с тем же шагом.

Вот что пишет метроэльф на эту тему: на рыжей ветке интервал 1,40, на посадку-высадку пассажиров 15-25 сек (в идеале 20, но всегда найдётся баран, придерживающий двери и срывающий график).

Интервал 1,40 (100 сек, видимо), это, скорее всего, между поездами. Он должен еще в течение суток изменяться.


Если "баран" задержал отправление, то поезд будет ехать чуть быстрее и тормозить чуть резче. Я же наблюдал неоднократно другую картину, как раз на центральных станциях, где перегоны очень короткие. Никто двери не держит, а поезд стоит те самые 25 секунд, или подъезжает к станции медленно как улитка, или просто в тоннеле стоит. И в итоге всегда среднее время в пути составляло 2,5 мин на перегон везде, где я ездил.

Хорошо, как будет время, я покатаюсь с секундомером мимо Автозаводской :) А интервал между поездами, да. Поезд не всегда может ехать быстрее/тормозить резче, там свои правила движения, если задержка на станции превышает заложенный запас, то интервал растёт.

Хорошо бы взглянуть на расписание, а еще лучше на методику его составления.

Вот чего у меня нет, того и нет. Всё-таки метро интересовался, но там не работал.

А я то было подумал, что тут будет схема, как линии метро в пространстве под землёй расположены.

На такую выше в комментах ссылку давали.
Добавление третьего измерения к имеющейся схеме, ассоциируется с нырянием высот станций по вертикали, но никак ни с временнЫм исчислением времени в пути. ИМХО, вышел крайне неудачный концепт отображения. Неспроста же нигде в мире не приняты индикации подобных схем, применимо конкретно к станциям метрополитена.

Этот граф очень удачный для своей цели — показать расстояние в часах между двумя любыми разными точками. Он никак не связан с географическим графом расположения станций, он совсем для другого.

Да это понятно, что для времени. Да, я статью читал. Но тем не менее, график не ассоциируется со временем, так как построен по ранее уже занятому принципу отображения по оси Z, именно высоты, в качестве третьей координаты. Ну ни разу не воспринимается график как повременный, потому что очень похож именно как на высотный. Было бы оптимальнее выбрать какой-нить иной способ отображения, что не подвергаться ассоциативной путанице с высотами.

Интересно было бы узнать, насколько в среднем мцк ускоряет время поездки. А то езжу по всей Москве, а как маршрут строю — все время яндекс.метро предлагает через центр ехать, а не по мцк

Насколько знаю, я.метро не любит МЦК за 9тиминутные интервалы между поездами, и скорее всего закладывает максимальное ожидание в маршрут. МЦК очень удобно на маршрутах область-центр и область-центр-область: можно не доезжать до конечных станций.
Чисто по геометрическим соображениям: МЦК может быть выгодно при движении по нему не более чем на треть окружности, а может быть — не более, чем на четверть.

МЦК — имеет свою специфику. В отличие от обычного метро, там можно возить велосипеды, не разбирая. Некоторые станции находятся там, где вообще никакого транспорта больше нет, скажем, какая-нибудь Белокаменная или Зорге. Поэтому оно не просто выгодно, но и иногда просто незаменимо.

Белокаменная — это станция Яуза Ярославского направления, а ещё там от остановок автобусов идти 10 минут, 3 номера ходят. Зорге тоже не в чистом поле стоит :)

Конечно-конечно. Всего 2,5 километра пешком по автодороге до станции Яуза. И всего 700 метров до остановки автобуса, который аж 3 раза в час иногда появляется. И доехать на этом автобусе можно только до другой станции МЦК Бульвар Рокоссовского. Да и Яуза не станция, а платформа, где далеко не все электрички останавливаются, и до кассы через мост идти надо, а потом назад. Если рассматривать всерьез пересадку с Белокаменной, то нужно закладывать минимум час. Лучше до Ростокино доехать и там на нормальную станцию Северянин перейти.


Станция Белокаменная находится в центре лесного массива, в стороне даже от тропинок, где гуляют отдыхающие. Один из выходов расположен просто в лесу между заброшенными жд-колеями, другой — в тупике яузской аллеи, куда автобусы не заходят, потому что там нет места для разворота. И вот для того чтобы в эту глушь забраться, эта станция очень даже подойдет.


А так-то да, в Москве в любой точке в радиусе 3 км можно найти что угодно.

Моё понимание «недалеко» — примерно 1,5км, 20 минут пешком. С этой точки зрения с Белокаменной не всё так плохо, я через неё иногда на работу езжу, когда в электричках перерыв. До платформы 2.1 км. У автобусов интервал 15-20 минут, полкило до остановки, но на одном из маршрутов можно доехать до м.Сокольники, а на другом до Рокоссовского Сокольнической ветки. Вот другой выход, вглубь Лосиного острова да, вилы, оттуда никак иначе не уедешь.
Но всё равно воспринималось издевательством, когда в электричке объявляли «Платформа Яуза, пересадка на станцию МЦК Ростокино», до которой 1.9 км дворами. Сейчас, к счастью, перестали.

Ну тогда вы согласитесь, что эти 1.5-2 км не приспособлены для пешеходов. Это автодорога без тротуара и без нормальной обочины. Если вам нужно метро, тогда лучше выйти на Рокоссовского, если электричка, то в Ростокино. Вы, наверное, на велосипеде там катаетесь, как и я. Для велосипедистов Белокаменная очень хорошо подходит.

Соглашусь, спасает только то, что дорога не разбитая и машин почти нет. Я там пешком хожу, правда, обычно от Яузы — в НИИ Туберкулёза сейчас работаю.

С учётом очень "удобных" пересадок с него на половину линий метро, им целесообразно пользоваться если:


  1. Начало или конец маршрута находится вблизи станции мцк
  2. Начало и конец маршрута находятся вблизи северных концов линий метро. Но при этом не соседних. Например: Речной Вокзал — Медведково — есть смысл. Алтуфьево — Медведково — быстрее будет на автобусе.
    На юге выгоды не будет.
  3. Если хочется ехать в чуть меньшей давке, чем под землёй, даже с учётом небольшой потери времени.
  4. Для жителей области: если на вашем направлении жд уже построили удобную пересадку и ехать надо на другой конец города, но не строго противоположный. Например, с Рижского направления на Юго-Западную или с Савёловского в Измайлово. И то, во многих случаях тут больше работает п.3
вы упустили мой сценарий: автобус-МЦК-автобус
UFO just landed and posted this here

Лет 20 назад была бесплатная программа под винду (кажется, называлась pMetro). Там была очень крутая 3д схема метро, и всё можно было вращать и масштабировать. Но главная фишка — это то, что все станции были тоже 3д, со всеми эскалаторами, переходами и выходами с обозначением улиц.

кажется, нечто очень похожее есть в Гугл.Плее под названием aMetro
А было бы классно сделать реальную схему метро в 3D. Глубины заложения станций известны. Расстояния между ними — тоже. И координаты есть.
И ссылка в комментариях на неё есть.
там глубины не верно отображаются. было бы клево увидеть самую глубокую станцию прям на картинке
В нашем благословенном двумерном мире, заголовок «Как выглядело бы Московское метро в трехмерном мире» лишён всякого смысла!

Хотя некоторые утверждают что оно выглядело бы примерно так:
image
да, разница между трехмерным миром математики и фотографии сразу бросается в глаза!
забавна разница в подходах к поиску информации ))
вы дергали инфу из приложения, хотя все те же данные есть на офиц. сайте в одном из файлов: mosmetro.ru bitrix/templates/sh1/app.js
Было бы занятно найти данные о времени поездки в зависимости от времени суток и анимировать граф по этому параметру )
Я.Граф.Метро

(По идее, можно, наверно, опрашивать Яндекс.Карты на эту тему)

Как уж тут не вспомнить «Лист Мёбиуса»
По какой причине нельзя сделать расстояние между станциями равным времени в пути в 2D виде? Расстояние вектор определённой длинны, в чём проблема перенести эту длину в виде увеличения/уменьшения расстояния между станциями?
Это сделать можно, и скорее всего сработало бы, если учитывались бы времена только между соседними станциями; Время тогда можно было бы считать просто как сумму длин ребер графа пути от одной станции к другой. В двумерном пространстве даже такая задача не всегда решается. Пример — 4 станции, каждая связана с каждой и есть 4 времени перехода. В 2д случае такая задача не решается в общем виде, в 3d она решается при некоторых ограничениях на соотношения длин (комент снизу). В случае, когда оптимизация идет по всем парам станций, нарисовать адекватный граф в 2d еще труднее, и нужно больше степеней свободы для более точного построения для точного графа. Поэтому выбрано 3d пространство. Но никто не мешает запустить алгоритм с гораздо худшими результатами на 2д схеме (результат оптимизации 2д — последняя картинка в посте)

В случае Евклидовых расстояний высокая размерность не поможет точно вложить схему. Например, в метро всего 4 станции, одна соединена со всеми остальными, остальные друг с другом не соединены (звезда). При этом время на путешествие между центральной станцией и граничной равно 1. Тогда время пути между тремя граничными станциями равно 2 (время на пересадку пока игнорируем), и при вложении схемы в евклидово пространство они образуют треугольник со стороной 2. Никакая дополнительная размерность не поможет поставить четвёртую станцию так, что расстояние между ней и остальными будет равно 1.


Пространства, в которые можно вложить любое конечное пространство существуют, например, https://en.m.wikipedia.org/wiki/L-infinity, и там ограничение на размерность совпадает с вашей интуицией

Спасибо большое за ценное замечание! Действительно, для евклидовых пространств утверждение, что «для любого графа существует такое пространство, что можно таким образом расставить точки, чтобы расстояние между любыми двумя ними было равно указанным длинам ребер графа» неверно. Нужно либо вводить дополнительные ограничение, чтобы удовлетворялось неравенство треугольника для любой тройки точек либо еще какое-то или смотреть на другие пространства с другими метриками.
Очевидно, что в двумерном пространстве невозможно нарисовать такую схему, в которой расстояние между двумя станциями равнялось бы времени путешествия от одной к другой из-за сложной топологии графа метро.


Совершенно не очевидно.
На мой взгляд градиентный спуск тут излишен, и более того, если перемудрить то он может сойтись куда-нибудь в локальный минимум. Задача (если я правильно понял) — линейная, так что если у вас уже есть матрица связности графа (квадратная), то PCA (Principal Component Analysis) решает именно то что вам надо. Находим Eigen вектора (mean-subtracted) матрицы связности, выбираем 3 вектора с максимальным Eigen значением, которые собственно и будут соответствовать искомым координатам в 3Д пространстве.

К сожалению не могу проверить это в Питоне, но если кто захочет заимплементить — с удовольствием гляну/подскажу
Для некоторых веток, например зеленой, синей или фиолетовой МЦК (розовое кольцо) практически бесполезно из-за неудобных пересадок, что видно в удалении кольца от этих веток.


Что бесполезно?
Sign up to leave a comment.

Articles