Коллега, который работает над генетическим программированием, задал мне следующий вопрос. Сначала я попытался решить ее, основываясь на жадном подходе, но потом подумал, что нашел контрпример к жадному алгоритму. Итак, я подумал, что стоит упомянуть здесь.
Рассмотрим два полинома, которые представлены деревьями их выражений. Например, и показаны ниже:
Правила:
- Каждый узел является либо именем переменной ( ), числом , либо операцией (+, -, ×).
- Упорядоченный обход дерева должен привести к правильному многочлену.
- Операционные узлы имеют степень 2. Другие узлы имеют степень 0. Все узлы имеют выходную степень 1 (кроме корня, у которого выходная степень равна 0).
На узле N дерева определите основную операцию следующим образом:
- Базовая операция может изменить метку узла. Например, можно изменить на 3 или + можно изменить на .
- Базовая операция может построить дерево выражений поверх N (см. Пример ниже).
Стоимость базовой операции типа 1 равна 1. Стоимость типа 2 равна количеству операций {+, -, ×} во вновь построенном дереве выражений.
Пример для типа 2: стоимость следующей базовой операции равна 2, поскольку дерево выражений, построенное поверх узла N, использует две операции (- и ×).
Пусть T1 и T2 - два дерева выражений, представляющих многочлены. Определите расстояние T1 и T2 следующим образом: минимальная стоимость основных операций для преобразования T1 в T2. Обратите внимание, что нам не требуется, чтобы преобразованное дерево имело ту же структуру, что и T2. Мы просто хотим, чтобы он вычислял тот же полином, что и T2. (См. Комментарии для примера.)
Проблема: учитывая T1 и T2, представьте алгоритм, который вычисляет их расстояние.
Пример 1. Пусть T1 и T2 - два дерева, показанные в начале этого поста. Чтобы преобразовать правое дерево в левое дерево, можно построить дерево стоимостью 3 сверху × и изменить 4 на 1 (общая стоимость равна 4).
Пример 2: Пусть T1 = будет представлено следующим деревом. Чтобы преобразовать T1 в T2 = , достаточно добавить 1 к каждому из узлов , чтобы получить = T2. Это можно сделать, добавив дерево выражений cost-1 поверх каждого узла . Этот пример показывает, что поэтапное преобразование (которое я назвал жадным подходом в начале этого поста) не является оптимальным подходом. То есть, если кто-то хочет создать термины в T2, которых нет в T1 (то есть , , и 1), стоимость будет намного выше.4 х 3 6 х 2 4 х