Kolega pracujący nad programowaniem genetycznym zadał mi następujące pytanie. Najpierw próbowałem go rozwiązać w oparciu o chciwe podejście, ale po drugiej myśli znalazłem kontrprzykład na algorytm chciwy. Pomyślałem więc, że warto tu wspomnieć.
Rozważ dwa wielomiany reprezentowane przez drzewa wyrażeń. Na przykład i pokazano poniżej:
Zasady:
- Każdy węzeł jest albo nazwą zmiennej ( ), liczbą , albo operacją (+, -, ×).
- Przechodzenie drzewa w kolejności powinno skutkować prawidłowym wielomianem.
- Węzły operacyjne mają stopień 2. Inne węzły mają stopień 0. Wszystkie węzły mają stopień 1 (z wyjątkiem rdzenia, którego stopień wynosi 0).
W węźle N drzewa zdefiniuj podstawową operację w następujący sposób:
- Podstawowa operacja może zmienić etykietę węzła. Na przykład można zmienić na 3 lub + na .
- Podstawowa operacja może zbudować drzewo wyrażeń na N (patrz przykład poniżej).
Koszt podstawowej operacji typu 1 wynosi 1. Koszt typu 2 jest równy liczbie operacji {+, -, ×} w nowo zbudowanym drzewie wyrażeń.
Przykład dla typu 2: Koszt następującej podstawowej operacji wynosi 2, ponieważ drzewo wyrażeń zbudowane na węźle N używa dwóch operacji (- i ×).
Niech T1 i T2 będą dwoma drzewami ekspresyjnymi reprezentującymi wielomiany. Zdefiniuj odległość T1 i T2 w następujący sposób: minimalny koszt podstawowych operacji konwersji T1 na T2. Zauważ, że nie wymagamy, aby przekonwertowane drzewo miało taką samą strukturę jak T2. Chcemy tylko, aby obliczał ten sam wielomian jak T2. (Zobacz komentarze dla przykładu.)
Problem: Biorąc pod uwagę T1 i T2, przedstawiamy algorytm obliczający ich odległość.
Przykład 1: Niech T1 i T2 to dwa drzewa przedstawione na początku tego postu. Aby przekonwertować prawe drzewo na lewe, można zbudować drzewo o koszcie 3 na górze × i zmienić 4 na 1 (całkowity koszt to 4).