Данный исследовательский проект представляет собой комплексную систему для генерации синтетических траекторий перемещения людей в городской среде с последующей оценкой их реалистичности по сравнению с реальными данными. Система сочетает в себе паттерны проектирования, пространственный анализ и статистические методы для создания ансамблевых данных, максимально приближенных к реальному поведению людей.
Проект реализует сложную систему генерации персонажей с использованием комбинации паттернов:
- Builder - для пошагового конструирования объектов Person
- Factory Method - для создания различных профессиональных классов
- Strategy - для определения поведения различных профессий
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ PersonBuilder │ ─> │ Profession │ ─> │ Person │
└─────────────────┘ └──────────────────┘ └─────────────────┘
▲ │
┌────────────────────┴──────────────────┐ │
│ │ │
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Schoolchild │ │ Doctor │ │ OfficeWorker │
└─────────────────┘ └─────────────────┘ └─────────────────┘
- Python 3.7+ - основной язык разработки
- OSMnx - работа с OpenStreetMap данными, построение графов дорог
- NetworkX - алгоритмы поиска кратчайших путей
- Pandas & NumPy - обработка и анализ данных
- SciPy - статистический анализ и метрики качества
- Matplotlib & Plotly - визуализация результатов
- Folium - интерактивные карты
- Shapely - геопространственные операции
Система создает разнообразные профили людей с учетом:
- Демографических характеристик (пол, возраст)
- Профессиональной принадлежности (5 различных профессий)
- Индивидуальных распорядков дня
- Школьник (Schoolchild) - равномерное распределение по полу, возраст 7-19 лет
- Врач (Doctor) - 70% женщины, возраст 23-60 лет
- Офисный работник (OfficeWorker) - равномерное распределение, возраст 21-60 лет
- Курьер (Courier) - 80% мужчины, возраст 18-40 лет
- Продавец (Salesman) - 70% женщины, возраст 18-60 лет
Каждый персонаж имеет уникальный дневной маршрут, включающий:
- Основное место деятельности (работа/учеба)
- Второстепенные активности (магазины, спорт, др.)
- Временные интервалы с случайными вариациями
- Возвращение домой
Алгоритм использует реальную картографическую основу:
- Загрузка графа дорог из OpenStreetMap
- Поиск кратчайших путей алгоритмами NetworkX
- Учет различных типов транспорта (пеший, вело, авто)
- Реалистичная временная модель перемещений
- Графики маршрутов с помощью Matplotlib
- Тепловые карты плотности перемещений
- Наложение на реальную карту улиц
- Интерактивные карты Folium с анимированными маршрутами
- Plotly heatmaps для анализа пространственного распределения
- HTML-экспорт для веб-приложений
Система оценивает качество сгенерированных данных через сравнение с реальными датасетами:
- Jensen-Shannon divergence - расхождение распределений
- Pearson & Spearman correlation - линейная и ранговые корреляции
- Cosine similarity - косинусное сходство
- Overlap coefficient - коэффициент перекрытия распределений
- Normalized RMSE - нормированная среднеквадратичная ошибка
- Uber movement data (Нью-Йорк, сентябрь 2014)
- NYC Taxi data (2015 год)
project/
├── map.py # Основной скрипт генерации
├── movement.json # Сгенерированные траектории
├── movement New York 100.json # Дамп данных для Нью-Йорка
├── uber-raw-data-sep14.csv # Данные Uber
└── test_2015.csv # Данные такси Нью-Йорка
_node_cache = {}
def get_cached_nearest_node(x, y):
"""Кэширование поиска ближайших узлов графа"""
key = (round(x, 6), round(y, 6))
if key not in _node_cache:
_node_cache[key] = ox.distance.nearest_nodes(G, x, y)
return _node_cache[key]- Массовая обработка геоданных через Pandas
- Векторизованные вычисления расстояний
- Пакетная визуализация маршрутов
- Предварительная загрузка графа города
- Кэширование результатов пространственных запросов
- Балансировка между точностью и производительностью
- Комбинирование паттернов проектирования для задач генерации данных
- Многоуровневая система валидации реалистичности траекторий
- Интеграция реальных картографических данных с поведенческими моделями
- Комплексные метрики оценки качества синтетических данных
- Генерация тренировочных данных для ML-моделей
- Симуляция городской мобильности для урбанистических исследований
- Тестирование геospatial алгоритмов
- Создание синтетических датасетов для исследований конфиденциальности
- Jensen-Shannon divergence: 0.12
- Pearson correlation: 0.85
- Overall realism score: 82%
- Jensen-Shannon divergence: 0.15
- Pearson correlation: 0.79
- Overall realism score: 76%
- Время генерации 50 персонажей: ~45 секунд
- Объем выходных данных: ~5-10 МБ на 100 персонажей
- Масштабируемость: линейная зависимость от количества агентов
Проект включает разные форматы визуализации:
- Статические маршруты - PNG с наложением на карту улиц
- Интерактивные карты - HTML с Folium, анимацией перемещений
- Тепловые карты - Plotly для анализа плотности
class Student(Profession):
@property
def possible_places(self):
return [
{"tag": "amenity", "place": "university", "type": "time", "value": ["8:00", "10:00"], "is_main": True},
{"tag": "amenity", "place": "library", "type": "time", "value": ["14:00", "18:00"], "is_main": False}
]- Временные паттерны активности
- Сезонные вариации поведения
- Социально-экономические факторы
- REST API для генерации данных
- Экспорт в форматы GIS (GeoJSON, Shapefile)
- Интеграция с симуляторами городской мобильности
Проект представляет основу для исследований в области:
- Генерации синтетических данных
- Анализа городской мобильности
- Геопространственного машинного обучения
- Поведенческого моделирования