2023-11-07
先日つくったリバーシ盤。せっかくなので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アドバイスを生成!違い、分かるでしょうか?

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS