ごいたコマンドアプリの紹介

ごいたが遊べるコマンドラインツールを作成しました。

こんな画面です。

ごいたコマンド

インストール方法等を説明します。

インストール手順

Windows, Linux, MacOS で手順は共通です。

Node.jsをインストールする

Node.jsダウンロードページへ行き、LTS版をダウンロードします。

https://nodejs.org/

お使いのOSに合ったものがダウンロード候補に表示されます。

インストール手順はこちらを参考に。
npmパッケージマネージャーはこのあと使用するので、インストールオプションから外さないようにしてください。
環境変数PATHへの追加のオプションも外さないようにしてください。

うまくいきそうな参考サイトをピックアップしておいたので、なんとかうまくやってください。

コマンドプロンプト(端末・Terminal) にて、以下の2つのコマンドを打ち、バージョンが表示されたら次のステップへ進むことが出来ます。

1
2
node -v
npm -v

Node.jsのバージョン確認

goita-cli をインストールする

以下のコマンドを実行します。

1
npm install -g goita-cli

Windowsなら管理者権限、Linuxなら sudo が必要になるかもしれません。

アップデート手順

今後、コマンドツールに更新があった場合にすでにインストール済みの場合は以下のコマンドで最新化します。

1
npm update -g goita-cli

アンインストール手順

ごいたコマンドのアンインストールには

1
npm uninstall -g goita-cli

Node.jsのアンインストールには、それぞれのOS毎のアンインストール手順を実行してください。

遊び方

以下のコマンドでゲームが起動します。コマンドプロンプト(端末・Terminal)の大きさはある程度縦長にしておかないと表示しきれません。

1
goita game

もし相方が5しの場合、続行(continue-to-play)配り直し(redeal)の選択が表示されます。
続行ならば、 y をタイプしてEnter
配り直しならば、 n をタイプしてEnter
で進めます。

1
2
3
4
your partner has 5 shi
-----------------------
do you wish to play?
yes/no>

操作手順は、自分の番が回ってきたら、受け駒選択、またはなしを入力します。
キーボードを使って駒に対応した半角数字1〜9または、なしに対応する0を入力して、Enterキーを押します。

1
2
5: 金, 8: 王, 0: なし
select block koma>

なし以外を選択した場合は、続けて攻め駒を入力します。

1
2
3
4
5: 金, 8: 王, 0: なし
select block koma>5
1: し, 2: 香, 3: 馬
select attack koma>

対戦相手のコンピューターについて

現状のバージョン 0.0.5では非常に弱いです。
手応えのあるやつらに出来るようにしたいので、強くするアイデアはいつでもお待ちしています。
何かアイデアがありましたら、

Twitter: @GoitaOnline

にメッセージをくれるとありがたいです。

また、コンピューターの実装は
https://github.com/Goita/goita-ai-sample-js
にありますので、ご自由に改造してPullRequestいただけると嬉しいです。

プログラムソースコード

githubのGoita Organizationにソースコードを置いています。

ちょっとごいた関係のプログラムを書きたくなった・・・ そんな場合は

Goita Core Library - https://github.com/Goita/goita-core-js

をご利用ください。

AI実装手法のメモ

月日が経つのは早いもので、前回の投稿が約1年前ということに驚きを隠せません。
ごいたオンラインも、もうそれくらい長い間稼働しているのですね。

最近ごいたソフトウェアをこそこそと作成しているので、開発ブログのほうも更新しましょう。

まずは、ずっと前にメモしたAI実装手法のメモを公開します。

ちなみに、全プレイヤーが最善手を目指して打つという前提で考えています。

ごいたAI的な用語

手の評価
手の評価とは、この受け・攻めまたはなしを行った場合に、自分のチームが何点獲得するかを数値化することを指します。
自分のチームが20点上がりするなら、 +20
相手チームが30点上がりするなら、 -30
自分が上がる場合と、相方が上がる場合とで評価に差をつけることも考えられますが、一旦これは考えないことにします。

予測
相手の残っている手駒を予想することです。

