mirror of
https://github.com/syuilo/ai.git
synced 2024-11-24 22:01:07 +00:00
終盤では完全読みするように
This commit is contained in:
parent
a8b3d2e7df
commit
ec25fc62fd
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue