研究報告

1.先週からの課題

先週からの課題として,SGAプログラムがどのプロセッサからも同じ解を出す問題があった.

2.研究報告

今週行ったこと

 先週からの課題を検討するため乱数を発生させているプログラムをみたが,μ秒単位で乱数の発生条件が

変わっているためこれが原因でないことがわかった.

 次に,世代数や個体数が少ないために解が同じ値に収束するのではないかと思い,個体数,世代数を100から1000

に変更して行ってみたが,結果は同じだった.

 よくよく調べてみると,原因は単純にSGAのプログラム中に秒単位で乱数を発生させるsrand(NULL)がまぎれていたためだった.

また,個体数,世代数を1000で実行すると実行結果があまりにも遅いので,今週はSGAプログラムを速くするための修正を行った.

まず,初期値と多様化した実行結果を示しておく.

表1 初期値

世代数 100
個体数 100
交叉率 0.8
遺伝子長 40
突然変異率 0.05
設計変数 2

表2 実行結果

実行結果1 実行結果2
-0.0795624637 -2.0433176169
-0.0266461733 -0.0003296628
-0.0039166897 -0.1820949168
-0.2826233848 -0.1676653510
-0.0043588876 -0.9959879138
-1.3103095819 -0.9952015521
-0.0404690394 -1.2585687400
-0.3711925315 -0.9955464647
-0.9950254143 -0.3922345982
-0.0198327157 -1.3019694992
-0.0000000000 -0.0000000000
-0.0000000000 -0.0000000000
-0.0000000000 -0.0000000000
-0.0000000000 -0.0000000000
-0.0000000000 -0.0000000000
-0.0000000000 -0.0060178245

また,どのくらい速度が向上したかを示す.

処理速度と呼び出し回数を調べる方法にはコンパイル時に-pg,-a,-gオプションをつけて,まず,

実行させる.実行結果が出た後に,

gprof 実行ファイル > 処理時間等を出力するファイル名

と入力すると,出力ファイルが出来上がっている.

出力結果はこのようになる.

図1 出力されたファイル (値は修正後のプログラムのもの)

表3 修正前の実行時間

time % seconds calls name
86.34 1.58 100 select_indiv(Individual *, int)
6.01 0.11 200449 Individual::operator=(Individual const &)
2.73 0.05 230936 MTRand::genrand(void) const
1.64 0.03 100 mutate(Individual **, int, double, int)
1.09 0.02 10201 Individual::decode(void)

total time 2.04

表4 修正後の実行時間

time % seconds calls name
10.26 0.04 100 Selection::Selection(Individual *, int)
0.00 0.00 10000 Selection::select_indiv(void) const
0.00 0.00 100 Selection::~Selection(void)
0.00 0.00 100 select(Individual *, int)

total time 0.39

修正前のプログラムでは,

・選択される個体の初期設定

・選択作業

・終了設定

の動作を1つの関数で行っていたため,1個体を選択するのに初期設定,終了設定が毎回実行されて

非常に効率の悪いプログラムであった.修正後は選択作業のみをループさせるように変更したので表のように

実行速度が向上した.

あとは,potateで動作するビデオカードが手に入ったので,ようやくパソコンのメインがDebainで

動作できるようになった.

3.問題点,今後の課題

DGAに改良する前にプログラムの問題を解決できた.

今後は移住先の決定方法をどのようにするかなどを検討しながら実際の作成に入りたい.

また,パラレルGAゼミの資料を読んでゼミの準備を開始したい.