/*------------------------------------------------------------- GAサンプルテストプログラム このプログラムによって以下のファイルが作製されます。 ○ max_avg.log 評価の推移の記録。 評価の最大値、平均値を各ステップ毎に記録。 ○ ans.dat 最適化された x, y の正規値。 評価関数にこの値を入れると、評価の最大値を 与えます。 N_Ele だけ、 解を与えます。 ans.dat = [ [ x11 x12 .... x1(N_Gen) ] [ x21 x22 .... x2(N_Gen) ] [ . . .... . ] [ . . .... . ] [ . . .... . ] [ x(N_Ele)1 x(N_Ele)2 .... x(N_Ele)(N_Gen) ] -------------------------------------------------------------*/ Func void main(){ List ini_para; /* 設定データリスト */ Matrix Ans; /* 答え用のマトリクス */ Integer N_Ind; /* 生物個体数 */ Integer N_Ele; /* エリート個体数 */ Integer N_Gen; /* 遺伝子本数 */ Integer L_Gen; /* 遺伝子ビット数 */ Integer Exch; /* 世代交代回数 */ Integer Seed; /* 乱数の種 */ Real Cross; /* 遺伝子交差確率 */ Real Mutate; /* 突然変異確率 */ Matrix GA_opt(); /* GAプログラム */ N_Ind = 20; N_Ele = 5; N_Gen = 2; L_Gen = 10; Exch = 50; Seed = 5; Cross = 0.1; Mutate = 0.05; ini_para = { N_Ind, N_Ele, N_Gen, L_Gen, Cross, Mutate, Exch, Seed }; Ans = GA_opt( ini_para ); print Ans >> "ans.dat"; } /*-------------------------------------------------------- 適応度 関数 fitnessfunction() 引数の Matrix pheno は 各個体が持つ変数データが 入っています。 具体的には pheno = [[ x1, x2, x3, ......... x_{G_Num}]] と、自分が指定した遺伝子の本数分だけ 変数があります。 この変数は 0.0 <= pheno(1,x) < 1.0 の範囲で正規化され ており、その制度は遺伝子長のビット数で決まります。 ( 10bit なら 1 / 1024 ... 0.001 ) このサンプルプログラムでは xy 座標の位置に対して z の大きさを求め、一番 z が大きくなる様な xy 座標 を求めています。 x1 -> x x2 -> y fitness -> z z = 10 * ( ( 1 - x ) + y ) --> 最大は 20 ( x = 0, y = 1 ) プログラムを実行すると、この値に近付くように最適化が 進みます。 この程度の領域であれば 0.001 刻みで 全域を探索した 方が遥かに速いのですが、もっと最適化パラメータが増え る場合(5ー6次以上でしょうか?)は GA を用いた方が 速くなるとされています。 ----------------------------------------------------------*/ Func Real fitnessfunction( pheno ) Matrix pheno; { Integer g_num; Integer i; Real fitness; Real x1, x2; g_num = Cols( pheno ); x1 = pheno( 1, 1 ); x2 = pheno( 1, 2 ); fitness = 10.0 * ( ( 1.0 - x1 ) + x2 ); return fitness; }