ひよこ将棋関連の実行ファイルは → ここ
2011-11-05
gps_normalにひよこカルロ将棋が勝てた棋譜
gps_normalとはひよこカルロ将棋は10戦やっても1回も勝てなかったのでもう永遠に勝つことはないのかと思っていたのですが、11戦目に1勝できたようです。
http://wdoor.c.u-tokyo.ac.jp/shogi/view/2011/11/05/wdoor+floodgate-900-0+hiyoko_carlo_v0.19_1c+gps_normal@0+20111105200002.csa
gps_normal側は穴熊に囲い、ひよこカルロ将棋はまた角頭の歩を突いたりしており、目も当てられない序盤ですが、gps_normalがあまりに堅陣で、自陣の評価値を過信したのか、飛車切りの暴発をしてしまいます。
ひよこカルロ将棋はそれを機に入玉してしまいまして、あとは穴熊の姿焼きが出来上がったという奇妙な将棋でした。
正直、勝てた気は全くしませんが。
勝てると思えば危険を顧みず踏み込んでくるコンピューター将棋共通の弱点が見え隠れする将棋でした。
こういう暴発を防ぐために局面の安定度(例えば相手が入玉しそうだとか、相手だけ手駒に大駒を持っているだとかすると不安定な局面だと判断する)が評価値に付随していればまた違うのかも知れません。いや、それが効果があるのかどうかも私にはよくわかりませんが。
ひよこカルロ将棋v0.20はv0.19より強いのですが
いまfloodgateで走らせているひよこカルロ将棋v0.19は実体はv0.20です。
v0.19でlesserpyon_sakura_vps_testに1敗したのでv0.20で、その棋譜を分析し、とある改良を施しました。
それがこれです。
・自分手番による連続王手ではない千日手は ( -歩の価値×2 )というマイナスの評価値をつけることにしました。これにより、形勢互角の局面では自分手番での千日手を避け、また明らかに不利な局面では自分手番の千日手を選択するようになりました。
一見すると千日手のルーチンが入っているだけのように思えますが、実はそうではありません。千日手に持ち込まれるような局面を回避するのです。
ひよこカルロ将棋は序盤で歩を突きまくるクセがあります。これは指し手生成において歩の移動を最初に生成しているので評価点が同じならば最初に生成した指し手を選択してしまうからです。
ところが、将棋において、銀の後援もなしに歩だけ浮いているという状況はあまりいい形ではありません。この形を回避したかったのです。
想定局面は、これです。
ここで後手番なのですが、ひよこカルロ将棋v0.19ではここで64歩と突いてしまうことが多く、これが傷になり終盤で損をすることがありました。
この局面、よく見ると64歩と突くと(22の角が睨んでいなければ)55角62飛(64の歩を守るための受け)66角82飛55角62飛…のような手順で千日手になります。
つまり、このように歩が浮いている状況というのは、それを守れずに千日手になりやすいわけです。
裏を返せば、千日手手順を自分の損だと認識させることによって、このような浮いた歩を突かないようになり、その結果、銀などが進出することになります。
これが奏功し、勝率アップにつながっているのだと私は思います。
floodgateの下半分はひよこが制圧しました