盤面
ごいたの場のことです。打ち出し(1手目)、序盤(2〜4)、中盤(5〜7)、終盤(8〜)に分けて考えることにします。

ごいたのプレイヤーが入手可能な情報

ごいたAIに渡せる情報の一覧を整理します。

場の情報

  • 自分の手駒 8個
  • 場に出された駒 0〜24 (駒は32個あるが、24を超える=誰かが上がる)
  • 自分が出した駒の伏せ内容

行動履歴情報

  • 各プレイヤーの受け・攻め・なしの履歴

不明情報

  • 対戦相手2人と相方の手駒
  • 自分以外の伏せ駒

ごいたAIに使用できる手法

完全読み

手駒の情報がすべて判明している場合に、すべての取りうる手を試して、プレイヤー全員が最善手を打った場合に、誰かが上がるまで盤面を進め、何点獲得できるかを読みます。

Min-Max法(α-β法)などを使用して、ゲーム木探索を行います。

全員の手駒情報が判明している場合にしか使えないので、相手の手駒を予測する手法と組み合わせて使用することになります。

特徴

  • 隠された情報の予測精度が高くなればなるほど有効な手法。
  • 序盤から完全読みを行うことは、可能性が多くなりすぎるため、現実的な計算時間では終わらないので、12駒程度(6手番)が過ぎた段階までは使えない。

用途

  • 棋譜の解析を行う場合に、手の評価をする
  • 手駒を予測する手法と組み合わせて、予測した結果で手の評価をする

先読み

完全読みとは異なり、何手番分読むかを決めて、先の展開を考えることです。

AIが内部的にごいたの盤面を進めて、進めた結果自分に有利か不利かを評価し、手を評価する。

特徴

  • 最終盤面まで進めないため、計算時間が少なく済む。
  • 読みの精度は途中の盤面を評価する手法の精度に大きく依存する。

用途

  • 序盤の手を評価する。

モンテカルロ法

ランダムに試行を重ねることで、妥当な結果を確率的に導き出す手法です。

相手の駒をランダムに予測して、何十回、何百回と完全読みを行うことで、どの手を採用した場合に最善となりそうかを予測します。

特徴

  • 正確なアルゴリズムがなくとも、ある程度妥当な結果を導き出せる。
  • 数多くの試行を行うため、計算時間が少ない評価手法と組み合わせる必要がある。

用途

  • 終盤の完全読み
  • 中盤の読み

ルールベース評価

いくつかのルールを設けて手の評価を行う手法です。

評価ルールを全てリストアップして実装していくことになります。例えばが4枚あればから攻める手を評価値高めにするとか。

評価ルールを何個も実装していくと、どのルールの評価をどのような配分で採用するべきか、調整が難しくなります。その場合は、GA(遺伝的アルゴリズム)などを使用して、最適なルールの優先度を決めるのが良いと思います。

特徴

  • ルールで決めた通りに手を評価する
  • ルールを網羅するのが大変

用途

  • 打ち出し(1手目)の評価
  • 5しの場合の判断
  • 王玉や4しなど、明らかに有効な手順が明確に決まる場面
  • 打ち方に特徴のあるコンピューターごい打ちを再現する場合(ゲームの敵キャラとか)

機械学習(ディープラーニング)

場の情報などを与えて、有利不利の評価をする手法です。

何の情報を与えて、何を評価させるかというのを考えることも重要なので、用途例を。

初手の打ち出し評価
初手の持ち駒だけを評価します。

5しの続行判断
これも持ち駒だけを評価します。

盤面評価
現在の場面で自分がどの程度有利か評価します。

手駒予想
自分意外のプレイヤーの残り手駒を予想します。

自分の残り手駒、場の状態などを与えて、それが良いか悪いかを教えてあげる作業を10万回〜100万回程度行うことで、盤面評価が出来るように学習させます。

特徴

  • 入力する情報と、評価軸をしっかりと定めることで、うまく評価してくれることが期待できます。
  • どんな評価がどの程度正確にできるかは未知数。

