Un colega que trabaja en programación genética me hizo la siguiente pregunta. Primero intenté resolverlo basado en un enfoque codicioso, pero en un segundo pensamiento, encontré un contraejemplo al algoritmo codicioso. Entonces, pensé que vale la pena mencionarlo aquí.
Considere dos polinomios que están representados por sus árboles de expresión. Por ejemplo, y se ilustran a continuación:
Reglas:
- Cada nodo es un nombre de variable ( ), un número o una operación (+, -, ×).
- El recorrido en orden del árbol debe dar como resultado un polinomio válido.
- Los nodos de operación tienen un grado de entrada 2. Otros nodos tienen un grado de entrada 0. Todos los nodos tienen un grado de salida 1 (excepto la raíz, cuyo grado de salida es 0).
En un nodo N del árbol, defina la operación básica de la siguiente manera:
- Una operación básica puede construir un árbol de expresión encima de N (vea el ejemplo a continuación).
El costo de la operación básica del tipo 1 es 1. El costo del tipo 2 es igual al número de operaciones {+, -, ×} en el árbol de expresión recién construido.
Ejemplo para el tipo 2: El costo de la siguiente operación básica es 2, ya que el árbol de expresión construido en la parte superior del nodo N usa dos operaciones (- y ×).
Deje que T1 y T2 sean dos árboles de expresión que representan polinomios. Defina la distancia de T1 y T2 de la siguiente manera: el costo mínimo de las operaciones básicas para convertir T1 a T2. Tenga en cuenta que no requerimos que el árbol convertido tenga la misma estructura que T2. Solo queremos que calcule el mismo polinomio que T2. (Vea los comentarios para ver un ejemplo).
El problema: Dados T1 y T2, presentan un algoritmo que calcula su distancia.
Ejemplo 1: Sea T1 y T2 los dos árboles ilustrados al comienzo de esta publicación. Para convertir el árbol derecho al árbol izquierdo, se puede construir un árbol de costo 3 encima de × y cambiar 4 a 1 (el costo total es 4).