2012-05-09 6 views
8

Mögliche Duplizieren:
Strategies for simplifying math expressionsVereinfachen algebraischer Ausdruck

Ich habe einen mathematischen Ausdruck Parser, der einen Baum um den Ausdruck zu repräsentieren aufbaut. Nehmen wir zum Beispiel I-Eingang 2+y+3+y, die interne Darstellung hierfür wäre:

enter image description here

Jetzt sind wir als Menschen können sofort sehen, dass 2+y+3+y = 2y + 5. Der schwierige Teil für den Computer, den ich sehe, ist, dass, wenn ich auf der linken Seite stehen würde +, ich keine Ahnung haben würde, dass ich eine weitere Ergänzung auf der rechten Seite in der anderen Branche habe - dies spielt keine Rolle bei der Bewertung, sondern bei der Vereinfachung Ich sehe nicht, wie das schön gemacht werden kann.

Dies ist, wie die Klassen zusammen passen: enter image description here

ich dies zu Google haben es versucht, aber haben nichts gefunden, was mir hier helfen könnte. Nur ein allgemeiner Wegpunkt, oder eine URL oder etwas überhaupt würde geschätzt werden

EDIT: Beachten Sie, dass ich für das Beispiel nur hinzugefügt habe. Der Parser unterstützt Ausdrücke wie: 1 + 2 * (3^4-4/5 * (1 + 2))

+0

Addition ist transitiv. Von der Wurzel +, kann es nicht sehen, dass beide Kinder auch Addition sind: das heißt, es kann die Konstanten und Variablen neu anordnen, wie es passt? –

+0

Ist das Hausaufgaben? –

+2

Können Sie '+' mehr als 2 Kinder haben? Ich glaube, symbolische Mathematiksprachen wie Mathematica würden Ihr Beispiel als eine Liste '[2, y, 3, y]' mit einem Kopf von 'Plus' speichern, der dann automatisch mit einigen Regeln vereinfacht würde. – JohnPS

Antwort

0

Da die Menge der Ausdrücke, die mit Ihrer Klassenstruktur ausgedrückt werden kann, ziemlich begrenzt ist, können Sie einfach zählen wie oft jede Variable auftritt und alle Konstanten summiert.

var nodes = tree.Flatten(); 

var variables = nodes 
    .OfType<Variable>() 
    .GroupBy(x => x.Name) 
    .Select(g => new Multiplication(
     new Variable(g.Key), new Constant(g.Count()))); 

var constants = nodes 
    .OfType<Constant>() 
    .Sum(x => x.Value); 

var result = new Addition(
    variables.Aggregate((x, y) => new Addition(x, y)), 
    new Constant(constants)); 
+0

Ich habe eine begrenzte Anzahl von Operatoren und Funktionen aufgenommen. Ich habe + - */log pow exp(). – ErikTJ

+3

@ErikTJ: Aber du hast nur nach Zusatz gefragt. Eine generische Lösung für beliebige algebraische Ausdrücke finden Sie wahrscheinlich in CS-Lehrbüchern. IMO, es ist zu viel verlangt hier. – dtb