初期個体群の生成1

【内部主要記事】

【本文】
 さて、今日は「個体群を作成する関数」を作ることにしました。コレを無事作り終えたなら、初期化の機能まで組み込めることになる。…ふむ、順調か?この関数の作成に参考文献に付属しているCLISPのコードを参考にしました。ソコに収録されているプロシージャ create-population をschemeへ移植するだけなんですけどね。
 create-populationのアルゴリズムは大体以下のようなものです(本文は英語です)

  • Creates the population
    • コレは size-of-population の大きさの配列です。この配列は個体群を記録するために初期化されてます。各固体の「プログラム」スロットは第1のNプログラム(seeded-program?)を除いて適切な任意のプログラムに初期化されます。これらの最初のN固体は seeded-program によってそれぞれ初期化されます。この seeded-program はデバッグに役に立ちます。

で早速動作に疑問が出ました。初期個体群の生成をする手前に場所に書いてあるのですがよくわかりません。以下schemeに書き換えたプログラム。

;;テストのための暫定的な変数設定
(define *max-depth-for-new-individuals* 5)
(define minimum-depth-of-trees 1)
(define full-cycle-p #f)
(define individual-index 4)

        (if (eq? 0 (modulo individual-index
                          (max 1 (- *max-depth-for-new-individuals*
                                 minimum-depth-of-trees))))
          (set! full-cycle-p (not full-cycle-p)))

コレは、

  • individual-index が奇数なら、必ず # になる。
  • individual-index が偶数なら、実行するたびに #t #f を切り替える。

という動作のようです。しかしコレはいったい何をやっているんだろう?
#、#t、#fでその後の動作がどうなるか、まだ不明(後日に期待)。

このプログラムでは when が出てきます。このwhenは scheme の標準関数ではないので一応書き換えておきます。gauche では使えるんですけどね。で、このwhenはいったい何か?
以下を見る限り、whenは条件を満たしたら式を実行、満たさなければ実行しないみたいです。

gosh>
(let ((i 0))
  (when (= i 0)
    (display "abc")))
abc#<undef>
gosh>
(let ((i 0))
  (when (= i 1)
    (display "abc")))
#<undef>
gosh>
(let ((i 0))
  (when (= i 1)
    (display "abc")
    (display "ABC")))  <----ifと違って代替式を実行するわけではない。
#<undef>

どうやら、whenはifと似た動作をするようです。

                ;; 個体数より seeded-program が多ければ
                (if (< individual-index (length seeded-programs))
                    ;; 種となる個体の選択
                    (nth individual-index seeded-programs)
                    ;; 新しいランダムプログラム作成
                    (create-individual-program
                      (case *method-of-generation*
                        ((full grow) *max-depth-for-new-individuals*)
                        ((ramped-half-and-half)
                          (+ minimum-depth-of-trees
                             (modulo individual-index
                                  (- *max-depth-for-new-individuals*
                                     minimum-depth-of-trees))))) ;allowble-depth
                      #t ;top-node-p
                      (case *method-of-generation*
                        ((full) #t)
                        ((grow) #f)
                        ((ramped-half-and-half)
                          full-cycle-p)))))) ;full-p

この動作は個体を生成するようです。初期個体群を用意するに当たっては

  • ランダムプログラム作成して初期個体群の1つとする。
  • あらかじめ seeded-program というプログラムのセットをどこかに用意しておいて、それを初期個体群の1つとする。

という2つの方法があるようです。で、この seeded-program を検索してみたら、サンプルコードのドコにも載っていない。コレは重要なんだろうか?。とりあえず seeded-program を作るか、全てランダムコードにするかしなければならないようです。さて、後日の課題に「seeded-programの作成」を追加すべきか、それともランダムコードのみでいくべきか悩みどころ。


(本文のアシスタント的な人:ネオン)