続・オセロの評価関数について
Posted: 2011年8月20日(土) 01:51
前スレッド(http://dixq.net/forum/viewtopic.php?f=3&t=8920)が長くなってしまったので、こちらのスレッドに移行します。
softya(ソフト屋)さん、探索経験者さん、返信ありがとうございます。
とりあえず、探索木を表示するのは最後の手段ということにします・・・
>とりあえず全部表示しても見れないので確定した時のネスト毎の評価値を配列にでも保存しておいて、最終確定時に今回の評価値詳細として表示するのはどうでしょうか?
主に表示の仕方が難しそうです。ただデーターを羅列するだけなら簡単なのですが、CUIで目で見て一発で分かるというわけには行かなそうです。
探索経験者さんが教えてくださったソフトも良さそうでしたが、
その書式を調べるので一日がかかってしまいそうなのでw
が、いざとなったらこのソフトを使います。ありがとうございました。
では本題に。
>探索経験者さん
なるほど。now_turnだけでなく、rev_turnの評価値も考慮して、その差を利用する、という形ですね。
確かに、自分にとって一番よい手を選んでも、それによって相手も有利になってしまっては困りますね。。
アドバイスありがとうございます。
それをプログラムに組み込んでみました。具体的には、 を にしました。
が余り動作が変わらなかったので、なぜかなーと思って3日くらい考えてみました。
で出た結論が、「相対的な評価値にしたことによって、探索するときはCOMの場合でもPLAYERの場合でもmax値を採用しなければならなくなった」
というものです。これって正しいでしょうか?
試しにtansaku関数の
を
こうして見たところ、出力された評価値がいい感じにばらけていて、またしっかりと中割りしてきます。
がこれが(探索のアルゴリズムから見て)正しい動作かどうかが分かりません。
アドバイスお願いします。
softya(ソフト屋)さん、探索経験者さん、返信ありがとうございます。
とりあえず、探索木を表示するのは最後の手段ということにします・・・
>とりあえず全部表示しても見れないので確定した時のネスト毎の評価値を配列にでも保存しておいて、最終確定時に今回の評価値詳細として表示するのはどうでしょうか?
主に表示の仕方が難しそうです。ただデーターを羅列するだけなら簡単なのですが、CUIで目で見て一発で分かるというわけには行かなそうです。
探索経験者さんが教えてくださったソフトも良さそうでしたが、
その書式を調べるので一日がかかってしまいそうなのでw
が、いざとなったらこのソフトを使います。ありがとうございました。
では本題に。
>探索経験者さん
なるほど。now_turnだけでなく、rev_turnの評価値も考慮して、その差を利用する、という形ですね。
確かに、自分にとって一番よい手を選んでも、それによって相手も有利になってしまっては困りますね。。
アドバイスありがとうございます。
それをプログラムに組み込んでみました。具体的には、 を にしました。
が余り動作が変わらなかったので、なぜかなーと思って3日くらい考えてみました。
で出た結論が、「相対的な評価値にしたことによって、探索するときはCOMの場合でもPLAYERの場合でもmax値を採用しなければならなくなった」
というものです。これって正しいでしょうか?
試しにtansaku関数の
if(!iscomturn) {
if(value>max) {
max=value;
}
if(n==first_n){
hyoukati[putable[i]]=max;
printf("hyoukati[%d]=%d(max)\n", putable[i] ,max );
}
} else {
if (value<min) {
min=value;
}
}
if(value>max) { /* 石を置いてみた後の手が相手(=Not COM)の場合は子節点の評価値のうち最大の値をvalueに格納 */
max=value;
}
if(n==first_n){ /* 石を置いてみた後の手が相手(=Not COM)の場合で、この関数が始めに呼ばれた場合 */
hyoukati[putable[i]]=max; /* 評価値配列に書き込み */
printf("hyoukati[%d]=%d(max)\n", putable[i] ,max );
}
がこれが(探索のアルゴリズムから見て)正しい動作かどうかが分かりません。
アドバイスお願いします。