先日つくった
リバーシ盤。せっかくなのでAI対戦できるようにしてみました。
「Reversi - AI step2」
まずは打てる手からランダムに打つ AI step0
export const waitHand = (rb, n) => {
const hands = rb.getHands(n);
return hands[Math.floor(Math.random() * hands.length)];
};
rbは現在のリバーシ盤を表し、nは自分の石の色を表します。打てる手一覧をgetHandsで配列で受け取り、その中からランダムな手を返しています。弱いです。
続いて、評価関数を使った AI step1
import { ReversiBoard } from "./ReversiBoard.js";
// https://note.com/nyanyan_cubetech/n/n17c169271832?magazine_key=m54104c8d2f12
const valtbl = [
[ 30, -12, 0, -1],
[-12, -15, -3, -3],
[ 0, -3, 0, -1],
[ -1, -3, -1, -1],
];
const getValue = (x, y) => {
if (x > 3) x = 7 - x;
if (y > 3) y = 7 - y;
return valtbl[y][x];
};
export const calcValue = (rb, n) => {
let v = 0;
const m = 3 - n;
for (let y = 0; y < 8; y++) {
for (let x = 0; x < 8; x++) {
const a = rb.get(x, y);
if (a == n) {
v += getValue(x, y);
} else if (a == 3 - n) {
v -= getValue(x, y);
}
}
}
return v;
};
export const waitHand = (rb, n) => {
const hands = rb.getHands(n);
let max = -1000;
let maxhand = null;
for (const hand of hands) {
const rb2 = new ReversiBoard(rb);
rb2.put(n, hand.x, hand.y);
const v = calcValue(rb2, n);
if (v > max) {
max = v;
maxhand = hand;
}
}
return maxhand;
};
明らかに角は有利で、その隣は置きたくないですね。各場所ごとの評価を数値にした表を使って、自分の合計点が最大になる手を選びます。評価表は「オセロAIの教科書 3 【基礎】 1手読みAIを作る|にゃにゃん(山名琢翔)」にて紹介されていたものを使っています。ちょっとまともになりました。
これを使って2手先を読む AI step2 を作ってみましたが、実際あまり強くない・・・。
「Reversi - Player」
リバーシやオセロの棋譜を再生できるアプリも作ってみました。研究にご活用ください。
最後に、新しく公開されたChatGPT4-turboを使ってみました。
const model = "gpt-4-1106-preview";
export const waitHand = async (rb, n) => {
const content = `黒が1、白が2で表す次のリバーシの局面において、${["黒", "白"][n - 1]}の最善手を横を右からAからG、縦を上から1から8で表す2文字のみで必ず回答してください。\n` + rb.toString();
console.log(content);
const messages = [{ role: "user", content }];
const res = await fetchJSON(apiurl, { messages, model });
console.log(res);
const hand = ReversiBoard.decodeXY(res);
if (rb.canPut(hand)) {
return hand;
}
console.log("失敗・・・");
return waitHand1(rb, n);
};
・・・が、失敗ばかりで、ちゃんとした回答が返してくれませんでした。
関数呼び出しを使った実装にもチャレンジしてみます。
読み込んでくれる量が大幅に増えたGPT4-turbo(gpt-4-1106-preview)を使って、先週分の福井県観光AIアドバイスを生成!違い、分かるでしょうか?