2014年11月14日金曜日

人狼知能エージェントの作成・その5 Talk編

発話の生成

人狼知能ver0.1.x系では,コミュニケーションはかなり制限されています.
 話すことが出来るのは,

  1. カミングアウト
  2. 占い結果
  3. 霊媒結果
  4. 護衛先の報告
  5. 他人の職業の予想
  6. 他人の意見への同意
  7. 他人の意見への反対
  8. 投票先の宣言
  9. 襲撃先の宣言(人狼のみ)
  10. パス
の10種類となります.
そのため,それ以外の発話を行わないように,対話生成クラスを使って発話内容を作成することが推奨されています.
発話生成には,TemplateTalkFactoryを,人狼同士の囁きの生成には,TemplateWhisperFactoryを使います.
たとえば,占い師をカミングアウトしたい場合は,
String contents = TemplateTalkFactory.comingout(getMe(), Role.SEER);
// contents = "COMINGOUT Agent[00] SEER"
とします.
これによって,占い師であることや,霊媒師であることを宣言することが可能です.

以下,他のテンプレートによる発話の例を示します.
//カミングアウト
//「私は占い師です」
String comingout = TemplateTalkFactory.comingout(mySelf, Role.SEER);
// comingout = "COMINGOUT Agent[07] SEER"

//占い結果の報告
// 「targetは人狼だった」
String divine = TemplateTalkFactory.divined(target, Species.WEREWOLF);
// divine = "DIVINED Agent[01] WEREWOLF"

//霊媒結果の報告
//「targetは人間だった」
String inquest = TemplateTalkFactory.inquested(target, Species.HUMAN);
// inquest = "INQUESTED Agent[01] HUMAN"

//護衛先の報告
//「targetを護衛した」
String guard = TemplateTalkFactory.guarded(target);
// guard = "GUARDED Agent[01]"

//予想
//「targetは村人だと思う」
String estimate = TemplateTalkFactory.estimate(target, Role.VILLAGER);
// estimate = "ESTIMATE Agent[01] VILLAGER"

//投票先の宣言
//「targetに投票する」
String vote = TemplateTalkFactory.vote(target);
// vote = "VOTE Agent[01]"

//同意
//「1日目の発言001に賛成」
String agree = TemplateTalkFactory.agree(TalkType.TALK, 1, 1);
// agree = "AGREE TALK day1 ID:1"

//反対
//「4日目の発言020に反対」
String disagree = TemplateTalkFactory.disagree(TalkType.TALK, 4, 20);
// disagree = "DISAGREE TALK day4 ID:20"

//襲撃先の宣言(人狼のみ)  
//「targetを襲撃先にする」
String attack = TemplateWhisperFactory.attack(target);
// attack = "ATTACK Agent[03]"

//一回パス(他に発言者がいなくても,次の順番で発言を行う)
String skip = TemplateTalkFactory.skip();
//skip = "Skip"

//パス(他に発言者がいなければその日の発言は終了)
String over = TemplateTalkFactory.over();
// over = "Over"
なお,通常の会話に利用する発話は,
TemplateTalkFactory
を利用し,人狼が囁きを行う場合は,
TemplateWhisperFactory
を利用します.

発話の理解

自分を含めた他のエージェントの発話は,Talk型として渡されます. その具体的な中身は,
Talk talk = talkList.get(0);
String contents = talk.getContents();
として獲得できますが,contentsの中身は先に見たTemplateTalkFactoryで作成した文字列がそのまま獲得されるだけのため,何らかの形で文字列が表す意味を理解しなければいけません.
そこで,定型文を簡単に理解できるようにParserが用意されています.
たとえば,カミングアウトした発話のみを見つけて,カミングアウトしたエージェントとその職業を表示するには以下のようにします.
List talkList = gameInfo.getTalkList();
for(Talk talk:talkList){
 Utterance utterance = new Utterance(talk.getContent());
 Topic topic = utterance.getTopic();
 if(topic == Topic.COMINGOUT){
  Agent target = utterance.getTarget();
  Role role = utterance.getRole();
  System.out.println(target+" comingouts as "+role);
 }
}
もしエージェント10が占い師としてカミングアウトしていたら,コンソールに以下のように表示されます.
Agent[10] comingouts as SEER
Utteranceから抽出できるTopicとそれに付随する変数の一覧を以下に示します.
Topic内容利用可能な情報
ESTIMATE予想getTarget(), getRole()
COMINGOUTカミングアウトgetTarget(), getRole()
DIVINED占い結果getTarget(), getResult()
INQUESTED霊媒結果getTarget(), getResult()
GUARDED護衛対象getTarget()
VOTE投票宣言getTarget()
AGREE意見に賛成getTalkType(), getTalkDay(), getTalkId()
DISAGREE意見に反対getTalkType(), getTalkDay(), getTalkId()
ATTACK襲撃対象(人狼のみ)getTarget()
OVER現段階では話すことは無い
SKIP今回は発話しない
TemplateTalkFactory,TemplateWhisperFactory,Utteranceクラスを利用することで, 他のエージェントに発話を文字列として扱うこと無く人狼知能を構築することが出来ます.

今回まで5回にわたって人狼知能作成方法について書いてきました.
途中長い中断があったために,バージョンが変わって,若干仕様の変更がありましたが,おおむねこれで人狼知能が作成できるようになったはずです
次回は,自分が作った人狼知能と人間が対戦する方法について解説します.

0 件のコメント: