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

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

スポンサーサイト

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

オセロの評価値を作ってみよう!

 えっと土日と横浜に行っていて昨日帰ってきたところで、マダ少しグダグダ感がありますが(>ω<;)まぁ何で横浜に行っていたかというと、ポルノグラフィティの横スタライブを見に行っていたからからなんですけどね♪♪いやぁ良かった良かった☆☆

 という話はこれぐらいで、でわでわ今回はオセロの評価値ということで今回は始めたいと思います。まずは評価値って何じゃろなって人もいると思うのでチョチョっと説明します。

 前回まで探索のことを語ってきて、評価値の事はサラッと流していました。(えっとさかのぼればこの回で少し説明しています。「価値というのは普段ゲームしているときに感じると思いますが、ゲームの途中で有利、不利、互角など感じるように、コンピュータにもそれを評価値として計算させます。」という感じで。)で、今回は実際にどのような処理をするのかについてオセロを例に挙げて語っていきたいと思います。

 では、オセオでの勝ち負けってご存知ですよね??

「えっ?石の数が多いほうが勝ちじゃねぇ~の?」

 はいその通り!!まぁほとんどの人が知っていると思います。
 では、序盤~中盤でどちらが優勢で、どちらが劣勢か判断できますか?

「・・・。」

 はい、そんな感じでしょう。僕も実はオセロの優勢劣勢ほとんど判断できません。

「ハイハイ!俺できるって!!ってか石が多いほうが優勢に決まってるじゃん!!」

 おぉ!!僕も最近までそう思ってました(汗。でも、実は違うんです↓↓

 こんな感じで、オセロをのルール知ってる人は大勢いても、実際にオセロができる(序盤から考えてできる)人はなかなか少ないものです。。

 実際にオセロで勘違いされる例としては以下のようなものがあります。
・オセロは多く取れば勝ちなので序盤からどんどん取っていく。
・オセロは隅(角)を多く取れば必ず勝てる。
・真ん中の4×4のマスから出ない方がいい!
・隅の近くを取った方が隅を取りやすい。
・辺を自分から取りに行かない方がいい!


 などなどです。。というより、上の例は自分がかつて思っていたことなんですけど。:゚(。ノω\。)゚・。
 上の答えはココにあるので参考までに・・・

 少し横道にそれてしまいましたが、評価値とは「ある盤面の途中を見せられて、どちらが優勢か劣勢かを点数をつける」ことを言います。じゃあ実際に評価値ってどうやって作るねんってことなんですけど、最初は単純でイイんです。隅は取れば優勢になります。隅を取るためには隅の隣は相手の石じゃないと取れません。こういう単純なことを盛り込んだモノを最初は作りたいと思います。方法としては、8×8のマスそれぞれに点数を付けて、そこに自分の石があればその点数を足して、相手の石があれば点数を引くという単純なもの。図30は各マスの点数を表しています。



図30:石の位置による評価


 とまぁこんな感じでプログラムの書き方も大体創造つくと思いますが、一応載せておきます。

#define WHITE -1  //白石
#define EMPTY 0 //石なし
#define BLACK 1 //黒石

//石の位置による評価値
int val_table[8][8] = {
{120, -20, 20, 5, 5, 20, -20, 120},
{-20, -40, -5, -5, -5, -5, -40, -20},
{ 20, -5, 15, 3, 3, 15, -5, 20},
{ 5, -5, 3, 3, 3, 3, -5, 5},
{ 5, -5, 3, 3, 3, 3, -5, 5},
{ 20, -5, 15, 3, 3, 15, -5, 20},
{-20, -40, -5, -5, -5, -5, -40, -20},
{120, -20, 20, 5, 5, 20, -20, 120}
};

//2次元配列のポインタ(board)を受け取って
// 黒から見た評価値を返す関数

int eval(int **board)
{
int i, j, val = 0;

for(i = 0; i < 8; i++){
for(j = 0; j < 8; j++){
val += val_table[i][j] * board[i][j];
}
}
return val;
}


 このプログラムでval += val_table[i][j] * board[i][j];となっているのは、白を-1黒を1空マスを0と定義してtable配列の中に入れているので、掛け算するだけで良いのです。そして、黒を1として定義しているので黒から見た評価値がこの関数で求めることができるのです。お分かりかと思いますが、白から見た評価値が欲しい場合は-1を掛けてやるとイイのです。

 んじゃまぁ今回はこの辺にして、もっと高度な評価値計算については後ほど・・・ノシ


次回予告:もっと正確な評価関数!



↓現在2つのランキングに参加しています↓

スポンサーサイト

コメントの投稿

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

トラックバック

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