Stratégie pour trouver votre meilleur itinéraire en Transport en commun seulement?
De trouver des voies pour une voiture est assez simple: vous stocker un graphe pondéré de toutes les routes et vous pouvez utiliser L'algorithme de Djikstra [1]. Un trajet de bus est moins évident. Avec un bus, vous avez pour représenter des choses comme "attendre 10 minutes pour le bus suivant" ou "pied d'un bloc à un autre arrêt de bus" et de nourrir ceux qui sont dans votre algorithme de pathfinding.
Il n'est même pas toujours simple pour les voitures. Dans certaines villes, certaines routes sont à sens unique dans la ville le matin, et à sens unique de la ville dans la soirée. Certaines avancées Gps savoir comment éviter les routes très fréquentées pendant les heures de pointe.
Comment voulez-vous représenter efficacement ce genre de temps dépendant de graphique et de trouver une route? Il n'est pas nécessaire pour un prouvable solution optimale; si le voyageur voulait être à l'heure, ils achètent une voiture. 😉
[1] Un merveilleux algorithme de mentionner dans un exemple parce que tout le monde en a entendu parler, mais A* est un choix de chances pour cette application.
- Le temps ne peut pas être un facteur, mais la voie la plus directe à distance peut être souhaitable ou moins les transferts. Une autre chose à considérer est le pied les chemins entre les bornes de l'origine et de la destination.
Vous devez vous connecter pour publier un commentaire.
J'ai été impliqué dans le développement de l'un à journy planificateur système de Stockholm de Transport Public en Suède. Il est basé sur l'algorithme de Djikstra, mais avec de résiliation avant chaque nœud a été visité dans le système. Aujourd'hui, quand il y a fiable coordonnées disponibles pour chaque arrêt, je suppose que l'algorithme A* serait le choix.
De données sur les prochaines trafic a été extrait à partir de plusieurs bases de données régulièrement et compilé dans grandes tables chargées dans la mémoire de notre recherche de cluster de serveur.
Une des clés de la fameuse algorith a l'aide d'un chemin d'accès de la fonction de coût basée sur les voyages et le temps d'attente multiplié par diffrent weightes. Connu en suédois “kresu"temps ces pondérée fois de tenir compte du fait que, par exemple, une minute de temps d'attente est habituellement d'équivalent dans les “inconvénients” de deux minutes de temps de trajet.
KRESU tableau des Poids
pendant le voyage. S'arrête sous le toit,
avec des magasins, etc peuvent obtenir un peu
moins de poids et bondé stations d'
supérieur à adapter l'algorithme.
Structure de données
Zone
Un nom de domaine où vous le voyage de début ou de fin. Un Arrêt de Bus pourrait être une zone avec deux Arrêts. Une plus grande Station avec plusieurs plates-formes pourrait être une zone avec un arrêt pour chaque plate-forme.
Données: Nom, s'Arrête dans la zone
S'arrête
Un tableau avec tous les arrêts de bus, de train et de métro. Notez que vous avez généralement besoin de deux arrêts, l'un pour chaque direction, car il faut un certain temps pour traverser la rue ou à pied à l'autre plate-forme.
Données: Nom, Les Liens, Les Nœuds
Liens
Une liste avec d'autres arrêts, vous pouvez rejoindre à pied à partir de cet arrêt.
Données: d'Autres s'Arrêter, le Temps de marcher sur les autres Arrêter de
Lignes/Tours
Vous avez un certain nombre sur le bus et une destination. Le bus commence à un arrêt et passe plusieurs arrêts, sur son chemin vers la destination.
Données: Le Numéro, Le Nom, La Destination
Nœuds
En général, vous avez un calendrier, avec le moins le temps pour le moment où il devrait être à la première et à la dernière étape d'une Tournée. Chaque fois qu'un bus/train passe à une halte, vous ajouter un nouveau nœud dans le tableau. Cette table peut avoir des millions de valeurs par jour.
Données: Ligne/Tour, Arrêter, Heure d'Arrivée, Heure de Départ, marge d'Erreur, Nœud Suivant dans la Tour
De recherche
Tableau de la même taille que les Nœuds tableau utilisé pour stocker comment vous y êtes arrivé, et le coût du chemin.
Données: lien Arrière avec Nœud Précédent (pas de définir si le Nœud est non visités), Coût de Chemin (infinit pour non visités)
Ce que vous parlez, c'est plus compliqué que quelque chose comme les modèles mathématiques que l'on peut décrire avec de simples structures de données comme les graphiques et les avec de "simples" des algorithmes tels que Djikstra de l'. Ce que vous demandez est un problème plus complexe, comme celles rencontrées dans le monde du automatisé de gestion de la logistique.
Une façon de penser, c'est que vous demandez à un problème multidimensionnel, vous devez être en mesure de calculer:
Compte tenu de toutes ces circonstances, vous pouvez tenter de faire de la modélisation déterministe à l'aide de complexes multi-couches de structures de données. Par exemple, vous pouvez toujours utiliser une pondéré di-graphe pour représenter le potentiel existant des routes, dans lequel chaque nœud contenait également des automates d'états finis qui a ajouté un biais de poids pour un itinéraire en fonction des valeurs de temps (donc par le passage d'un nœud à 5:25 vous obtenez une valeur différente que si votre simulation de la franchir à 7:00.)
Cependant, je pense qu'à ce stade, vous allez vous retrouver avec une simulation qui est de plus en plus complexes, ce qui a vraisemblablement n'a pas de fournir des "grands" du rapprochement des routes optimales lorsque l'avis est transféré dans le monde réel. Il s'avère que le logiciel et la modélisation mathématique et la simulation est, au mieux, d'une faiblesse de l'outil lors de la rencontre du monde réel chaotique de comportements et de dynamisme.
Ma suggestion serait aller à utiliser une stratégie de remplacement. Je voudrais tenter d'utiliser un algorithme génétique dans lequel l'ADN d'un individu calculé un potentiel de route, j'ai ensuite créer une fonction de remise en forme qui codé de coûts et de poids dans un plus "facile à entretenir" la table de la mode. Ensuite, je voudrais laisser l'Algorithme Génétique tenter de converger vers un près de la solution optimale pour une voie de transport public du finder. Sur les ordinateurs modernes, un GA comme cela va probablement effectuer raisonnablement bien, et il devrait être au moins relativement robuste au monde réel dynamisme.
Je pense que la plupart des systèmes qui font ce genre de chose, prendre le "easy way out" et de simplement faire quelque chose comme un A* algorithme de recherche, ou quelque chose de semblable à un gourmand chiffré pondérée digraphe à pied. La chose à retenir est que les utilisateurs des transports publics ne sont pas, eux, savent ce que l'itinéraire optimal serait être, de sorte que 90% de la solution optimale est toujours va être une grande solution pour la moyenne des cas.
Certains points de données pour être conscient de la part du public de transport de l'arène:
C'est peut être moins évident, mais la réalité est que c'est simplement une autre dimension à la voiture de problème, avec l'ajout de l'infini de calcul de coûts.
Par exemple, vous marquez les autobus dont le temps est passé comme ayant un coût infini - ensuite, ils ne sont pas inclus dans le calcul.
Vous pouvez alors décider de la façon de poids chaque aspect.
Le Temps de Transit peut obtenir pondérée par 1
Le temps d'attente peut obtenir pondérée par 1
Transferts peuvent obtenir pondérée par 0,5 (car je préfère y arriver plus tôt et ont un supplément de transfert)
Puis on calcule toutes les routes dans le graphique à l'aide de tout coût habituel de l'algorithme avec l'ajout de coût infini:
Chaque fois que vous vous déplacez le long d'un bord que vous devez garder une trace de 'courant' temps (ajouter le temps de transit) et si vous arrivez à un vecteur d'assigner coût infini pour des bus qui sont antérieurs à l'heure actuelle. L'heure actuelle est incrémenté par le temps d'attente à ce vecteur jusqu'à ce que le prochain bus part, alors vous êtes libre de se déplacer le long de l'autre bord et trouver le nouveau coût.
En d'autres termes, il y a une nouvelle contrainte, "temps actuel", qui est le temps de la première de bus de départ, a résumé avec tous les transports en commun et les temps d'attente des bus et des arrêts voyagé.
Il complique l'algorithme seulement un peu, mais l'algorithme est toujours le même. Vous pouvez voir que la plupart des algorithmes peuvent être appliqués à cela, certains peuvent nécessiter plusieurs passages, et un peu de ne pas travailler parce que vous ne pouvez pas ajouter le temps-->infini de calcul de coûts en ligne. Mais la plupart fonctionnent tout aussi bien.
Vous pouvez simplifier encore davantage en simplement en supposant que les bus sont sur un calendrier, et il y a TOUJOURS un autre bus, mais cela augmente le temps d'attente. Ne l'algorithme seulement en additionnant les coûts de transit, puis de parcourir l'arbre à nouveau et ajouter l'attente des coûts en fonction quand le prochain bus arrive. Il entraîne parfois moins efficaces versions, mais le total graphique de même une grande ville est en fait assez petite, donc c'est pas vraiment un problème. Dans la plupart des cas, une ou deux voies seront évidents gagnants.
Google a cela, mais inclut également d'autres arêtes de marche d'un arrêt de bus à l'autre de sorte que vous pourriez trouver un peu plus à l'itinéraire optimal si vous êtes prêt à marcher dans les villes avec de grands systèmes de bus.
-Adam
si le coût de chaque étape du voyage est mesuré dans le temps, alors la seule complication est la prise en compte de l'horaire qui change juste le coût à chaque nœud de fonction du courant à l'instant t, où t est juste le total du temps de trajet jusqu'à présent (en supposant que les horaires sont normalisées pour commencer à t=0).
ainsi, au lieu d'Un Nœud ayant un coût de 10 minutes, il a un coût de f(t) défini comme:
temps d'attente est donc pris en compte de façon dynamique dans le coût de chaque jambe, et les promenades entre les arrêts de bus sont juste des arcs avec une constante de temps de coût
avec cette représentation, vous devriez être en mesure d'appliquer Une* ou de l'algorithme de Dijkstra directement
La manière que je pense de ce problème est que, finalement, vous essayez d'optimiser votre vitesse moyenne à partir de votre point de départ à votre point d'arrivée. En particulier, vous ne vous inquiétez pas à propos de la distance totale parcourue si le fait d'être [ainsi] une façon de gagner du temps. Donc, une partie de base de l'espace des solutions est d'aller à la nécessité de trouver des voies disponibles, qui couvrent non négligeable de pièces de la distance totale à des vitesses relativement élevées entre le début et la fin.
À votre point d'origine, typique de l'automobile voie des algorithmes utilisés par GPS unités de navigation pour faire le voyage en voiture est une bonne lié pour une cible optimale total du temps et de l'itinéraire optimal des évaluations. En d'autres termes, votre bus, voyage allait être vraiment très bon à l'approche d'un véhicule en fonction de la solution. Clairement, la ligne de bus système basé va avoir beaucoup plus de contraintes que la voiture en fonction des solutions, mais avoir la voiture la solution de référence (temps et distance) donne le bus algorithme un cadre pour optimiser la contre*. Alors, mettez lâche, vous voulez transformer la voiture de la solution vers les bus de solutions dans un mode itératif, ou peut-être plus de chances possible de prendre le bus de solutions et de les marquer à l'encontre de votre voiture en fonction de la solution pour savoir si vous faites des de "bon" ou pas.
Faire un peu plus concret, pour une heure de départ il y a seulement un nombre limité de bus disponibles dans un délai raisonnable qui peut couvrir un pourcentage important de votre distance totale. Basé sur la droite de l'automobile de l'analyse période de temps raisonnable et pourcentage significatif de la distance devenir quantifiables à l'aide de certains légèrement subjectif métriques. Certainement, il devient plus facile de marquer chaque possibilité par rapport à l'autre dans un sens plus absolu.
Une fois que vous avez de grandes segment(s) disponible comme réponses possibles au sein de la solution, vous devez les connecter avec d'autres possibles de marche et d'attente, les chemins d'accès....ou si suffisamment éloignés récursive sélection de courts trajets en bus des pistes. Intuitivement, il ne semble pas qu'il y est vraiment va être prohibitif ensemble de choix ici en raison de la Contraintes Paradoxe (voir note ci-dessous). Même si vous ne pouvez pas la force brute toutes les combinaisons possibles à partir de là, ce qui reste devrait pouvoir être optimisé à l'aide d'un le recuit simulé (SA) type d'algorithme. Un Méthode de Monte Carlo serait une autre option.
La façon dont nous avons cassé le problème à ce stade, nous laisse quelque chose qui est tout à fait analogue à la façon dont SA algorithmes sont appliqués à l'automatisation de mise en page et de routage de circuits ASIC, FPGA et également le placement et le routage de circuits imprimés de laquelle il y a un peu de publié de travaux sur l'optimisation de ce type de formulaire de problème.
* Note: j'ai l'habitude de se référer à ce que "Les Contraintes Paradoxe" - mon terme. Tandis que les gens peuvent naturellement penser plus contraints problèmes plus difficiles à résoudre, les contraintes de réduire de choix et moins de choix plus facile à la force brute. Lorsque vous pouvez la force brute, alors même que la solution optimale est disponible.
Fondamentalement, un nœud dans votre diagramme ne représentent pas seulement un lieu, mais aussi la première fois que vous pouvez y arriver. Vous pouvez y penser comme graphe d'exploration dans l' (lieu,temps) de l'espace. En outre, si vous avez (lieu, t1) et (lieu,t2) où t1<t2, jeter (lieu,t2).
En théorie, cela permet d'obtenir les premiers temps de l'arrivée pour toutes les destinations possibles à partir de votre nœud de départ. Dans la pratique, vous avez besoin de quelques heuristiques pour tailler les routes que vous prenez trop loin de votre destination.
Vous avez également besoin de quelques heuristique de considérer le prometteur routes avant les moins prometteurs, ceux - si une route mène loin de votre destination, il est moins probable (mais pas totalement improbable) d'être bon.
Je pense que Votre problème est plus compliqué que prévu. Récente du COÛT de l'action est axée sur la résolution de ce problème: http://www.cost.esf.org/domains_actions/tud/Actions/TU1004 : "Modélisation du Transport Public de Passagers Flux dans l'Ère des Systèmes de Transport Intelligents".
De mon point de vue ordinaire SPS algorithmes ne sont pas adapté pour cela. Vous avez un réseau dynamique de l'état, où certaines options pour le transport de l'avant sont incotinuous (la route est toujours "ouvert" pour la voiture, le vélo, la piétonne, tout en transit connexion n'est disponible qu'à certains temps de pause).
Je pense que de nouvelles polycriterial (de temps, de fiabilité, de coût, de confort, et plus de critères), dont l'approche est souhaitée ici. Elle doit être calculée en temps réel à 1) publier des informations à l'utilisateur final au sein de court laps de temps 2) être en mesure d'ajuster la trajectoire en temps réel (en temps réel les conditions de circulation - à partir de SON).
Je suis sur le point de penser à ce problème pour la prochaine plusieurs mois (peut-être même tout au long d'une thèse de Doctorat).
Ce qui concerne
Rafal
Je ne pense pas qu'il y a de tout autre structure de données qui permettraient de répondre à ces besoins spécifiques, mais vous pouvez toujours utiliser les structures de données normales comme une liste, et ensuite faire des calculs d'itinéraires par un facteur déterminé-vous besoin d'une sorte d'entrée dans votre application à des variables qui influent sur le résultat et ensuite effectuer des calculs en conséquence je.e en fonction de l'entrée.
Comme pour l'attente et tout ça, ce sont des facteurs qui sont associés à un nœud particulier le droit? Vous pouvez traduire de ce facteur dans un itinéraire nœud, pour chacune des branches connecté au nœud. Par exemple, vous pouvez dire pour chaque branche du Nœud X, si il y a une attente pour dire m minutes sur le Nœud X, puis à l'échelle, le poids de la branche, par
[m/base de la valeur*100]% (juste un exemple). De cette façon, vous avez pris en compte les autres facteurs de manière uniforme mais en même temps le maintien d'une simple représentation du problème que vous souhaitez résoudre.
Si j'ai été la lutte contre ce problème, je serais probablement commencer avec un annotée graphique. Chaque nœud du graphe représentent tous les carrefours de la ville, si oui ou non le système de transports en commun s'arrête là - ce qui permet de tenir compte de la nécessité de marcher, etc. Sur les intersections avec les services de transport en commun, vous annoter avec stop les étiquettes, les étiquettes, vous permettant de consulter l'horaire de service pour l'arrêter.
Alors vous aurez à faire un choix. Vous avez besoin du meilleur parcours possible, ou simplement d'un itinéraire? Êtes-vous afficher les itinéraires en temps réel, ou peut-être des solutions calculé et mis en cache?
Si vous avez besoin de "temps réel" de calcul, vous aurez probablement envie d'aller avec un algorithme glouton de toutes sortes, je pense qu'une Algorithme A* correspondrait probablement ce problème de domaine assez bien.
Si vous avez besoin de solutions optimales, vous devriez regarder la programmation dynamique solutions pour le graphique... des solutions optimales risque de prendre beaucoup plus de temps à calculer, mais vous avez seulement besoin de trouver une fois, puis ils peuvent être mis en cache. Peut-être que votre algorithme A* peut utiliser les pré-calculé chemins optimaux afin d'éclairer ses décisions sur les "similaires" les routes.
Un horriblement inefficace moyen qui pourrait fonctionner pour stocker une copie de chaque carrefour de la ville pour chaque minute de la journée. Un trajet en bus à partir de l'Orme de Saint-laurent et de la 2e à la rue Principale et 25 serait représenté comme, disons,
Exécuter votre favori algorithme de pathfinding sur ce graphique et de prier pour une bonne mémoire virtuelle mise en œuvre.
Vous êtes la réponse à la question vous-même. À l'aide d'Un* ou de l'algorithme de Dijkstra, tout ce que vous devez faire est de décider sur un bon rapport coût par part de chaque itinéraire.
Pour le trajet en bus, vous voulez dire que vous ne voulez pas le plus court, mais l'itinéraire le plus rapide. Le coût de chaque partie de l'itinéraire doit donc inclure la vitesse moyenne de déplacement d'un arrêt de bus dans la partie, et tout attend à des arrêts de bus.
L'algorithme pour trouver la plus adaptée est alors toujours le même qu'avant. Avec Une*, toute la magie qui se passe dans la fonction de coût...
Vous avez besoin de poids les jambes différemment. Par exemple, un jour de pluie je pense que quelqu'un pourrait préférez voyager plus longtemps dans un véhicule de promenade sous la pluie. En outre, quelqu'un qui déteste marcher ou est incapable de marcher peut faire un/voyage plus long que quelqu'un qui ne serait pas l'esprit de la marche.
Ces bords sont frais, mais je pense que vous pouvez étendre la notion/concept de coûts et ils peuvent avoir différentes valeurs relatives.
L'algorithme reste le même, vous augmentez simplement le poids de chaque graphique bord selon les différents scénarios (horaires de Bus, etc).
J'ai mis en place un trajet de métro finder comme un exercice de chemin d'accès graphique à trouver il y a quelques temps:
http://gfilter.net/code/pathfinderDemo.aspx