floodgateの下半分はひよこが制圧しました。(hiyoko_XXXXなIDばかりになったという意味で)
今度は上半分を制圧にお邪魔します。よろしくお願いします。
ひよこカルロ将棋v0.19がBlunderXX-r3851_4cに勝ったようです
http://wdoor.c.u-tokyo.ac.jp/shogi/view/2011/11/05/wdoor+floodgate-900-0+hiyoko_carlo_v0.19_1c+BlunderXX-r3851_4c+20111105040004.csa
ひよこカルロ将棋の並列化を待たずして、Blunderに一発入りました。
しかもひよこカルロ将棋、角頭の歩を突いたりしてますが。
終盤のごちゃごちゃした局面になると地力の差が出るのかも知れません。
ひよこカルロ将棋に負けたソフトは、
「駒得だけのソフトに負けてる、駒得だけのソフトに負けてる、駒得だけのソフトに負けてるorz」
と自分のブログに書かないといけない決まりになっております。
そこんとこよろしくお願いします。(嘘です)
って書いてたら、またBlunderに勝ってました。
http://wdoor.c.u-tokyo.ac.jp/shogi/view/2011/11/05/wdoor+floodgate-900-0+hiyoko_carlo_v0.19_1c+BlunderXX-r3851_4c+20111105050004.csa
Blunderの金銀4枚の穴熊を、97玉で耐え忍ぶひよこカルロ将棋。
よくこんな将棋勝てましたねぇ・・。
ひよこカルロ将棋neoの製作が始まります!!
■ ひよこカルロ将棋neoとは?
駒得だけの評価関数のコンピューター将棋プログラム「ひよこカルロ将棋」が並列探索(マルチコア対応・ネットワーククラスター化対応)によってどれだけ強くなるのかという野心的なチャレンジです。
12コアマシンを10台ほど用意してお待ちください。
期待させておいて、すごく弱かったらすみません。
私自身、マルチコア対応やクラスター対応でひよこカルロ将棋がどれだけ強くなるのかは全く想像もつきません。探索量が10倍程度に増えてもやはり勝てない相手には勝てないのでしょうか。興味津々です。
ひよこカルロ将棋v0.20(最終版)を公開しました。
ひよこカルロ将棋v0.20(最終版)を公開しました。例によってこのブログの上のところからダウンロード出来ます。
・自分手番による連続王手ではない千日手は ( -歩の価値×2 )というマイナスの評価値をつけることにしました。これにより、形勢互角の局面では自分手番での千日手を避け、また明らかに不利な局面では自分手番の千日手を選択するようになりました。
・前のバージョンから10%程度高速化しました。
・入玉勝ち宣言の機能を追加しました。条件を満たすと入玉勝ち宣言をします。
ひよこカルロ将棋はこのバージョンで最終版となります。
floodgateでの100戦はまだ終わっていませんが、勝てる相手には勝てるし、勝てない相手には勝てないという、序盤のまずさに由来すると思われる相性問題のようなものがあるようで興味深いです。
ひよこカルロ将棋の終盤の棋力的にはR2100相当はあると思うので、序盤が互角に渡り合える相手にならばほぼ負けないという半面、序盤のうちに挽回できないほど大差をつけられてしまうと全く勝てないというバランスの悪さがあります。
ひよこカルロ将棋はgps500、GA将、れさぴょんに大きく勝ち越すのでやはりR1800〜R1850ぐらいに落ち着くのだとは思いますが、Blunder、gps_normalにはまったく勝てないという上下から板挟みにされた中間管理職のような気分です。
ひよこカルロ将棋が入玉宣言を覚えたようです。
以下が判定用のコード。ご自由にお使いください。
ちなみに入玉時の勝利宣言は"bestmove win"です。私は"win"を大文字で"WIN"と書いていたため、illegal moveで反則負けになりました。うわぁぁぁ。USIプロトコルって大文字・小文字区別するんだ…。
bool Mate::IsJishogi(const Tree* RESTRICT tree)
{
// cf.http://www.computer-shogi.org/protocol/tcp_ip_1on1_11.html
//(a) 宣言側の手番である。
//(b) 宣言側の玉が敵陣三段目以内に入っている。
//(c) 宣言側が(大駒5点小駒1点の計算で)
//・先手の場合28点以上の持点がある。
//・後手の場合27点以上の持点がある。
//・点数の対象となるのは、宣言側の持駒と敵陣三段目
//以内に存在する玉を除く宣言側の駒のみである。
//(d) 宣言側の敵陣三段目以内の駒は、玉を除いて10枚以上存在する。
//(e) 宣言側の玉に王手がかかっていない。
//(詰めろや必死であることは関係ない)
//(f) 宣言側の持ち時間が残っている。(切れ負けの場合)
//以上1つでも条件を満たしていない場合、宣言した方が負けとなる。
//(注) このルールは、日本将棋連盟がアマチュアの公式戦で使用しているものである。
// (e)
if (Attack::InCheck(tree,TURN))
return false;
s32 king_rank = Attack::airank[tree->root_turn == black ? tree->board.b_king : tree->board.w_king];
Hand hand = tree->root_turn == black ? HAND_B : HAND_W;
if (tree->root_turn == black)
{
// (b)
if (king_rank >= rank4)
return false;
Score score = 0;
u32 pieces = 0;
for(BoardPosition pos = A9;pos<=I7;++pos)
{
Piece piece = BOARD[pos];
switch(piece)
{
case pawn:
case lance:
case knight:
case silver:
case gold:
case pro_pawn:
case pro_lance:
case pro_knight:
case pro_silver:
score ++;
pieces ++;
break;
case rook:
case dragon:
case bishop:
case horse:
score += 5;
pieces ++;
break;
}
}
score += Hands::Pawn(hand) + Hands::Lance(hand) + Hands::Knight(hand) + Hands::Silver(hand)
+ Hands::Gold(hand) + ( Hands::Bishop(hand) + Hands::Rook(hand) ) * 5;
// (c)
if (score < 28) return false;
// (d)
if (pieces < 10) return false;
}
else
// 後手についても同様
{
// (b)
if (king_rank <= rank6)
return false;
Score score = 0;
u32 pieces = 0;
for(BoardPosition pos = A3;pos<=I1;++pos)
{
Piece piece = BOARD[pos];
switch(piece)
{
case e_pawn:
case e_lance:
case e_knight:
case e_silver:
case e_gold:
case e_pro_pawn:
case e_pro_lance:
case e_pro_knight:
case e_pro_silver:
score ++;
pieces ++;
break;
case e_rook:
case e_dragon:
case e_bishop:
case e_horse:
score += 5;
pieces ++;
break;
}
}
score += Hands::Pawn(hand) + Hands::Lance(hand) + Hands::Knight(hand) + Hands::Silver(hand)
+ Hands::Gold(hand) + ( Hands::Bishop(hand) + Hands::Rook(hand) ) * 5;
// (c)
if (score < 27) return false;
// (d)
if (pieces < 10) return false;
}
return true;
}
このまま引っ込められると、また直接対決がないままになってしまうのか…<usa_test_2c vs hiyoko_carlo_v0.19_1c
評価関数の学習に手を出すかと思ってたんですが、予想が外れましたね。
クラスタ化でどこまで伸びるのか楽しみです。
そしてクラスタ化の次は…。大方の予想を裏切り続けることに喜びを感じるひよこでした。
<GPS_normal相手に謎の509秒長考。
駒得だけのソフトにレーティングで負けました(と自分のブログで書くべき?)。
で、直接対戦が実現したとしても、負けるという予想ですw
序盤できちんと差を付けられる気がしないので。
詰め将棋関連のハッシュテーブル(序盤ではほぼ参照されない)が、スワップを起こしていたようです。
(序盤でスワップアウトされてしまい、中盤、詰め将棋が頻繁に呼び出されるタイミングで問題が顕在化…という仕組みです。)
が…。実際に対処をするのは大変…。
(いや、まぁ、マシンにメモリを増設するのが一番簡単?)
どこかのハッシュ容量削れば全部オンメモリでスワップされずに動くかなぁ…???
#結局、やはり、他のプロセスを色々動かしているマシンで動かすのは無理があるようです…。
他のプロセス落としまくってから、再チャレンジ…かな?
ひよこのいる間に水門をくぐれるのでしょうか…。
ひよこもうさぎも本来水の中では生活できませんからねぇ…。