用途

  • ルールベースの手法では評価精度を高められない場面の評価
  • 人間を超える評価基準を持たせる

まとめ

5し判断、打ち出し、序盤〜終盤と、場面によって有効な手法があるので、うまく作る必要があります。
基本的に機械学習は、人間の感覚とは外れた、良い手を評価できる可能性があるので、全ての場面で期待が持てます。

  • 5し判断: ルールベース or 機械学習
  • 打ち出し: ルールベース or 機械学習
  • 序盤・中盤: 相手の持ち駒予測 + モンテカルロ法 + 先読み
  • 終盤: 相手の持ち駒予測 + モンテカルロ法 + 完全読み

ごいたAIの実装手法

しばらく間が空いてしまいましたね^^;
すこしプログラミング欲がでてきたので、ここも書いてしまいましょう。

ごいたAIをどう作るか?という点について

ごいたのAIを作成するためのアプローチは大きく分けて、2通りあります。

  1. ルールベースの実装

  2. 機械学習による実装(本命)

それぞれどういうことか、説明しましょう。

ルールベースの実装

コンピューターが人間の仕事を手伝ったり、置き換わったリするようになって、35年以上経ちました。その間にAIを作成しようという動きは何度かありまして・・・
エキスパートシステムというものを聞いたことがあるでしょうか?エキスパートシステムは、普通であれば大量の知識を抱えた専門家(法律家とか税理士とか、技術屋もですが、そういう人です)に代わって、ある問に対する答えを返すというものです。これを使って業務等に活かしていこうという研究や開発が行われていたこともありました。実装方法はというと、ものすごく大雑把に言えば、

○○ならば××する

というルールを大量に覚えさせて、最終的な答えを導き出すものです。

ごいたは駒の数が、他のゲームに比べれば比較的少なめなので、作成するべきルールも、数えることが出来る程度に収まってくれるのではないでしょうか。それでも数十個のルールを組み込む必要はありそうです。

例えばですが

  • 3香以上持っていれば、攻めは香から行う
  • 王玉があれば、2回目の攻めは王で行う
  • しかし、王玉があっても、角角 or 飛飛があれば2回めの攻めはそちらで行う

とか、そういうのですね。書けば書くほどキリがない気もします。
書いたら書いたで、それはごいたの考え方という解説書になるほど書けるのではないでしょうか。

ルールベースの実装とは、こういった場面毎の判断基準をすべてプログラムに組み込んで、最適な手を判断させる方法です。
これでも、まあ、対戦してて不足のない相手は作れるでしょう。

機械学習による実装

最近、この話題アツいですよね。自動運転車とか、ディープラーニングとか、ニューラルネットワークとか、画像認識、自然言語処理、、、とか。

現実に実用化されているものでは、Facebookの顔認識機能や、Google翻訳は便利ですよね。
これらは、以前はルールベースで判断などをしていたものを、人工知能の研究が進むことで、機械学習の手法に置き換わっていったものです。プログラムは何をしているかというと、正解やお手本となる大量のデータを読み込んで、その中から共通のルールや、特徴などを抽出するという作業を行っています。その抽出した特徴を使って、新しい問いに対しての答えを導き出します。
翻訳機能であれば、人間が翻訳した原版と翻訳版のデータを何冊分も読み込ませるなどして、翻訳のパターンを覚えた結果を使って、あなたが入力した文章の翻訳結果を導き出しています。

最近のニュースになっていましたが、囲碁のプログラムがついにプロレベルになったとか。これも機械学習が使われています。

ごいたは駒が少ないとはいえ、その組み合わせは膨大です。また試合の展開も似ているようで、異なる場面が多く登場します。その中から、勝ちパターンを探すことを機械にやらせようというのが機械学習です。

ルールベース vs 機械学習

