終盤では完全読みするように

This commit is contained in:
syuilo 2020-11-19 15:58:34 +09:00
parent a8b3d2e7df
commit ec25fc62fd

View file

@ -37,6 +37,16 @@ class Session {
*/ */
private cellWeights: number[]; private cellWeights: number[];
/**
*
*/
private maxTurn;
/**
*
*/
private currentTurn = 0;
/** /**
* 稿 * 稿
*/ */
@ -113,6 +123,8 @@ class Session {
loopedBoard: this.game.loopedBoard loopedBoard: this.game.loopedBoard
}); });
this.maxTurn = this.o.map.filter(p => p === 'empty').length - this.o.board.filter(x => x != null).length;
//#region 各マスの価値を計算しておく //#region 各マスの価値を計算しておく
// 標準的な 8*8 のマップなら予め定義した価値マップを使用 // 標準的な 8*8 のマップなら予め定義した価値マップを使用
@ -253,6 +265,7 @@ class Session {
*/ */
private onSet = (msg: any) => { private onSet = (msg: any) => {
this.o.put(msg.color, msg.pos); this.o.put(msg.color, msg.pos);
this.currentTurn++;
if (msg.next === this.botColor) { if (msg.next === this.botColor) {
this.think(); this.think();
@ -289,7 +302,7 @@ class Session {
} }
private think = () => { private think = () => {
console.log('Thinking...'); console.log(`(${this.currentTurn}/${this.maxTurn}) Thinking...`);
console.time('think'); console.time('think');
// 接待モードのときは、全力(5手先読みくらい)で負けるようにする // 接待モードのときは、全力(5手先読みくらい)で負けるようにする
@ -351,16 +364,18 @@ class Session {
let a = alpha; let a = alpha;
let b = beta; let b = beta;
const nextDepth = (this.strength >= 4) && ((this.maxTurn - this.currentTurn) <= 12) ? Infinity : depth + 1;
// 次のターンのプレイヤーにとって最も良い手を取得 // 次のターンのプレイヤーにとって最も良い手を取得
// TODO: cansをまず浅く読んで(または価値マップを利用して)から有益そうな手から順に並べ替え、効率よく枝刈りできるようにする // TODO: cansをまず浅く読んで(または価値マップを利用して)から有益そうな手から順に並べ替え、効率よく枝刈りできるようにする
for (const p of cans) { for (const p of cans) {
if (isBotTurn) { if (isBotTurn) {
const score = dive(p, a, beta, depth + 1); const score = dive(p, a, beta, nextDepth);
value = Math.max(value, score); value = Math.max(value, score);
a = Math.max(a, value); a = Math.max(a, value);
if (value >= beta) break; if (value >= beta) break;
} else { } else {
const score = dive(p, alpha, b, depth + 1); const score = dive(p, alpha, b, nextDepth);
value = Math.min(value, score); value = Math.min(value, score);
b = Math.min(b, value); b = Math.min(b, value);
if (value <= alpha) break; if (value <= alpha) break;