ボナンザのソースを読む。強さの秘訣は・・・

http://anchorage.2ch.net/test/read.cgi/bgame/1233229938/

解説ではないんだけど少しずつ解読しているスレ。
C言語に自信のある方は是非参加していただきたい。

ボナンザと言えば角切りだが
スタティックな評価はそれほど低くない。

■ボナンザの駒の価値
#define DPawn 101 /* 202 */
#define DLance 254 /* 508 */
#define DKnight 267 /* 534 */
#define DProPawn 503 /* 604 */
#define DProLance 424 /* 678 */
#define DProKnight 462 /* 729 */
#define DSilver 385 /* 770 */
#define DProSilver 477 /* 862 */
#define DGold 466 /* 932 */
#define DBishop 567 /* 1134 */
#define DRook 661 /* 1322 */
#define DHorse 831 /* 1398 */
#define DDragon 1002 /* 1663 */
#define DKing 15000

■YSSの駒の価値
3.2 駒の価値
駒の価値は表3の通りである。
4、5段目の値は、駒交換を計算する場合に用いる数値で、駒の価値の2倍、
成駒の場合は駒の価値の2倍+成った価値、となっている。
持ち駒については付加点を付けている。表は1枚目の付加点で、
枚数によっても点数を変えている。例えば金の場合は
1枚目+90、2枚目+40、3枚目+10、4枚目+0、と多く持つほど付加点を少なくしている。

表3 駒の価値
歩 香 桂 銀 金 角 飛
基本価値 100 430 450 640 690 890 1040
駒が成る価値 320 200 190 30 0 260 260
持駒の付加価値 15 50 60 80 90 220 230

駒交換用(基本) 200 860 900 1280 1380 1780 2080
(成駒) 520 1060 1090 1310 0 2040 2340

やはり中盤から終盤にかけて駒の価値というのは大きく変わるものなのだろう。

あと高速化のためにビット計算を多用しているようだ。

>評価関数は int evaluate( tree_t * restrict ptree, int turn ) で計算される
>最大52種類の何かの項目について make_list() で評価し、
>玉との相対位置を考慮して線形和を計算している

52種類!
残念ながらこの項目はソースには書かれていないようだ。

保木氏による解説があるとうれしいな・・・贅沢すぎるか。