スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

艦これのルート分岐を統計から解析する(1)

『艦隊これくしょん』って何?どういうゲームなの?という話は割愛します。



提督を悩ませる要素の1つに羅針盤があります。

羅針盤は一見ランダムですが、艦隊編成や装備編成によっては羅針盤の挙動が変わったり、変わらなかったりします。

例えば、
  • キス島沖(3-2-出撃) 軽巡旗艦かつ残り艦隊が全て駆逐艦 , 全て駆逐艦 のどちらでも無いなら 敵水雷戦隊(A)に必ず向かう
  • アルフォンシーノ方面(3-3-A) 正規空母+軽空母+装甲空母の合計が1隻以下で うずしお(B)に必ず向かう
  • バシー島沖(2-2-E) 正規空母,軽空母,水母のいずれかを含むと70%でボスマスへ、そうでなければ30%でボスマスへ向かう

など。


ところで、MyFleetGirlsというサイトを見つけました。
通信パケット拾ってデータベースに蓄積するシステムらしいです。
統計の使用に関するライセンスが分かりません

羅針盤の情報もしっかり蓄積されており、例えば、
「戦艦/戦艦/正規空母/正規空母/重巡洋艦/重巡洋艦 の艦隊は、281回3-3-AからEへ向かっている」
ということが分かります。


機械的に解析できないかなぁ。



出力結果「例えば:正規空母+軽空母+装甲空母の合計が1隻以下で Bに向かう」をどのように表現するか?


決定木で表現できそうです。

ただ、確率で分岐するケースでも解が得られるかどうか…。



とりあえずやってみる

求めたいものを次の3つに定めた。
  • [本記事]3-3-A(アルフォンシーノ方面) から、100%の確率でBへ向かう編成の特徴抽出(既知)
  • 2-2-E(バシー島沖)から、ボスマスへ向かう確率と条件(既知)
  • 3-3(アルフォンシーノ方面) 全般 (不明)

下の2つについては、別記事で解析することにします。


扱いにくいので、書き換えよう。


MyFleetGirls/statics/海域/羅針盤/...で出てくる統計を、コピペするとこんな感じになる。

潜水空母	潜水空母	潜水空母	潜水空母	潜水艦	潜水艦	605
潜水空母 潜水空母 潜水空母 潜水艦 潜水艦 潜水艦 72
潜水空母 潜水空母 潜水空母 潜水空母 潜水艦 30
潜水空母 潜水空母 潜水空母 潜水艦 潜水艦 27
...

扱いにくい。


駆逐艦をa、軽巡洋艦をb...と置換して、aが何隻、bが何隻…というデータに置き換える。

手作業で数えても良いんだけれども、さくっとプログラム書いたほうが速い。
…はずなんだが、日本語エンコードの環境構築で2時間以上潰れた様子

# ruby

@replace ={"駆逐艦"=>"a1","軽巡洋艦"=>"b1","重巡洋艦"=>"b2","航空巡洋艦"=>"b3","重雷装巡洋艦"=>"b4",\
"軽空母"=>"c1","正規空母"=>"c2","装甲空母"=>"c2","水上機母艦"=>"c3",\
"航空戦艦"=>"d1","戦艦"=>"d2",\
"潜水艦"=>"e1","潜水空母"=>"e1",\
""=>"z"}#"練習巡洋艦"=>"b4"

@empty_table = {}
@replace.values.sort.each{|e|@empty_table[e]=0}

@result = {}

while cin=gets
list = cin.force_encoding("UTF-8").chomp.split
count = list.pop.to_i

table = @empty_table.clone

list.each{|e|
tag = @replace[e]
tag = @replace[""] if !tag
table[tag]+=1
}

t = table.values*","
if !@result[t]
@result[t] = count
else
@result[t] += count
end
end

puts (@empty_table.keys+['#'])*","
@result.each{|k,v| puts "#{k},#{v}"}
無慈悲ですが、コメントはありません。


例えば、上の標準入力を入れると、次のような出力を得る。

a1,b1,b2,b3,b4,c1,c2,c3,d1,d2,e1,z,#
0,0,0,0,0,0,0,0,0,0,6,0,722
0,0,0,0,0,0,0,0,0,0,5,0,78
0,0,2,2,0,0,1,0,0,1,0,0,24
...


例えば、潜水艦=潜水母艦と見ているので、「潜水潜水潜水潜水潜水潜水」と「潜水潜水潜水潜水潜母潜母」は
同じ「e1e1e1e1e1e1」としてマージされて記録される。




Wekaに投げ込む



ところで、なぜこのようなフォーマットに変換したのかと言うと、Wekaというデータマイニングツールの入力にしたかったから。

初めに、「3-3-A(アルフォンシーノ方面) から、Bへ向かう編成の特徴抽出(既知)」を求めてみる。
ただし、ランダム分岐は存在しない(艦隊編成で必ず1つに決まる)と仮定する。