突然、ごいたとは関係ない話ですみません。
私は、オセロがわりと強いのですが、オセロというのは、勝ち方の理論がかなり確立されていて、プログラムの作りがいのある題材なのです。過去にオセロプログラムを作ってみたこともあります。
オセロプログラムも、勝ち方の理論をルールベースで組み込んでいけばそれなりに強くすることはできるのですが、どうしても限界があります。有名(?)なところで、パンダオセロというのがあります。パンダパパは強い、と言われているのですが、これはある程度のオセロプレイヤーならまず負けないレベルなので、たいして強くありません。
しかし、機械学習をベースに強くなったロジステロというソフトは、人間のオセロチャンピオンに圧倒的な強さで勝利しました。1997年のことです。
それから20年近く経って、オセロよりも圧倒的に計算量の多い囲碁で同じことが起きようとしています。

ルールベースのルールを人間が一つ一つ組み上げていくのは労力に見合わない・・・と今までの事例が証明しているので、ごいたも機械学習を前提としてAIを考えていきます。

ごいたと機械学習

単純に機械学習でごいたAIを作っていくといっても、これもまた、色々と分類したりすることができるのですが、それは次回、ごいたAI〜機械学習編〜として別途書きましょう。
ごいた特有の課題もあります。

このブログに書くこと

ぶっちゃけると、Hexoというブログ生成ツールを使ってみたかっただけなんですが。

ブログを作ってみるからには何かテーマを決めて書いていったほうが実りがある。自分にはなにがあるのか?そうなるとすぐに思いつくのは、ごいたオンライン。ということで、ごいたオンラインの機能について書くのか・・・というと、そうではありません。

ごいたを科学する

近頃は、ビジネスにおいてもデジタル化、ソフトウェアが急激に注目を集めているので、ここは勉強の一環として、ごいたをデジタル、ソフトウェアの方面から攻略していこうというのがこのブログの目的です。

目標は?

何事をするにも、まず目標設定は大事。では、大きな、遠いゴールから設定しましょう。
集大成としては、チェス・オセロ・将棋のように人間並、もしくはそれ以上のAI(人工知能)が作れたらよいなと思っています。あくまで遠い目標なので、それに至るまでにはいくつもの超えなければいけない壁があります。

具体的な道のり

ごいたAIを作成するという目標を立てたところで、小さな目標をいくつか立てて、見通しをたてることにします。

  1. ごいたの棋譜ファイル形式を決める

    • 棋譜ファイルは、ごいたオンラインなどのデジタル形式でごいたを遊んだ際の記録を、保存、解析などするときに必要となってきます。今のところ、デジタル形式のごいたの棋譜は誰も提唱していないはずなので、今考えれば、発明者になれます。やったね!
  2. ごいたの棋譜再生・編集ソフトを作成する

    • 棋譜ファイルだけあっても価値が低いですよね。なので、棋譜ファイルを開いて、戦局がどう移り変わっていったのか、再生するためのソフトウェアが必要となります。
  3. ごいたAIのインターフェースを決める

    • ソフトウェアの話になりますが、AIなどの外部から後で足すことが出来る機能を他人に作成してもらうためには、こういうデータの受け渡し方法でやります。というのを予め決めておかなければなりません。なので、これも誰も考えていないはずなので、勝手に考えます。誰か考えてくれてもいいんですよ?
  4. ごいたAIの実装方法を考える

    • これ、一番大変です。論文が何冊か書けてしまうと思います。ごいたは、チェス、オセロ、将棋、囲碁とは決定的に異なる点が2つほどあるのです。何かというと

      • プレイヤーが2人ではない。しかもチーム戦である。
      • 試合の状況に不確定要素がある。(完全情報ゲームではない)
    • 一番近いゲーム形式を持つのは、麻雀だと思います。試しに麻雀のAIについての論文を探してみましょう。ふむふむ。人間に遠く及んでいない…という結果が出ているんですが。

    • 「麻雀 AI アルゴリズム」での検索結果

  5. ごいたAIを実装する

    • これは、4.と抱き合わせで行っていく必要があります。考えて、アイデアを実装して、評価して。これを繰り返して最強のごいたAIが出来る。といいなあ。

今後のネタ

ごいたAIについて、今頭の中にある手法について書こうと思っています。
ごいたAIについて考える会というのが開催されていれば、飛んでいきます。よろしくお願いします。