Un collega che lavora sulla programmazione genetica mi ha posto la seguente domanda. Prima ho provato a risolverlo sulla base di un approccio avido, ma su un secondo pensiero, ho trovato un controesempio all'algoritmo avido. Quindi, ho pensato che valesse la pena menzionarlo qui.
Considera due polinomi che sono rappresentati dai loro alberi delle espressioni. Ad esempio, e x ^ 2 + 4 sono illustrati di seguito:
Regole:
- Ogni nodo è un nome di variabile ( ), un numero o un'operazione (+, -, ×).
- La traversata in ordine dell'albero dovrebbe risultare in un polinomio valido.
- I nodi operativi hanno in-gradi 2. Altri nodi hanno in-gradi 0. Tutti i nodi hanno out-grade 1 (tranne root, il cui out-grade è 0).
Su un nodo N dell'albero, definire l' operazione di base come segue:
- Un'operazione di base può cambiare l'etichetta del nodo. Ad esempio, può essere modificato in 3 o + in .
- Un'operazione di base può costruire un albero di espressioni sopra N (vedi l'esempio seguente).
Il costo dell'operazione di base di tipo 1 è 1. Il costo per il tipo 2 è uguale al numero di operazioni {+, -, ×} nell'albero delle espressioni appena creato.
Esempio per il tipo 2: il costo della seguente operazione di base è 2, poiché l'albero delle espressioni costruito in cima al nodo N utilizza due operazioni (- e ×).
Sia T1 e T2 due alberi di espressione che rappresentano i polinomi. Definire la distanza di T1 e T2 come segue: il costo minimo delle operazioni di base per convertire T1 in T2. Si noti che non è necessario che l'albero convertito abbia la stessa struttura di T2. Vogliamo solo che calcoli lo stesso polinomio di T2. (Vedi i commenti per un esempio.)
Il problema: dati T1 e T2, presentano un algoritmo che calcola la loro distanza.
Esempio 1: Sia T1 e T2 i due alberi illustrati all'inizio di questo post. Per convertire l'albero di destra in quello di sinistra, si può costruire un albero di costo 3 sopra × e cambiare da 4 a 1 (il costo totale è 4).
Esempio 2: Lascia che T1 = sia rappresentato dal seguente albero. Per convertire T1 in T2 = , è sufficiente aggiungere 1 a ciascuno dei nodi , per ottenere = T2. Questo può essere fatto aggiungendo un albero di espressioni cost-1 sopra ogni nodo . Questo esempio mostra che la conversione termine per termine (che ho chiamato l' approccio avido all'inizio di questo post) non è un approccio ottimale. Cioè, se si vogliono produrre termini in T2 che non sono presenti in T1 (cioè , , e 1), il costo sarà molto più elevato.