SlideShare a Scribd company logo
1 of 75
人狼知能エージェント作成
2017年5月
①セットアップ
開発環境を整える
プラットフォームの
ダウンロード
1. 人狼知能プロジェクトの
HPへアクセスする
2. 開発関連をクリック
3. 人狼知能プラットフォー
ムをクリック
4. aiwolf-ver0.4.6と
(JavaDocのDL)をク
リックし,ダウンロード
5. aiwolf-ver0.4.6を解凍
http://aiwolf.org
プラットフォームの
ダウンロード
1. 人狼知能プロジェクトの
HPへアクセスする
2. 開発関連をクリック
3. 人狼知能プラットフォー
ムをクリック
4. aiwolf-ver0.4.6と
(JavaDocのDL)をク
リックし,ダウンロード
5. aiwolf-ver0.4.6を解凍
http://aiwolf.org
プラットフォームの
ダウンロード
1. 人狼知能プロジェクトの
HPへアクセスする
2. 開発関連をクリック
3. 人狼知能プラットフォー
ムをクリック
4. aiwolf-ver0.4.6と
(JavaDocのDL)をク
リックし,ダウンロード
5. aiwolf-ver0.4.6を解凍
http://aiwolf.org
プラットフォームの
ダウンロード
1. 人狼知能プロジェクトの
HPへアクセスする
2. 開発関連をクリック
3. 人狼知能プラットフォー
ムをクリック
4. aiwolf-ver0.4.6と
(JavaDocのDL)をク
リックし,ダウンロード
5. aiwolf-ver0.4.6を解凍
http://aiwolf.org
解凍したフォルダーの内容については
補助資料 1.2を参照
プロジェクトの
作成
1.Eclipseを起動
2.左上のマークをクリック
3.適当なプロジェクト名を
入れる
(ここではDemoAgent)
4.完了ボタンを押す
プロジェクトの
作成
1.Eclipseを起動
2.左上のマークをクリック
3.適当なプロジェクト名を
入れる
(ここではDemoAgent)
4.完了ボタンを押す
プロジェクトの
作成
1.Eclipseを起動
2.左上のマークをクリック
3.適当なプロジェクト名を
入れる
(ここではDemoAgent)
4.完了ボタンを押す
フォルダー作成
1. プロジェクトを右クリッ
ク
2. 新規>フォルダー
3. フォルダー名に「lib」
を入力し完了
フォルダー作成
1. プロジェクトを右クリッ
ク
2. 新規>フォルダー
3. フォルダー名に「lib」
を入力し完了
プラットフォーム
(ライブラリ)の導入
1. 作成したフォルダに次の
ファイルをドラック&ド
ロップ
• aiwolf-client.jar
• aiwolf-common.jar
2. 「ファイルをコピー」を
選択しOKを押す
3. 同様にダウンロードした
「JavaDoc」をzipのま
ま「lib」へドラック&ド
ロップ
プラットフォーム
(ライブラリ)の導入
1. 作成したフォルダに次の
ファイルをドラック&ド
ロップ
• aiwolf-client.jar
• aiwolf-common.jar
2. 「ファイルをコピー」を
選択しOKを押す
3. 同様にダウンロードした
「JavaDoc」をzipのま
ま「lib」へドラック&ド
ロップ
ビルド・パスの
構成
1. プロジェクトを右クリッ
ク
2. ビルド・パス>ビルド・
パスの構成
3. JARの追加をクリック
4. .jarの2つのファイルをク
リックしOKを押す
ビルド・パスの
構成
1. プロジェクトを右クリッ
ク
2. ビルド・パス>ビルド・
パスの構成
3. JARの追加をクリック
4. .jarの2つのファイルをク
リックしOKを押す
ビルド・パスの
構成
1. プロジェクトを右クリッ
ク
2. ビルド・パス>ビルド・
パスの構成
3. JARの追加をクリック
4. .jarの2つのファイルをク
リックしOKを押す
JavaDocの適用(1/4)
1. aiwolf-client.jarの
左の三角をクリック
2. 「Javadoc ロケー
ション」を選択
3. 「編集」を押す
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
JavaDocの適用(2/4)
1. 「アーカイブ内の
Javadoc」を選択
2. 「ワークスペース・
ファイル」を選択
3. 「アーカイブパス」
と「アーカイブ内の
パス」を入力
4. 検証を押し,ロケー
ションがあっている
か確認する
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
JavaDocの適用(2/4)
1. 「アーカイブ内の
Javadoc」を選択
2. 「ワークスペース・
ファイル」を選択
3. 「アーカイブパス」
と「アーカイブ内の
パス」を入力
4. 検証を押し,ロケー
ションがあっている
か確認する
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
JavaDocの適用(3/4)
1. aiwolf-common.jar
の左の三角をクリッ
ク
2. 「Javadoc ロケー
ション」を選択
3. 「編集」を押す
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
JavaDocの適用(4/4)
1. 「アーカイブ内の
Javadoc」を選択
2. 「ワークスペース・
ファイル」を選択
3. 「アーカイブパス」
と「アーカイブ内の
パス」を入力
4. 検証を押し,ロケー
ションがあっている
か確認する
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
JavaDocの適用(4/4)
1. 「アーカイブ内の
Javadoc」を選択
2. 「ワークスペース・
ファイル」を選択
3. 「アーカイブパス」
と「アーカイブ内の
パス」を入力
4. 検証を押し,ロケー
ションがあっている
か確認する
アーカイブ・パス :DemoAgent/lib/docs.zip
アーカイブ内のパス:docs
③エージェント作成
実行可能なエージェントの作成
新規クラス作成(1/3)
1. プロジェクトを右クリッ
ク
2. 新規>クラス
新規クラス作成(2/3)
1. パッケージ名を入力
2. クラス名を入れる(ここ
では
DemoRoleAssignPlayer
)
3. スーパークラスの横の参
照をクリック
パッケージ名は自分のアドレスを逆から入力
demo@aiwolf.org → org.aiwolf.demo
新規クラス作成(3/3)
1. 上の欄に「ARAP」とう
ちこむ
2. 「AbstractRoleAssignPl
ayer」を選択
3. OKを押す
対戦
自分のパソコンでサンプルエージェントと対戦
クライアント・サーバ方式
1つのサーバに複数のクライアントを接続し,ゲームを実行
サンプル
エージェントあなた
JARファイル作成
1. プロジェクトを右クリッ
ク>エクスポート
2. JAVA>JARファイル
3. エクスポート先は
AIWolf-ver0.4.6フォル
ダー
4. JARのファイル名を
demoAgent.jarとする
JARファイル作成
1. プロジェクトを右クリッ
ク>エクスポート
2. JAVA>JARファイル
3. エクスポート先は
AIWolf-ver0.4.6フォル
ダー
4. JARのファイル名を
demoAgent.jarとする
JARファイル作成
1. プロジェクトを右クリッ
ク>エクスポート
2. JAVA>JARファイル
3. エクスポート先は
AIWolf-ver0.4.6フォル
ダー
4. JARのファイル名を
demoAgent.jarとする
設定ファイルの
書き換え
1. AIWolf-ver0.4.6内の
「AutoStater.ini」を編
集
2. 最後の行にある
Sample5,org.ai…の文の
先頭に#を入れる(コメ
ントアウト)
3. 最後の行に次の文を追加
[任意の名前(例ではDemoAgent)],[パッケージ名].[作成したクラス名]
補助資料 2.1章
設定ファイルの
書き換え
1. AIWolf-ver0.4.6内の
「AutoStater.ini」を編
集
2. 最後の行にある
Sample5,org.ai…の文の
先頭に#を入れる(コメ
ントアウト)
3. 最後の行に次の文を追加
[任意の名前(例ではDemoAgent)],[パッケージ名].[作成したクラス名]
DemoAgent, org.aiwolf.demo.DemoRoleAssignPlayer
補助資料 2.1章
ゲームを実行
(Mac)
1. ターミナルを開き
AutoStarter.shを実
行する
ゲームを実行
(Windows)
1. コマンドプロンプト
を開き
AutoStarter.batを実
行する
GUIの操作説明
• Nextで次へ進む
• Autoで自動的に1日進む
• SKIP ALLで1日スキップ
占い師の実装
人狼知能のプログラミング
プレイヤーの実装
• 各役職ごとにプレイヤーの振る舞いをプログラミ
ングする必要がある
• 5人対戦では5つの役職を設定する
• 15人対戦では6つの役職を設定する
• 設定していない役職はサンプルエージェントが代
わりにプレイする
• 全ての役職を実装する必要はない
占い師クラスの
作成
1. 新規クラスを作成
2. クラス名:
「DemoSeer」と設定
3. スーパークラスの横の参
照をクリック
4. AbstractSeerを選択し
OKを押す
5. クラスを作成する
占い師クラスの
作成
1. 新規クラスを作成
2. クラス名:
「DemoSeer」と設定
3. スーパークラスの横の参
照をクリック
4. AbstractSeerを選択し
OKを押す
5. クラスを作成する
占い師クラスの
作成
1. 新規クラスを作成
2. クラス名:
「DemoSeer」と設定
3. スーパークラスの横の参
照をクリック
4. AbstractSeerを選択し
OKを押す
5. クラスを作成する
プログラミング手順
①大まかな処
理の流れ
②作業
③プログラム
の詳細説明
①処理の流れ
②作業
③プログラム
の説明
DemoRoleAssignPlayerの役割
DemoRole
AssignPlayer
占い師
クラス
霊能者
クラス
人狼
クラス
村人
クラス
役職ごとにプログラムを作成
①処理の流れ
②作業
③プログラム
の説明
DemoSeerのプログラミング前に
• フィールドとユーティリティメソッドを定義
• フィールド
• クラス全体で共有する変数
• ユーティリティメソッド
• クラス全体で共有するメソッド
①処理の流れ
②作業
③プログラム
の説明
RoleAssignPlayerの定義と
DemoSeerのフィールド,メソッドの追加
• 役職として占い師を振り分けられた時に
「DemoSeer」を呼び出す
• 他の役職が振り分けられた時はサンプルプレイヤーが呼び出される
補助資料 3.1~3.2
①処理の流れ
②作業
③プログラム
の説明
DemoRoleAssignPlayerの定義
①処理の流れ
②作業
③プログラム
の説明
• setBodyguardPlayer(Player)
• 狩人を設定
• setWerewolfPlayer(Player)
• 人狼を設定
フィールドの定義
①処理の流れ
②作業
③プログラム
の説明
ユーティリティメソッドの定義
①処理の流れ
②作業
③プログラム
の説明
DemoSeerに自動生成されたメソッド紹介
dayStart()
divine()
finish()
getName()
initialize(GameInfo,GemeSetting)
talk()
update(GameInfo)
vote()
• サーバが必要に応じてこれらのメソッドを呼び出す
• これらのメソッドを定義しておく必要がある
• 呼び出されるタイミングは補助資料 3.3を参照
①処理の流れ
②作業
③プログラム
の説明
4つのメソッドの実装
• getName()
• エージェント名を返す
• update(GameInfo)
• initialize()以外のメソッドの直前に呼ばれる
• サーバから送られるゲーム情報を取得する
• initialize(GameInfo, GameSetting)
• 初期化処理をおこなう
• dayStart()
• 1日の始まりに呼ばれるメソッド
①処理の流れ
②作業
③プログラム
の説明
4つのメソッドの実装
• getName()では「自分自身のエージェント名」を返す
• initialize()では前のゲーム情報が残ったままにならない
ように初期化をする
補助資料 3.4
①処理の流れ
②作業
③プログラム
の説明
getName(), update()の実装
①処理の流れ
②作業
③プログラム
の説明
initialize()の実装
①処理の流れ
②作業
③プログラム
の説明
dayStart()の実装
①処理の流れ
②作業
③プログラム
の説明
• Judgeクラス
• 占った人
• 占い結果
• HUMAN
• WEREWOLF
vote()の実装
• 投票処理をするメソッド
• 1日の終わりに呼び出される
• ブラックリスト⇨灰色リスト⇨ホワイトリストの
順に投票させる
①処理の流れ
②作業
③プログラム
の説明
vote()の実装
• 人狼だと思う人(黒リスト)から投票
• 人狼かもしれないと思う人(灰色リスト)から投票
補助資料 3.5
①処理の流れ
②作業
③プログラム
の説明
vote()の実装
①処理の流れ
②作業
③プログラム
の説明
divine()の実装
• 占い先を決定するメソッド
• 占いたい人のエージェントを返す
• 占っていない人からランダムに占っていく
①処理の流れ
②作業
③プログラム
の説明
divine()の実装
• まだ占っていない自分以外の生存プレイヤーからラン
ダムに選択
補助資料 3.6
①処理の流れ
②作業
③プログラム
の説明
divine()の実装
①処理の流れ
②作業
③プログラム
の説明
エージェント同士の会話
• サーバがtalk()メソッドを順番に呼び出す
Turn 1 ~ 20
①処理の流れ
②作業
③プログラム
の説明
発話生成の仕方
• プロトコル部門の発話は次の2つから作成する
• Contentクラス
• ContentBuilderクラス
• 発話生成は次の手順で行う
1. ContnetBuilder builder = 発話の種類に応じたContentBuilder;
2. Content content = new Content(builder);
3. String text = content.getText();
①処理の流れ
②作業
③プログラム
の説明
COMINGOUT Agent[05] SEER
ContentBuilderクラス
• ContentBuilderクラスには全部で14種類存在する
• 今回利用するクラスは
• DivinedResultContentBuilder(target, result)
• その他のクラスは補助資料 3.7を参照
①処理の流れ
②作業
③プログラム
の説明
talk()の実装
• 占いで人狼を見つけたらカミングアウト
• カミングアウトした後は占い結果を報告する
• 話すことがないときはOVERを返す
①処理の流れ
②作業
③プログラム
の説明
Turn 1 ~ 20
talk()の実装
• 占いで人狼を見つけたらカミングアウト
• その後占い結果を報告
補助資料 3.8
①処理の流れ
②作業
③プログラム
の説明
talk()の実装
①処理の流れ
②作業
③プログラム
の説明
会話内容の取り込み
• 会話のリストはGameInfoからTalk型として取得
• Talk型クラス
• 発話ID
• 発言者
• 発話内容
• Talk型クラスとして取得したテキストをContentクラ
スへ変換
①処理の流れ
②作業
③プログラム
の説明
会話内容を取り込む(update()の修正)
• フィールドの追加
• dayStart()の修正
• update()の修正
補助資料 3.9
①処理の流れ
②作業
③プログラム
の説明
フィールドの追加とdayStart()の修正
①処理の流れ
②作業
③プログラム
の説明
update()の修正
①処理の流れ
②作業
③プログラム
の説明
talkListHeadの役割
• 会話情報をどこまで読み込んだか覚えておく「し
おり」
• 会話情報を取得する際,talkListHeadがないと一
日文を毎回読み込むことになる
①処理の流れ
②作業
③プログラム
の説明
カミングアウト情報の取り込み
• 他のプレイヤーのカミングアウト情報を保持
①処理の流れ
②作業
③プログラム
の説明
カミングアウト情報の取り込み
補助資料 3.10
①処理の流れ
②作業
③プログラム
の説明
カミングアウト情報の取り込み
①処理の流れ
②作業
③プログラム
の説明
チュートリアル終了
今後の展開
• 偽の占い師が現れたら
• ブラックリストへ入れる
• 偽物だ!と発言する
• 霊媒結果を取得したら
• 灰色リストから除外する
• 自分が疑われたら
• 君は怪しいと反論する
• ブラックリストへ入れる

