アルゴリズムなどをPythonを使って、簡潔にかつ分かりやすく説明した素晴らしい本です。アルゴリズムをトレースしてみます。遺伝的プログラミングでは、プログラムの集合が互いに競り合い、進化します。交叉(交配)があります。良いプログラムの一部を自分のプログラムと一部と入れ替える方法です。†プログラムを進化するために、プログラムをツリー構造で表現します。†Gp.javaというファイルに、Fwrapper関数ノードで利用される関数のラーパー。Node関数ノードのクラス(子ノードを持つ)、evaluateコールによって子ノードを評価し、関数にその結果を渡し、その結果を返す。ParamNodeプログラムに渡されたパラメータノード、evaluateコールによってパラメータのインデックスを返す。ConstNode定数を返すノード。†javaでは、関数を引数に渡すことができないので、IFunctionインタフェースを持つオブジェクトを渡すことにしました。2個のノードの値を比較し、1個目が大きければ、1を返し、そうでなければ0を返すを用意します。exampletreeメソッドを追加します。†main関数に記述する代わりに、test1メソッドに最初のテストメソッドをまとめました。Gp();gp.test1();}実行すると1.08.0のように表示されます。†ツリー構造がどのようになっているかを表示するために、Nodeクラスにdisplayメソッドを追加します。v);}のようにdisplayメソッドを追加します。表示の方法は、トップのノードにdisplayメソッドを渡すだけです。exampletree();exampleTree.display(0);}では、実際にexamletreeで生成されたツリーを表示してみます。†ランダムな集合を作成するために、makerandomtreeメソッドを追加します。†makeRandamTreeメソッドのテストとして、test3を作成しました。Double(20));System.out.println(random2.evaluate(para4));}実行するたびに、異なる結果が得られます。p1evaluate20.017.0random2p1evaluate3.020.0のような出力になります。遺伝的プログラミングのテストとして、単純な数学的関数を推定するテストをします。Double(val));}を定義します。この関数を推定するために、200個のデータセットを用意します。各行は、[Xの値、Yの値、関数値]の3つ組です。(rows);}遺伝的プログラミングがどの程度正しく推定したかを算出するために、scoreFunctionを以下の様に定義します。†スコアが計算を確認するtest4メソッドを以下のように追加します。6.0score134010とかなり大きな値になります。†これから、遺伝的プログラミングの突然変異をmutateメソッドに実装します。mutateでは、のようにツリーの一部に突然変異を適応します(集合知の図11-4から引用)。mutateメソッドは以下のようになります。†では、mutateの動作を確認してみましょう。以下のtest5を追加します。hiddenset));}実行結果は、毎回異なります。†いよいよ最後の交叉を実装します。crossoverメソッドは以下のようになります(ほとんどpythonのまま)。交叉では、ツリーの完全コピーを必要としますので、各ノードクラスにcloneメソッドを追加し、NodeクラスにはdeepCopyメソッドを追加しました。†また、リストから1個をランダムに抽出するchoiceメソッドをRandam.javaに追加しました。†crossoverの動作確認をするために、test6メソッドを追加します。randam2);System.out.println("cross");cross.display(0);}何度か動作すると結構おもしろい結果がでます。必要なメソッドがすべて揃ったので、最後に進化するための環境を整えます。evolveメソッドは、以下の通りです。終了条件は、スコアが0になるmaxgen回実行したとなっています。(Node)first.get(1);best.display(0);}pythonではランキング関数をメソッド渡ししているので、IFunctionと同様にインタフェースに変更しました。†いよいよ、遺伝的プログラミングの実力を見るときがきました。0.1);}解は、1つではありませんが、例を以下に示します。p0ここで、p0がX、p1がYです。hiddenFunctionのX**2+2*Y+3*X+5を見つけることができました。以下に完全なjavaのソースを添付します。2皆様のご意見、ご希望をお待ちしております。へ〜、おもしろいですね。Y+Y+X*X+X+5+X+XをX**2+2*Y+3*X+5にするコードも欲しいですね。16:57:56多項式をきれいに整形するのは結構難しいと思います。今度、R使いの人に聞いてみます。