Ho una lista di proprietà, che sono legate a qualche espressione di stringa:
property z, expression '[x] + [y]'
property x, expression '[y] + 1'
property y, expression '1'
Quindi per risolvere z, devo prima risolvere xey. La mia attuale approssimazione è questa:
var solved = new List<string>();
while (properties.Count() > 0)
{
var property = properties.Dequeue();
var dependencies = FindDependencies(property)
.Where(x => !solved.Contains(x))
.ToList();
// no unsolved dependencies, solve it
if (dependencies.Count == 0)
{
property.Solve();
solved.Add(property.Name);
}
// it can't be solved now, add to the end of queue
else
{
properties.Enqueue();
}
}
Questa approssimazione ha due problemi:
a) Penso che non sia ottimale, perché la proprietà non risolta viene aggiunta alla fine, potrebbe essere che potrebbe essere risolta prima e in tal caso le proprietà dipendenti non potrebbero essere posticipate anche.
b) Impossibile ottenere una buona condizione di uscita, quando è irrisolvibile (ovvero, c'è un riferimento circolare).
Qualcuno riconosce l'algoritmo già noto o ha idee su come ottimizzarlo?