今日もプログラミングな話。
 私の思考の過程を記述したものなので、中身が薄いかも。ごめん。
 あと、読んでて「せこ(仮名)って馬鹿?」と思っても、突っ込まないように。私も普段からそう思いつつ、騙し騙し生きているのだから。


 言い訳が終わったところで、本題。
 11月7日の日記で、「initializeが多重定義できない」と書いたけれど、昨日はそのことで少し悩んだ。
 遺伝子を生成するときに、「親となる遺伝子があって、それを交叉して作る場合」と「親となる遺伝子がない場合」の二通りが必要だったのだ。前者は遺伝子を進化(?)させるときに使い、後者は、最初の最初で個体を初期化するときに使う。
 これを、「initializeが多重定義できない」と言う条件のもと、どう実装するか、というのが今回の問題。

 「交叉」という聞きなれない単語があるので、私は「『親から作る場合』と『親なしで作る場合』がある」と単語を置き換えて思考した。


 解決法として、私が考えたのは
1.initialize中では、初期化しない。後で、別のメソッドで初期化する。
2.どちらか一方の初期化を特別視する。
というもの。

 まず、案1の方について考える。
 これは、できれば避けたいと思った。「生成と初期化がセットになっている」という実装の方が、分かりやすいからだ。

 で、案2。これは、「一つ基本的な初期があって、他の初期化はそれを特化したもの」って場合だと、きれいな感じの実装になると思う。案1を採用しなかった理由で言っていることと、少し矛盾している気もするが、私の中では許容範囲。
 しかし、今回は案2もどうにも…。「インスタンスを生成する」ということ以外、初期化に共通性を見出すことが私はできなかった。


 で、私は一歩手前に戻った。「『親から作る場合』って考えかが美しくないのだ。すでに存在する遺伝子同士を混ぜ合わせるって考えればいいんだ」と、私は思いついた。

 すなわち、「新しく作る」っていうのは一種類にして、もう一つは「混ぜる」と考えることした。

 「混ぜる」の方の手順としては、
1.優秀な遺伝子をコピーする。
2.そいつに別の遺伝子を混ぜる。

 実装的には、次のような感じ。
individuaA = Marshal.load( Marshal.dump(individuaOrg) ) #コピー
individuaA.cross(individuaB, crossingPoint) #混ぜる


 結局これを採用した。
 悪くない実装のような気がするけれど、なんだかすっきりしない。
 今回の場合は、そこそこうまくいったけれど、これがいつでも通用する気はしない。
 って、わけで実際に使ってないけれど、別の方法も考えたりしてみた。
 明日、気が向いたら、その別の方法について。

コメント