More Related Content

Similar to Up ai wolfプレゼン資料

デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」
デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」
デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」アシアル株式会社
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見Yosuke HASEGAWA
 
Scala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでScala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでHideaki Miyake
 
さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪Honma Masashi
 
Idea+groovy on ubuntu
Idea+groovy on ubuntuIdea+groovy on ubuntu
Idea+groovy on ubuntukyon mm
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Lumin Hacker
 
kintone プラグインハンズオン資料
kintone プラグインハンズオン資料kintone プラグインハンズオン資料
kintone プラグインハンズオン資料安隆 沖
 
Firefox os hackathon
Firefox os hackathonFirefox os hackathon
Firefox os hackathondynamis
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefoxdynamis
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割Toru Yamaguchi
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Shogo Kawahara
 
20170809 AWS code series
20170809 AWS code series20170809 AWS code series
20170809 AWS code seriesAtsushi Fukui
 
thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩Yuichi Hasegawa
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929hiro345
 
Oracle PGXの可視化ツールを作ってみた
Oracle PGXの可視化ツールを作ってみたOracle PGXの可視化ツールを作ってみた
Oracle PGXの可視化ツールを作ってみたnozomu-onuma
 

Similar to Up ai wolfプレゼン資料 (20)

デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」
デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」
デブサミ2015「実践!クロスプラットフォーム モバイルアプリ開発」
 
