J'ai implémenté l'algorithme A * Selon l'implémentation de Wikipedia au here Cependant, il est trop lent pour fonctionner dans les appareils mobiles. Je dois attendre des heures interminables pour finir la fonction bien que cela fonctionne bien sur l'ordinateur de bureau. Est-ce que je peux faire quelque chose pour optimiser l'algorithme?Optimisation de l'algorithme A-Star
Voici le code réel
public DriveRoute findroute(routenode from, routenode to)
{
Dictionary<int, routenode> openlist = new Dictionary<int, routenode>();
openlist.Add(from.nodeid, from);
Dictionary<int, routenode> closedlist = new Dictionary<int, routenode>();
Dictionary<int, double> gscores = new Dictionary<int, double>();
gscores.Add(from.nodeid, 0);
Dictionary<int, double> hscores = new Dictionary<int, double>();
hscores.Add(from.nodeid, distanceForRouting(from.latlon, to.latlon));
Dictionary<int, double> fscores = new Dictionary<int, double>();
fscores.Add(from.nodeid, gscores[from.nodeid] + hscores[from.nodeid]);
Dictionary<int, routenode> came_from = new Dictionary<int, routenode>();
while (openlist.Values.Count > 0)
{
routenode x = getLowestFscore(openlist, fscores);
if (x.latlon.Equals(to.latlon))
{
return rebuildPathWay(came_from, to);
}
openlist.Remove(x.nodeid);
closedlist.Add(x.nodeid, x);
foreach (routearc arc in x.outgoingarcs)
{
if (closedlist.Keys.Contains(arc.endnode))
continue;
double tentative_g_score = gscores[x.nodeid] + arc.time;
bool tentative_is_better = false;
if (!openlist.Keys.Contains(arc.endnode))
{
openlist.Add(arc.endnode, map.routenodes[arc.endnode]);
tentative_is_better = true;
}
else if (tentative_g_score < gscores[arc.endnode])
{
tentative_is_better = true;
}
if (tentative_is_better)
{
if (came_from.ContainsKey(arc.endnode))
came_from[arc.endnode] = x;
else
came_from.Add(arc.endnode, x);
gscores[arc.endnode] = tentative_g_score;
hscores[arc.endnode] = distanceForRouting(arc.endlatlon, to.latlon);
fscores[arc.endnode] = gscores[arc.endnode] + hscores[arc.endnode];
}
}
}
return null;
}
L'avez-vous profilé? Ce qui semble être le goulot d'étranglement? – Oded
Il semble que la classe Dictionary et getLowestFscore() est le goulot de la bouteille. getLowestFscore est simplement une boucle for pour trouver le plus bas FScore. Avec quoi dois-je les remplacer? – VOX
On dirait que vous avez trop de données pour votre appareil mobile pour le gérer. Combien de nœuds avez-vous? Peut-être que vous devriez décomposer les données que vous utilisez dans les dictionnaires au minimum. – MicSim