2010年4月10日 山下 宏 playoutの打ち切り手数と19路盤でのコミの調整 19路で対局中のコミを変えることによって若干強くなった コミを固定(6.5目)だと ・勝っている時にぬるい手を打つ (自陣を埋めるだけ) ・負けている時に無茶な手を連発する (勝負手を放つので成功する場合もあり) コミの変動のさせかた、 1回目のplayoutで15目勝ち 2回目のplayoutで20目勝ち 3回目のplayoutで 7目勝ち 平均 (15+20+7)/3 = 14目 これを次回のコミ(14.5目)とする 勝率 勝/全局数 0.544 336/617 2手前の結果でコミを変動 0.456 286/626 最初の100playoutの結果でコミを変動 0.428 134/313 コミは一定 GnuGo相手に2500playoutで 実際の実装。 序盤では変動は大きく、終盤(240手)では通常のコミ(6.5)に。 double latest_komi = get_valid_latest_komi(); double stones_per = pgo->occupied_percent(); // 100手で0.27、200手で0.55、250手0.69、300手で0.83程度。 double t = (1.0 - stones_per)-0.5 + 0.05; // 200手ぐらいまでは0.70ぐらいで250手で0.10、300手で0.00が理想。 double per = 1.0 / ( 1.0 + exp( -20.0*t)); // sigmoid関数。 if ( per > 0.95 ) per = 0.95; int diff = (int)(latest_komi - original_komi); diff = (int)(per * diff); komi = original_komi + diff; // 序盤では大きく動かし、終盤では小さく パラメータを変えると? 勝率 勝/全局数 0.523 317/665 per = 1.0 / ( 1.0 + exp( -20.0*t)); t = (1.0 - stones_per)-0.5 + 0.05; 0.522 189/396 per = 1.0 / ( 1.0 + exp( -10.0*t)); t = (1.0 - stones_per)-0.5 + 0.05; 0.483 284/550 per = 1.0 / ( 1.0 + exp( - 5.0*t)); t = (1.0 - stones_per)-0.5 + 0.05; 0.451 304/554 per = 1.0 / ( 1.0 + exp( -20.0*t)); t = (1.0 - stones_per)-0.5 + 0.00; 0.510 233/476 per = 1.0 / ( 1.0 + exp( -20.0*t)); t = (1.0 - stones_per)-0.5 - 0.05; 0.476 233/476 per = 1.0 / ( 1.0 + exp( -20.0*t)); t = (1.0 - stones_per)-0.5 + 0.10; あまり凝ったことをしても逆効果 2手前の結果ではなく、2手前、4手前、6手前、の平均だと? 勝率 勝/全局数 0.399 399/1000 コミ一定 0.429 429/1000 移動平均1手 (これは上と同じ) 0.438 243/ 554 移動平均2手 0.446 446/1000 移動平均3手 0.460 460/1000 移動平均4手 大差はないが4手の平均が一応最大 0.429 429/1000 移動平均5手 2000 playouts gnugo3.7.10 ,19x19 実際の形勢の変動の一例 moves= 7 adjust komi= 5.5,latest= 4.3,occupy=0.1,per=0.95,diff=-1 moves= 9 adjust komi= 6.5,latest= 4.7,occupy=0.1,per=0.95,diff=0 moves=27 adjust komi= 6.5,latest= 8.1,occupy=0.2,per=0.95,diff=0 ... jump for book move. moves=29 adjust komi= 6.5,latest= 7.4,occupy=0.2,per=0.95,diff=0 moves=31 adjust komi= 4.5,latest= 2.8,occupy=0.2,per=0.95,diff=-2 moves=33 adjust komi= 6.5,latest= 6.8,occupy=0.2,per=0.95,diff=0 moves=35 adjust komi= 6.5,latest= 4.9,occupy=0.2,per=0.95,diff=0 moves=37 adjust komi=12.5,latest=13.9,occupy=0.2,per=0.95,diff=6 moves=39 adjust komi=11.5,latest=13.0,occupy=0.2,per=0.95,diff=5 moves=41 adjust komi= 7.5,latest= 9.4,occupy=0.2,per=0.95,diff=1 ManyFacesでは置石がある場合は、 6子局なら、6*7=42目のコミ、を無理やり与えて90手目で消えていく 調整で効果があった、とのこと。(ManyFacesが黒番の時) playoutが死活の判定を間違えて、「勝ってる!」と思っている局面でも 緩まずに打ち、最後に死んでるのに気づいたときも、ぎりぎり間に合う、 といったケースも時々ある。 9路でも変動させると? 0.453 453/1000 コミ変動(2手前の結果で) 9路では効果なし 0.500 500/1000 コミ変化なし(5割はたまたま) Fuego 10000 playout、Aya 8000 (Fuegoは 2009/12/15版) Aya's playout is 8000, Fuego is 10000. playoutを打ち切る手数を短くすると? 通常は最後まで打ち切る。 19路だと500手を超えたりする playoutを開始する局面から、何手で打ち切って勝敗判定をするか 勝率 局数 打ち切り手数 0.461 911 321手 0.460 1000 341手 0.460 751 361手 17%高速に(初手では) 0.493 513 381手 0.449 726 401手 5%高速に(初手では) 0.420 1000 421手 0.453 554 441手 0.448 832 501手 361手程度で打ち切っても大差なし GnuGo相手に。2000playout 361手で打ち切れば序盤は若干の高速になる。 UCTで5手進んだ局面から361手で打ち切る、という感じ 9路での打ち切り手数 0.119 41手 0.290 51手 0.424 61手 0.468 71手 0.480 81手 81手だと15%高速(初手で221手と比べて) 0.497 91手 91手ぐらいで問題なしか 0.494 101手 0.487 111手 0.457 121手 0.469 131手 0.518 221手 Fuego相手。1000局 打ち切った局面では 4方向を同じ色で囲まれている空点、石を数える ※最後に、ダメ1しかない石は死んでいるとして計算。 19路で361手、9路で81手程度で打ち切っても 棋力にはそれほど影響はなさそう。