arffファイルを作る。

@relation kc_3_3_a

@attribute a1 real
@attribute b1 real
@attribute b2 real
@attribute b3 real
@attribute b4 real
@attribute c1 real
@attribute c2 real
@attribute c3 real
@attribute d1 real
@attribute d2 real
@attribute e1 real
@attribute z real
@attribute num real
@attribute direction {B,EH}

@data
0,0,0,0,0,0,0,0,0,0,6,0,722,B
0,0,0,0,0,0,0,0,0,0,5,0,78 ,B
0,0,2,2,0,0,1,0,0,1,0,0,24 ,B
0,0,0,0,3,0,1,0,0,2,0,0,18 ,B
0,0,3,0,0,0,1,0,0,2,0,0,15 ,B
0,2,1,0,0,0,1,0,0,2,0,0,15 ,B
1,1,1,0,0,0,1,1,0,1,0,0,15 ,B
0,0,1,0,2,0,1,0,1,1,0,0,10 ,B
3,0,0,0,0,0,1,0,0,2,0,0,9 ,B
0,0,0,0,0,0,0,0,0,0,4,0,14 ,B
1,1,0,0,1,0,1,0,0,2,0,0,8 ,B
5,1,0,0,0,0,0,0,0,0,0,0,8 ,B
0,0,0,1,1,0,1,0,2,1,0,0,8 ,B
0,0,1,2,0,0,1,0,0,2,0,0,7 ,B
0,0,1,0,2,0,1,0,0,2,0,0,7 ,B
2,0,1,0,0,0,1,0,0,1,1,0,5 ,B
2,1,1,0,1,0,1,0,0,0,0,0,5 ,B
0,0,1,1,1,0,1,0,1,1,0,0,5 ,B
0,0,4,0,0,0,1,0,0,1,0,0,5 ,B
1,0,0,0,3,0,1,0,0,1,0,0,4 ,B
0,0,0,3,0,0,1,0,1,1,0,0,4 ,B
0,1,3,0,0,0,1,0,0,1,0,0,3 ,B
0,0,0,0,2,0,2,0,0,2,0,0,818,EH
0,0,2,0,0,0,2,0,0,2,0,0,573,EH
0,0,2,0,1,0,3,0,0,0,0,0,517,EH
0,0,1,1,0,0,3,0,0,1,0,0,469,EH
1,0,2,0,0,0,2,0,0,1,0,0,914,EH
1,1,1,0,0,1,1,0,0,1,0,0,494,EH
0,0,0,0,2,0,4,0,0,0,0,0,808,EH
0,0,1,1,0,0,3,0,1,0,0,0,416,EH
0,0,1,0,2,0,2,0,0,1,0,0,381,EH
0,0,0,0,0,6,0,0,0,0,0,0,377,EH
0,1,1,0,1,0,2,0,0,1,0,0,316,EH
0,0,2,0,0,1,2,0,0,1,0,0,687,EH
0,0,3,0,0,0,2,0,0,1,0,0,375,EH
0,0,2,0,0,0,3,0,0,1,0,0,915,EH
1,0,1,0,1,0,2,0,0,1,0,0,351,EH
0,0,2,0,0,1,1,0,0,2,0,0,317,EH
0,0,0,0,0,4,2,0,0,0,0,0,316,EH
1,1,1,0,0,0,2,0,0,1,0,0,304,EH
0,0,4,0,0,0,2,0,0,0,0,0,277,EH
0,0,2,0,1,0,2,0,0,1,0,0,296,EH
1,0,1,0,1,1,1,0,0,1,0,0,269,EH
0,0,1,0,1,1,2,0,0,1,0,0,272,EH
0,0,4,0,0,1,1,0,0,0,0,0,264,EH
0,0,2,0,0,1,2,0,1,0,0,0,126,EH
0,0,1,0,2,2,1,0,0,0,0,0,258,EH
1,0,1,0,0,0,3,0,0,1,0,0,140,EH


読み込む。ランダム分岐は考えないので、numを削除。
20160911_weka01.jpg

アルゴリズムJ48で決定木求めますよ!
20160911_weka02.jpg

ビジュアライズ化した結果。
20160911_weka03.jpg

すなわち、
正規空母/装甲空母が1隻を超えるとEH
正規空母/装甲空母が1隻以下かつ、軽空母を含むならEH
それ以外はB


惜しいですね…w

統計データの不足が原因みたいです。
正規空母0軽空母1のデータは確かにありません。


しかし、それなりに求まってよかったです。




リンク
  • [本記事]3-3-A(アルフォンシーノ方面) から、100%の確率でBへ向かう編成の特徴抽出(既知)
  • 2-2-E(バシー島沖)から、ボスマスへ向かう確率と条件(既知)
  • [未投稿]3-3(アルフォンシーノ方面) 全般 (不明)


  • スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : 機械学習

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
995位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
199位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。