[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見[デブサミ2012]趣味と実益の脆弱性発見
[デブサミ2012]趣味と実益の脆弱性発見
 
OSC福岡 20111203
OSC福岡 20111203OSC福岡 20111203
OSC福岡 20111203
 
Scala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまでScala 初めての人が Heroku で Web アプリを公開するまで
Scala 初めての人が Heroku で Web アプリを公開するまで
 
さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪さわってみよう Firefox OS in 大阪
さわってみよう Firefox OS in 大阪
 
Idea+groovy on ubuntu
Idea+groovy on ubuntuIdea+groovy on ubuntu
Idea+groovy on ubuntu
 
Setup jsWaffle
Setup jsWaffleSetup jsWaffle
Setup jsWaffle
 
Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用Androidアプリ解析の基礎 公開用
Androidアプリ解析の基礎 公開用
 
Wagby on Cloud Foundry
Wagby on Cloud FoundryWagby on Cloud Foundry
Wagby on Cloud Foundry
 
kintone プラグインハンズオン資料
kintone プラグインハンズオン資料kintone プラグインハンズオン資料
kintone プラグインハンズオン資料
 
Firefox os hackathon
Firefox os hackathonFirefox os hackathon
Firefox os hackathon
 
Secret of Firefox
Secret of FirefoxSecret of Firefox
Secret of Firefox
 
Heroku Inside
Heroku InsideHeroku Inside
Heroku Inside
 
DLL読み込みの問題を読み解く
DLL読み込みの問題を読み解くDLL読み込みの問題を読み解く
DLL読み込みの問題を読み解く
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開Composer による依存管理 と Packagist によるライブラリの公開
Composer による依存管理 と Packagist によるライブラリの公開
 
20170809 AWS code series
20170809 AWS code series20170809 AWS code series
20170809 AWS code series
 
thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
 
Oracle PGXの可視化ツールを作ってみた
Oracle PGXの可視化ツールを作ってみたOracle PGXの可視化ツールを作ってみた
Oracle PGXの可視化ツールを作ってみた
 

More from Takanori Fukui

2018人工知能学会合同研究会発表資料
2018人工知能学会合同研究会発表資料2018人工知能学会合同研究会発表資料
2018人工知能学会合同研究会発表資料Takanori Fukui
 
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたものTakanori Fukui
 
論文の書き方(研究室用)
論文の書き方(研究室用)論文の書き方(研究室用)
論文の書き方(研究室用)Takanori Fukui
 
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたものTakanori Fukui
 
人狼BBSにおける発話の自動分類
人狼BBSにおける発話の自動分類人狼BBSにおける発話の自動分類
人狼BBSにおける発話の自動分類Takanori Fukui
 
Gat2017-AITWolfアルゴリズム紹介
Gat2017-AITWolfアルゴリズム紹介Gat2017-AITWolfアルゴリズム紹介
Gat2017-AITWolfアルゴリズム紹介Takanori Fukui
 
Automatic classification of remarks in Werewolf BBS
Automatic classification of remarks in Werewolf BBSAutomatic classification of remarks in Werewolf BBS
Automatic classification of remarks in Werewolf BBSTakanori Fukui
 

More from Takanori Fukui (7)

2018人工知能学会合同研究会発表資料
2018人工知能学会合同研究会発表資料2018人工知能学会合同研究会発表資料
2018人工知能学会合同研究会発表資料
 
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第8章をスライド資料にしたもの
 
論文の書き方(研究室用)
論文の書き方(研究室用)論文の書き方(研究室用)
論文の書き方(研究室用)
 
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの
著者:結城 浩-『プログラマの数学』の第1章をスライド資料にしたもの
 
人狼BBSにおける発話の自動分類
人狼BBSにおける発話の自動分類人狼BBSにおける発話の自動分類
人狼BBSにおける発話の自動分類
 
Gat2017-AITWolfアルゴリズム紹介
Gat2017-AITWolfアルゴリズム紹介Gat2017-AITWolfアルゴリズム紹介
Gat2017-AITWolfアルゴリズム紹介
 
Automatic classification of remarks in Werewolf BBS
Automatic classification of remarks in Werewolf BBSAutomatic classification of remarks in Werewolf BBS
Automatic classification of remarks in Werewolf BBS
 

Up ai wolfプレゼン資料

Editor's Notes

  1. では開発環境を整えましょう. 1スライドずつみなさんの進行を見ながらすすめていきます. 今日は同じ研究室からサポートとして3名に来てもらっています. 生徒数に対してサポート数が多いので,わからないことこがあったら,積極的に聞いてください.
  2. プラットフォームをダウンロードしましょう. 人狼知能プロジェクトへアクセスしてください. URLはこれです. HPから開発関連をクリックします.
  3. Resourceの下にある人狼知能プラットフォームをクリックします
  4. ダウンロードするのはaiwolf-ver0.4.6です. そのとなりの(JavaDocのDL)もダウンロードしてください.
  5. ダウンロードするのはaiwolf-ver0.4.6です. そのとなりの(JavaDocのDL)もダウンロードしてください.
  6. Eclipseを起動し,
  7. プロジェクトの作成は左上のマークをクリックします. 右の小さい下三角形です 出て来た項目の上にあるJavaプロジェクトをクリックしてください.
  8. 作成するプロジェクト名を決めます. プロジェクト名の欄に適当なプロジェクト名を入れてください. ここではDemoAgentと名付けておきます その後完了をおし,プロジェクトを作成してください.
  9. プラットフォームを入れておくフォルダーを作成しましょう. プロジェクトを右クリックし,新規>フォルダーを選択します.
  10. フォルダー名の欄にlibと入力し完了をおします.
  11. 作成したフォルダーにプラットフォームを導入しましよう. 少し前に解凍したAiwolf-ver0.4.6の中にあるaiwolf-client.jarとaiwolf-common.jarをドラックアンドドロップします.
  12. ファイル操作のウィンドウが立ち上がってくるので, ファイルをコピーを選択し,OKをおします.
  13. フォルダーにコピーしただけでは,利用できないので,ビルドパスという作業が必要になります. プロジェクトを右クリックし,ビルドパス>ビルドパスの構成をクリックします.
  14. ライブラリの項目にあるJARの追加をクリックします.
  15. 追加したJARファイルを選択し,OKを押します.
  16. JavaDocを適用しましょう. 手順が面倒なので,一度聞いていてください まず初めに,二つのJARファイルのうちの一つのaiwolf-client.jarの左の三角をクリックします javadocロケーションを選択します. その後,右にあるボタンの中から編集を押します.
  17. ウィンドウが立ち上がってくるので, アーカイブ内のJavadocをクリックし, アーカイブぱすに「プロジェクト名/lib/docs.zip」を アーカイブ内のパスにdocsを入力します.
  18. 検証をクリックし,ロケーションが有効であるかを確認します.
  19. 同じことをaiwolf-common.jarにも適用します. aiwolf-commonの左の三角をクリックし,javadocロケーション,編集を押します
  20. アーカイブ内のJavaDocを選択し, ワークススペース・ファイルを選択します アーカイブぱすには「プロジェクト名/lib/docs.zip」を入力, アーカイブ内パスにはdocsを入力します
  21. 検証をクリックし,ロケーションがあっているかを確認します その後,OKをおしてJavaDocの適用を終えてください. ここがセットアップの山場ですから,不明点は手を上げてサポートを呼んでください.
  22. 何もしない,実行可能なエージェントを作成しましょう. その後,対戦の説明をし,対戦の実行の仕方を確認した後,具体的なプログラミングをしていきます.
  23. 新規クラスを作成します プロジェクトを右クリックし,項目から新規>クラスを選択します.
  24. パッケージ名を入力します 一般的には自分のアドレスを逆から入力するのが慣例となっています. 例えば,demo@aiwolf.orgの場合は逆から読んで,org.aiwolf.demoとします. 次に作成するクラス名ですが,なんとかRoleAssignPlayerとしましょう. その後,スーパークラスの欄の横にある参照をクリックしましょう
  25. 上の欄はフィルターになってるので,ここにARAPと打ち込んで, 項目の中からAbstractRoleAssignPlayerを選択しましょう. この時二つ同じ名前が出てくると思います. 利用するのはorg.aiwolf.sample.libのクラスを使いますから,気をつけてください
  26. 自分のパソコン内でサンプルエージェントと対戦をする仕方を勉強しましよう
  27. 対戦する際の実行の構成はクライアントサーバ方式です. 1つのサーバに複数のクライアントを接続し,ゲームを実行します. [ENTER] 今回は自分のパソコン上にサーバとクライアントを立ててゲームを実行します 先ほど作ったエージェントをクライアントとして,ゲームに接続し実行します. [ENTER] 今回は5人で人狼を行いますが,不足している4人はサンプルエージェントが担当します.
  28. 対戦するため,今まで作ったプロジェクトをJARファイルにまとめます. プロジェクトを右クリックし,エクスポートを選択します.
  29. 上の欄はフィルターになってるので,ここに,Javaを入力し,Jaca>jarファイルを選択し,次へをおします
  30. Jarファイルの欄にエクスポートする場所を入力します. 出力先は,aiwolf-ver0.4.6にして,ファイル名はなんとかAgentとしてください. その後,完了ボタンを押してください.
  31. 自分の作ったエージェントをJARファイルにまとめたので,次はサーバの設定を行います. aiwolf-ver0.4.6のフォルダの中にあるAutoStarter.iniを編集します.
  32. 最後の行にあるSample5.org,,,の文の先頭に#を入れてコメントアウトにし, 次の文を追加します 任意の名前,カンマ パッケージ名 ピリオド 作成したクラス名 の文を追加します. 例えば,DemoAgent, org.aiwolf.demo.DemoRoleAssignPlayerとします. よくわからないと思いますので,手元の補助資料を参照してください
  33. それでは対戦をしてみましょう. MacOSの人はターミナルを,windowsの人はコマンドプロンプトを開き,aiwolf-ver0.4.6の中にあるAutoStarterを実行してください.
  34. 起動するとGUIが立ち上がってきます. しばらく動かしてみましょう,
  35. エージェントを作成しただけで,今は何もしません, 人狼知能のプログラミングをしましょう
  36. エージェントの作成は,各役職ごとに行います. 現在のプロトコル部門では5人対戦と15人対戦が行われているため,全部で7種類の役職を実装する必要があります. ただし,設定していない役職が割り当てられた場合には,サンプルエージェントが代わりにプレイするため,一つの役職だけを実装しても対戦することができます.
  37. それでは占い師を作成していきましょう. プロジェクトを右クリックし,新規クラスを作成, クラス名にはなんとか Seerと設定します.ここではDemoSeerとします スーパークラスの横の参照ボタンをクリックしましょう
  38. 上のフィルターの欄にASと入力し,AbstractSeerを選択します. この時にも2つ同じ名前が出てくると思うので,org.aiwolf.sampleの方を選択しましょう,
  39. 完了ボタンを押してクラスを作成しましょう.
  40. ここからプログラミングの作業をしていきます. まず,大まかな処理の流れを説明した後,作業の時間を設けます. 一通りプログラミングが終わったら,プログラムの詳細説明をします.
  41. 少し前に作成したクラスであるDemoRoleAssignPlayerの役割は,サーバとの最初のやりとりです. サーバから役職が割り振られた時に,どのクラスを実行するのかを指示します. 役職ごとにクラスを作成する必要があります.全部で6役職 今回のセミナーでは占い師を作成するため,DemoRoleAssignPlayerに占い師クラスを設定します
  42. DemoSeerに必要なメソッドを実装する前に いくつかのフィールドとメソッドを追加しておきましょう.
  43. それでは補助資料の ページの . 節まで進めてください
  44. コンストラクタを作成し,setSeerPlayerの引数に作成したクラスを渡します. 今回は占い師だけですが,狩人の場合には,setBodyguardPlayerを,人狼の場合にはsetWerewolfPlayerというメソッドを使います.
  45. Agent me は自分自身を示すオブジェクトを取得します. 今後多用するので,フィールドとして定義しておきます currentGameInfoはサーバから受け取ったゲーム情報を格納しておく変数です. myDivinationQueueは占い結果が入る行列です. whiteList, blackList, grayListはそれぞれ,人間だと確信している人を格納しておくリスト,人狼だと確信している人を格納しておくリスト,判断がつかない人を格納しておくリストです 最後は自分自身の役職をカミングアウトしたかを保持しておくフラグです.
  46. 二つのメソッドを定義してもらいました. 一つ目は引数にtargetを渡して生きているかを返すメソッドです. ゲーム情報からgetAliveAgentList()で現在生きているエージェントのリストを取得し,containsでリストにtarget がいるかbooleanで返してもらいます 2つ目は引数にリストを渡して,その中からランダムに一つ要素を返すメソッドです. この際,リストが空の場合にはnullを返します.
  47. それではDemoSeerのプログラミングをしましょう, クラスを作成した時にいくつか自動生成されたかと思います. これらのメソッドを一つずつ定義していきます.
  48. それでは,メソッドを3つ実装しましょう, 一つ目はgetName()です. これは,サーバ側のエージェント名取得の際に利用するメソッドです 2つ目はupdateです プログラム実行中は高頻度で呼ばれ続けるメソッドです. サーバーからおくられるゲーム情報の取得や,状況に応じてフィールドを書き換える,メソッドを実行するなどを書き込みます. 3つ目はinitializeです プログラムの最初に1度だけ実行されます. 初期化処理などはここに書きます,
  49. それではプログラミングをしましょう. 補助資料 ページです
  50. getName()は自分自身のエージェント名を返しましょう update()はサーバからゲーム情報を引数で受け取るので,クラスのフィールドに格納しておきましょう.
  51. initialize()ではフィールドの初期化処理を行います. 自分自身のAgent情報は,ゲーム情報から,getAgentで取得します. grayListは,現在参加しているエージェントのリストをそのまま入れます. 参加しているエージェントの中には自分自身も含まれるため,リストから除外します. ホワイトリストとブラックリスト,占い結果を保持しておくキューは,試合を繰り返すと,前の試合の情報が残っている可能性があるため,クリアで初期化しておきます.
  52. 実装する処理は占い結果の取り込みと,リストのアップデートです. 占い結果の読み込みは,ゲーム情報からgetDivineResult()で取得します. このメソッドで返ってくるのはJudge型です. このJudgeは占った人と結果,HUMANかWEREWOLFを保持しているクラスです, 注意点がひとつあります. このメソッドは0日目でも呼ばれるため,占い結果を取り込んでもnullが返ってくることがあります. そのため,37行目で,nullが帰ってきた場合に処理をスキップしてください, この占い結果をキューの最後にofferで追加します. 占い結果から占った人を灰色リストから移します. 結果を取得し,結果がHUMANの時はホワイトリストへ, 結果がWEREWOLFの時はブラックリストへ移します.
  53. それではVote()の実装をしましょう 投票処理をするメソッドです. 投票するエージェントを返します. 1日の終わりに呼び出されます. 基本的にはブラックリストに入れたエージェントに対して投票します. ブラックリストがいなければ灰色リスト,ホワイトリストの順に投票します.
  54. それではVoteを実装しましょう,補助資料 ページです
  55. まず,候補者リストを用意し,ブラックリストに名前があれば,候補者リストに加えます, 192行目にとび,投票を返します ブラックリストに名前がない場合には,177行目から184行目の処理で,灰色リストの名前を候補者リストに加え,192行目で投票を返します. 両方のリストに名前がない場合には,自分以外の生存プレイヤーからランダムに投票をさせます. この部分が186行目から189行目です. 返す値をnullにすると,デフォルトの設定である,生存プレイヤーからランダムに投票が適用されます.
  56. 占い先を決定するメソッドです. 占いたい人を返します. 占っていない人からランダムに占っていくようにプログラミングします
  57. 補助資料 ページを参考に進めてください
  58. vote()と同様に候補者リストを作成しておきます. 現在は占われていない人は全員,灰色リストに入るため,灰色リストに入っている人を候補者リストへ加えます. もし,候補者が誰もいない場合はnullを返します,
  59. エージェント同士の会話はトークンリングという伝送方式に似ています. 一人ずつ,話したいことがあるかサーバが確認する作業をしています. 一周すると1ターン,2周すると2ターンとなり,全員がもう話すことはないという信号を送るか,20ターンたつと会話が終了します.
  60. 占い結果の報告をするために発話を生成する必要があります 発話の生成にはContentクラスとContentBuilderクラスの二つから作成します. ContentBuilderクラスで発話を生成した後に,Contentクラスに渡した後,String型に加工されたものを取得します.
  61. 発話の種類によって利用するContentBuilderを変えます. 占い結果を報告する発話生成にはDivinedResultContentBuilderを使います. そのほかのContentBuilderクラスについては補助資料の ページを参照してください
  62. talkメソッドの実装です, talkメソッドは20回呼び出されます. ここでは占いで人狼を見つけたらカミングアウトの発言をし,その後,占い結果を報告します. もし,話すことが何もない場合にはOVERを返しておきます
  63. 補助資料 ページを参考に進めて行ってください
  64. 108行目の処理で自分の役職をカミングアウトしておらず,人狼を見つけた場合にはカミングアウトをします この条件が108行目と109行目です. キューに対してpeekLast()メソッドを利用することでキューの最後の要素を取り出さずに取得することができます. 111行目でComingoutContentBuilderを使って発話生成します. 第一引数に自分のAgent情報,第二引数に役職です. Roleというのは列挙型です. SEER以外にWEREWOLFやBODYGURADなどがあります. ContentBuilder型をContent型にした後,getTextでString型にし,返します
  65. フィールドにtalkListHeadを定義します. これは一日たつと0にリセットさせたいので,dayStart()メソッドで毎日0にリセットします.
  66. update()で会話情報を取得します. ゲーム情報からgetTalkList で会話リストを取得します. Talk型は主に発言者と発話内容を保持しています. 発言者はgetTalk() で,発話内容はgetText()で取得します. 発話内容はそのままだとString型で扱いにくいのでContent型に渡して,利用しやすくします. contentにあるgetTopicで話題を取得します. 具体的にはTopicの列挙型で取得します.swich case 文でそれぞれの話題に対して処理を書き加えていきます. 最後に,今まで読み込んだリスト番号を保持しておきます
  67. フィールドにカミングアウトを保存するMapを宣言します. initializeで他のリストと同様に初期化をします update()関数内のカミングアウト発話の処理で,マップにputし,comingoutしたプレイヤーと役職を格納します.