羊の人工知能研究 ~将棋AI開発の日々~

将棋、リバーシのAIプログラミングを中心にその開発過程及び記録を頑張って更新していきます。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

再帰によるチェック

 今回は前回と違って再帰によるチェックの方法を解説します。

 再帰は慣れないと難しいが、繰り返しを使うより簡単に設計できるばあいがあります。重要なのは末端での処理をどうするかということです。

 今回も『挟めれば置くことができる』という超基本的なルールを元に考えます。

 再帰といっても、考え方は同じです。今回もまず一方向について裏返す処理をつくります。←図13参照



図13:checkSubのフローチャート(再帰)


 これは、このフローチャートを見れば大体わかるように、相手の石なら再帰呼び出しをしてその戻り値を返し、自分の石が来たらtrue(置ける)を返す、それ以外ならfalse(置けない)を返すようになっています。基本は前回と同じですよね・・・(汗

 あとはこれを前回と同じようにcheck関数から各方向について呼び出す
だけです。

 と、今回と前回との違いはcheckSubのアルゴリズムだけであり、各関数の役割、呼び出し方(引数、返り値)は変わっていません。


 今回と前回で2つの裏返すアルゴリズムを紹介しました。このリバーシなどの人工知能アルゴリズムでは計算速度がかなり重要なポイントです。自分でこの2つのアルゴリズムについて計算速度の計測を行ってみました。

 予想では再帰のほうが、関数呼び出しによるスタック操作が重いと感じ遅いと思っていましたが、繰り返しよりも少し早い結果となっていました。VCを使っているので再帰関数が繰り返しに最適化されたかわかりませんが・・・

 まぁこのように一つの操作についても様々なアルゴリズムを考案し、速度計測をし、地道な努力をするのがこの研究の重要なポイントとなってくるのではないでしょか!



参考ソースファイル

2次元配列の場合
board5.h [DL]
board5.c [DL]

1次元配列の場合
board6.h [DL]
board6.c [DL]



次回予告:将棋基礎の基礎(そろそろしないとね・・・)



↓無料でクリエイター診断できます結構イイ↓



スポンサーサイト

コメントの投稿

URL
コメント
パスワード
秘密
管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://hitsujiai.blog48.fc2.com/tb.php/5-82ecfe6f
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。