遺伝子プログラミングに携わっている同僚から次の質問がありました。私は最初に貪欲なアプローチに基づいてそれを解決しようとしましたが、考え直して、欲張りアルゴリズムの反例を見つけました。だから、ここで言及する価値があると思いました。
式ツリーで表される2つの多項式を考えます。たとえば、およびを以下に示します。
ルール:
- 各ノードは、変数名()、数値、または操作(+、-、×)のいずれかです。
- ツリーの順序トラバーサルは、有効な多項式になるはずです。
- 操作ノードにはインディグリー2があります。他のノードにはインディグリー0があります。すべてのノードにはアウトディグリー1があります(アウトディグリーが0であるルートを除く)。
ツリーのノードNで、次のように基本操作を定義します。
- 基本的な操作では、Nの上に式ツリーを構築できます(以下の例を参照)。
タイプ1の基本操作のコストは1です。タイプ2のコストは、新しく構築された式ツリーの{+、-、×}操作の数に等しくなります。
タイプ2の例:ノードNの上に構築された式ツリーは2つの操作(-と×)を使用するため、次の基本操作のコストは2です。
T1とT2を多項式を表す2つの式ツリーとします。T1とT2の距離を次のように定義します。T1をT2に変換するための基本操作の最小コスト。変換されたツリーがT2と同じ構造を持つ必要はないことに注意してください。T2と同じ多項式を計算するだけです。(例についてはコメントを参照してください。)
問題: T1とT2が与えられた場合、それらの距離を計算するアルゴリズムを提示します。
例1: T1とT2を、この投稿の冒頭で示した2つのツリーとします。右のツリーを左のツリーに変換するには、×の上にコスト3のツリーを構築し、4を1に変更します(合計コストは4です)。