遺伝子の表現として次の2種のいずれかが選択できる
ビット表現:ビットストリングの長さを指定する. これをどのように区切って,いくつの遺伝子として利用するかなどは 利用者の随意である.
実数表現:上限と下限を指定して実数をビット表現に変換し, 内部ではビット表現として扱う.実数の場合は遺伝子の数は複数利用でき, 最初に指定する.
交叉には2点交叉を適用する.
選択方式としては次のいずれかを指定できる.
全個体の内,選択,交叉,突然変異を行なう範囲を指定出来る. 変数 Gapsize により制御し,最初の設定の際に Generation Gap 値で指定する. 全個体の内のこの値分が上記の処置を受け, 残りの個体はそのまま次世代に残される.
適合関数のみは利用者が作成できる.後述の利用上の注意を参照.
実行に際して20個のオプションが指定でき,各種のモードやデータ採取方法 などで実行できる.
対話モードがあり,対話的な使用ができる.
目的別の各種のファイルに出力が出され,それにより動作の解析が容易に できる.
遺伝子の表現にはつぎの3種が用いられている
複数の遺伝子が指定できる(実数型の場合)
実数型の場合,1つの実数を1つの遺伝子として表し,複数の遺伝子が使用できる.
遺伝子の個数はsetup時 に genes の値で指定する.
なお,これに関連して次の値の間の関係に注意する必要がある.
遺伝子の数(genes),各遺伝子の値(2の指数乗),ビット長の間に
遺伝子数と指数との積がビット数に等しくなければならない.
これはプログラム内ではgenes個の実数が1つのビットストリングに変換されて
処理されるためである.
1世代の実行方法として次の方法が用いられている.
「選択−突然変異−交叉−エリート選択−評価」のサイクルを全個体分実行して,
つぎに移るようになっている.
突然変異の方法は従来のものと異なり,実行時間が短くなる方式を採用している.
従来の方式では全ビットを順次辿りながら,確率により突然変異を行なうか否かを
決めているが,今回の方式は確率で次に突然変異するビットを決め,
そこに跳ぶようにしている.
適合値計算プログラムの作成 :
利用者が作成するプログラムはGAの操作に関しては適合値の計算部分のみでよい.
その他のプログラム,例えばグラフィック表示などは必要によって作成する.
以下ではこの適合値計算部分のプログラム方法を示す.
適合値は以下に示す関数 eval(str,length,vect,genes) により指定する.
double eval(str, length, vect, genes) char str[]; /* string representation */ int length; /* length of bit string */ double vect[]; /* floating point representation */ int genes; /* number of elements in vect */
実行:2段階で行なわれる.
実行結果:多数のファイルで出力される.内容は後述.
uncompress genesis.tar.Z tar xvf genesis.tar
適合値計算プログラムの作成: 利用者が作成するプログラムはGAの操作に関しては適合値の計算部分のみでよいが, グラフィック表示などはこのプログラムには含まれていないので, 利用者が必要によって作成する必要がある. 以下ではこの適合値計算部分のプログラム作成方法を述べる. 適合値は以下に示す関数 eval(str,length,vect,genes) の戻り値として与える.
double eval(str, length, vect, genes) char str[]; /* string representation */ int length; /* length of bit string */ double vect[]; /* floating point representation */ int genes; /* number of elements in vect */この関数の引数の使用方法は遺伝子表現がビットストリングか実数かにより, つぎのように変わってくる.
その他,プログラムの変更: 多くの場合は前項の適合値計算プログラムの作成でよいが,グラフィック表示や複数遺伝子表現などを採用する場合は必要に応じて変更,追加を行なう.
Makefile の修正作成: コンパイル用のMakefileを,前述の適合値計算プログラムやグラフィック関係の プログラムなどを記述したファイル名を追記,修正する.
セットアップ用ファイルの作成:各種パラメータを設定するファイルを 作成する.コマンド setup で開始し,以後はコンピュータ側の指示に従い, 入力する. 以下,例を示す.なおカッコ[]の中にはデフォルト値を示し,この値でよい場合はその ままCR(キャリッジリターン)でよい. また,各入力についてはこの後に説明している.
File suffix []: ex1 ファイル名を *.ex1 Floating point representation [y]: 以下は実数の場合を示す. n(ビットストリングの場合)はExperiment までとぶ genes: 3 実数の場合の遺伝子の数 = 3 gene 0: 入力の要なし,遺伝子の順番を表示 min: -5.12 max: 5.11 values (must be a power of 2):1024 2の10乗の1024 format: %7.2f repetition: 3 Experiment [1]: Trials [1000]: Pop Size [50]: Length [30]: Crossover Rate [0.6]: Mutation Rate [0.001]: Generation Gap [1.0]: Windowsize [5]: Report Interval [100]: 200 Structures Saved [10]: 5 Max Gens w/o Eval [2]: Dump Interval [0]: Dumps Saved [0]: Options [cefgl]: acefgL Random Seed: [123456789]: Rank Min : [0.75]:入力に対する注意事項
File : ファイルの拡張子を指定するもので,後述の各種ファイルのすべてに 同じ 拡張子が付けられる. これにより実験ごとの区別が容易につけられる.
geness : 実数の場合の遺伝子の数.なお,ここからrepetitionまでは実数関 係.
gene 0 : これから各遺伝子について指定する.0,1,2 の順に表示される. 1番目を表す.
min : 実数の最小値.
max : 実数の最大値.
\item values : 実数を表現する遺伝子(ビットストリング)の整数値. この値により実数の精度が決まる.実数の範囲をこの値で割ったものが 精度となる.2の指数乗のこと.
format : 実数を表現する際のフォーマット.C言語のフォーマットを適用.
repetiton : 上記に指定した表現を採用する遺伝子の数. 繰返し数を指定しておくと,min,max,formatの指定を遺伝子数(genes)だけ 繰返す必要がなく1回だけでよい.
Trial : 実験の全数.従ってこの値を個体数で割った数が 最大世代数になる.
\item Length : ビットストリングの長さ. 実数型の場合は遺伝子数(genes)と 遺伝子長(valuesを表す指数)との積 を 入力する.
Generation Gap : 通常は 1.0 とする.集団の全個体の内でこの割合分が 選択,交叉,突然変異などの遺伝的操作を受け, 残りはそのまま次世代に継承される.
Windowsize : 各世代で最悪の適合値を順次記憶して置き, 次の世代の適合値の計算(スケーリング)に使用する. そのために使用するウインドウの大きさ. 過去のWindowsize世代分の中の最悪の適合値を用いる. Windowsizeがゼロの時は無限大のウインドウにしたことに相当する.
Report Interval : レポートを出力する間隔を指定する. Trial の数で指定.
Structure Saved : 最良の個体のデータをこの数だけ記憶する.その値は ファイル min.* に出力する.
Max Gens w/o Eval : 性能を評価する世代間隔. この値が2の時は2世代に1回評価する.
Dump Interval : Dump ファイルを作る周期. この値が2の時は2世代に1回ダンプファイルをつくる.
Dump Saved : Dump ファイルの数. この値が2の時は2個のダンプファイルを作る. ファイル名は拡張子を順次 0,1,2 などとする.2の場合は dump.0, dump.1 と なる.
Option : オプションの指定用.次の章で述べる各オプションの記号を並べて 指定する.
Random Seed : 乱数の種を指定する整数.これを変えることにより乱数系列が 変わり,結果が変わってくる.
Rank Min : ランクによる選択において、その傾斜を決める値.前の章を参照.
実行:コマンドgo に以下のパラメータをつけて実行する. コンパイル後,実行される.
go fun1 ex1 fun1 : 適合関数のファイル名(fun1.c)の本体部分. ex1 : ケース番号を示す.入力を変えて実行するときに別の番号を取る.
rep.ex1: 実行結果をまとめたファイルであり,以下にその内容の例を示す.
rep.ex1 for ga.fun1 1995年02月28日(火) 18時04分09秒 JST Experiments = 1 Total Trials = 1000 Population Size = 50 Structure Length = 30 Crossover Rate = 0.600 Mutation Rate = 0.001 Generation Gap = 1.000 Scaling Window = 5 Report Interval = 200 Structures Saved = 5 Max Gens w/o Eval = 2 Dump Interval = 0 Dumps Saved = 0 Options = acefgL Random Seed = 123456789 Rank Min = 0.750 MEAN Gens Trials Lost Conv Bias Online Offline Best Average 0 50 0 0 0.569 2.622e+01 5.271e+00 2.795e+00 2.622e+01 3 200 0 0 0.617 1.951e+01 2.859e+00 7.049e-01 1.518e+01 7 400 0 0 0.690 1.467e+01 1.633e+00 3.097e-01 7.546e+00 11 600 1 2 0.723 1.146e+01 1.185e+00 2.485e-01 3.514e+00 注 Lost:集団の全個体の遺伝子のビットが1または0となっているビットの位置の数の 合計.このビット位置の値は交叉で変化しないので,交叉の効果を失っている 程度を示す.多様性の程度を表し,この値が多いと多様性を失っている. Conv:集団の全個体の遺伝子のビットで,1の数が FEW より少ないか,あるいは Popsize - FEW の数より多いビットの位置の数. FEW は Popsize/20 に設定している.Popsize は集団の個体の数. この数は収束したビットの数を示し,収束の程度を示す. Bias:集団の全個体の遺伝子の各ビット位置で1の数が Popsize/2 より多い場合 は1の数の合計、少ない場合は (Popsize - <1の数の合計>)を求め,それ らを累計したものを(Popsize * Length) で割ったもの. この値は1または0の偏りの程度を示す.従っ0.5 の時は1と0が同数ある ことを表す. Offline:Offsum / Trials : 各トライアルまでの最良の適合値の平均(各世代ごと) OffSumはそのトライアルまでの最良(最小または最大)の適合値の累計 Online: Onsum / Trials : 全トライアルの適合値の平均(各世代ごと) Onsumはそのトライアルまでの適合値の累計 Best :そのトライアルまでの最良(最小または最大)の適合値 Average:各世代の平均適合値
ckpt.ex1: 実行結果のさらに詳細な内容であり,以下にその内容の例を示す. なお,右側にコメントを追加して置く.
Experiment 0 1回目の実験であることを示す。 Totonline 0.000000e+00 Online の合計値 Totoffline 0.000000e+00 Offlineの合計値 Gen 19 世代数 Onsum 7.859897e+03 rep.ex1 ファイル参照 Offsum 7.836706e+02 rep.ex1 ファイル参照 Trials 1000 トライアル数 Plateau 1200 次のプリントアウトのトライアル Best 1.202000e-01 最良の適合値 Worst 3.007321e+01 最悪の適合値 Spin 0 評価開始後の世代数 Curr_dump 0 ダンプ出力の周期番号 Mu_next 159 次に交叉を行なう位置 Random Seed 1453178189 乱数のシード Initialization Seed 239974671 乱数の初期化のシード Window 最悪の適合値のデータ5回分。Worst を決めるため 2.360986e+01 1.213971e+01 3.007321e+01 6.173917e+00 6.173917e+00 110010000111111011011101110001 4.58040000e+00 0 ビット と 適合値 110010010011000111011100101000 5.92400000e-01 0 (各個体の値) 110011110101110111011100101000 2.67860000e+00 0 (以下省略) 110011001011000110011100111000 3.72300000e-01 0 110010010101111111011111111010 6.17330000e+00 0 110000010011000100011100110010 2.17400000e-01 0 010011001011000101110100011001 2.29600000e-01 0 010001001011000100011100000000 1.74100000e-01 0 0.62 1.82 0.94 4.5804 左から順に 各遺伝子(今回は3)の 0.56 0.22 0.48 0.5924 浮動小数点値及びそれから求めた値 0.41 -1.51 0.48 2.6786 今回は3個の値の二乗和 0.35 0.30 1.08 1.3789 (各個体の値) -0.35 2.25 0.32 5.2874 (以下省略)
rep.* : 実行結果の出力.プログラム report.c にて作成する.
ckpt.* : 各個体のデータなど.
in.* : 入力ファイル.プログラム setup.c にて作成する.
init.* : 個体の初期化データ.オプション-i の時はビットの初期値を乱数 ではなく,このファイルの値に設定する.
template.* : 各遺伝子の浮動小数点表示への変換のためのデータ(入力値).
schema.* : 1つの schema の状況を示す.schema の世代間の向上など. オプション - s で出力する.最初にこのファイルに schema を入力して置く.schema は 1,0,\# で表す. \# は don't care を表す.
min.* : 最良のもののデータを出力する.データ数は setup で指定する.
データの中身は各遺伝子の浮動小数点値,適合値,その世代数,トライアル数.
out.* : setup で指定したトライアルの採取間隔で結果の表示を行なう. データの内容は世代数,トライアル数,Lost,Conv,Online,Offline,Best, Ave\_currrent\_perf.
dump.0,dump.1,... : setup で指定したダンプ間隔で採取したデータを ファイルサフィックス を順次 0,1,2,... と変えて別々のファイルにセーブする.
log.* : 起動及び再起動の時のログ用ファイル.オプション'l'で動作.
log.error : エラーログ用.エラー発生時にはまずこのファイルを見ること.
a : すべての構造を各世代に評価する.
b : 実験の最後に平均の最良値を出力する.(標準出力に出す)
c : 収束状況に関するデータを採取する.
C : 特性に関するデータをファイル out.* に書きだす.周期はレポート間隔 でかつ世代の終り.オプション 'D','I' ではスクリーンに出力する.
d : 現在の集団のデータを ファイル ckpt.* に出力する.しかし, このモードでは実行速度が遅くなるので,必要な時のみ使用するのがよい.
D : ディスプレーモード.各世代の終りにスクリーンに特性値を表示する.
e : 選択にエリート方式を採用する.最良の個体は常に次の世代に残すようにする.
f : ファイル template.* に規定されている浮動小数点表示を採用する. この場合は setup において浮動小数点モードを指定すること.
g : Gray code を使用する.
i : 集団の初期値をファイル init.* に記載のものに設定する.このファイルの 個体の数が必要とするものより少ない場合は、残りは乱数で設定する.
I : 対話モード.各世代ごとにスクリーンに各種データを出力する. さらに操作を制御するコマンドを入力できる.
l : ログファイル log.* の作成指示用.
L : 最後の世代で ckpt.* ファイルにダンプすることの指示用.これにより オプション 'r' で実験を続行できる.
M : 適合値を最大にするモード.デフォルトは最小モード.
o : 実験の最後で平均特性を標準出力に表示するモード.
O : 実験の最後で Offline 特性を出力する.Offline 特性とは現在の最良値の 平均.
r : 中断後の再開が可能なモード.ckpt.* ファイルのデータを読み込んで 再開する.
R : ランクによる選択を行なうモード.
s : 1つの schema のトレースモード.ファイル schema.* には予め schema を 1,0,\#を用いて記載しておく.
t : トレースモード.トレースの表示は標準出力に出す.
double eval(str,length,vect,genes)サンプルとして二乗関数の最小値を求める例がファイル f1.c として GENESIS に当初 から添付されているので,これを参照するとよい.
ファイル名について:適合値を求める関数を記述するファイル名が f1.c と 異なる場合は makefile の下記の個所を変更する必要がある. 例はファイル名を f5.c とする場合を示している.
f=f1 を f=f5 に変更する
eval関数の定義法: 遺伝子表現としてGENESIS では 実数表現とビット表現の2種が可能であるので、 各々について記す.なおいずれを使用するかはsetup において指定する.
実数表現の場合: eval 関数の引数の中のgenes と vect[] を使用する.
ビット表現の場合:eval 関数の引数の内, str[] と length を使用する.
その他の関数:以上に述べた以外は必要に応じて利用者が自由に作成して
良い.
ただし,フィルを別に作る場合は makefile に追加ファイルの記述を追記する
必要がある.