質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

6861閲覧

オセロのアルゴリズムに簡単な機械学習を加えたい。

omikuji

総合スコア60

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2グッド

1クリップ

投稿2015/12/16 06:08

度々質問させて頂いています。

オセロのプログラムを作り、現状ではCPU同士がランダムに手を選び打つところまでは出来上がりました。
これに簡単な評価関数と機械学習の要素をつけてどうなるのかというのを試してみたいと考えています。

しかしながら、機械学習に関しては全くの無知でなにから手をつけていいのかわからないのでなにから始めればいいのか教えてもらいたいです。
機械学習に関する本や、HPだけでもぜひ教えて頂きたいです。

「強い」ソフトを作る目的ではなくあくまで実験的なところでやってみたいと考えているだけなので出来れば初歩的なところから教えて頂けるとありがたいです。

何か自分のプログラムについての情報が必要でしたら、コメントお願いします。

yuba, ai_2013_dev👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Alice0225

2015/12/16 06:25

こちらの質問が他のユーザから「質問の範囲が広すぎる」という評価を受けています わからない点を明確にし、調査したこと・試したことと共に記入していただくと、回答が得られやすくなります。
guest

回答1

0

ベストアンサー

10年前に書いた卒論のテーマなのでテンション上がってます。

まず最も簡単な評価関数をお示しします。

(自分の着手可能数 - 相手の着手可能数) ただし双方の着手可能数が0なら (自分の石数 - 相手の石数) // これで大方の一般人には圧勝できる

これだけだと学習要素がまったくないわけですが、学習を組み上げていく上で重要な要素が含まれています。
それは盤面状況から特徴量を抽出していることです。上記の式だと石数と着手可能数ですね。ほかにもいろいろな特徴量が取り出せるはずです。

そして学習の目標とは何か? それは特徴量の組み合わせ(もっとそれらしく言うと「特徴量ベクトル」)から評価値を求めるための係数を定めることです。
(係数と言っている以上、ここでは一次関数として評価関数を構築しようとしています)

ここまで整理できるとやりたいことが見えてきます。対戦結果を教師データとして係数を学習させましょう。
具体的にどんな方法で学習させるか。私は遺伝的アルゴリズムを使いました。係数ベクトルを生物のゲノムとし、ランダムに生成したオセロ生物たちが対戦して生き残って、少しずつ変異しながら優秀な係数ベクトルが増殖していくモデルです。

そして特徴量としてどんなものを抽出するか。
これにもいろいろなアプローチがあるのですが、オセロの戦法研究書を読んで戦術的なコツからオセロ独特の特徴量を編み出す方法と、オセロ戦術の知識は持たずに図形的な特徴を機械的に数値化する方法とがあります。
前者の方法を発見的、ヒューリスティクスと呼びます。まずはヒューリスティクスがお手軽なんではないでしょうかね。

投稿2015/12/16 08:13

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omikuji

2015/12/17 01:57

文章がとても分かりやすく、まず手をつけるべき部分が分かった気がしました。 ありがとうございました。
yuba

2015/12/17 03:15

この卒論のあとに知ったことなど、託してもよろしいでしょうか。 ●ランダム打ちの試合データは意外に有用 ランダム打ちする思考ルーチンなんて弱すぎてその試合結果も無価値っぽいと直感してしまうわけですが、どうもこれがそれなりに有用らしいのです。 評価関数の構成の仕方のひとつに「この局面からランダム打ちCPUに打たせるのを何十戦もやらせたら勝率はいくつだったか」というのがあり、これがどうも意外に強いんですって。 これが強いですよで終わってしまうと「学習」の話に進まないのですが、こうも考えられます。学習の材料に名人同士の棋譜が大量にあれば役立つのではないかとは誰でも思いつくわけですがそれを入手するのが大変です。でもランダム打ちの棋譜だって学習の教師データに役立つのでは?、と。 それなら大量生成できますし。 ●多変量解析 いきなり難しい言葉を出してしまいましたが、簡単に言えば「一次関数の係数を推測する」ことです。変数がたくさんと結果値があって、それはきっと一次関数で決まっているんだろうと推測しているとき、実際に与えた変数ベクトルと結果値の表を与えると一次関数の係数を出すという処理です。 Excelでもできますし、もちろんJavaでだってコーディングできます。 私のやった遺伝的アルゴリズムは「結果的に強かった」ことを基準に係数を定めようとしているのですが、よく考えると本来の目標は違います。ほしいのは「試合に強い」評価関数ではなく「正確な」評価関数、つまり「この局面は最終的に何石勝ちなのか何石負けなのか」を高精度で判定できる評価関数なのです。 そうすると、評価関数の係数を定めるのは、各局面の特徴量ベクトルとその後の最終的な勝敗という組み合わせの多変量解析になります。 ここで、多変量解析に食わせる実戦棋譜データとして前に述べた「ランダム打ちで生成した棋譜」が生きてくるわけです。 「ランダム打ちで大量生成した棋譜」で多変量解析→係数の自動生成された評価関数で多少強くなったオセロCPU→「そのCPUを使って大量生成した棋譜」というサイクルに乗せてどんどん強くできませんかね。これも一種の学習になるかなと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問