[ DATT-A9DARXぎんがポスト > データで遊ぶ > 府中のメソッド ]

PCゲーム「A列車で行こう9」で遊びながら学ぶ、Rのハローワールド。(最終更新:2024年6月24日)


データで遊ぶ

ステップバイステップ

  1. ダウンロード
  2. インストール
  3. ライブラリ
  4. コーディング
  5. エクステンション
  6. プロプライエタリ

府中のメソッド ~ノエルがいっぱい~

サンプルデータ 自動生成20200229号(x,y,z)
自動生成20200229号(256x256)

その他の地形についてはこちらから。
おもなシナリオマップについてはこちら

Rのスクリプト

フォーラムの以下の記事で試行錯誤的に細切れに実行例を紹介していますので拾い読みしてください。

この実験より前に(人手で)ゲーム内で引いた路線網(※上が北)
▲NMPC-L64で描いた図
(編集可能)
▲北部の水面は海とみなす
▲平地西側に大小2つの池あり
▲池と山の間のG地点を都心とする
▲都心Gを通る東西の幹線
▲都心Gから山裾に沿って南下し隣町D
▲隣町Aから南下し池にあたり東進
▲池と港に面した都市Hを通る貨物線
▲隣町Fから都心Gへの高規格新線
▲一級河川の川(駅K東)が街を分かつ
▲河口部の橋だけで凍結の未成線
▲空港は隣町Aにあるものとする
▲貨物線IK間に卸売市場

参考画像 銀座通り
銀座に残された唯一の鉄道踏切信号機
木曽川橋梁
貨物駅
1番のりば
JR府中駅
JR山手駅
山手線(内回り)上野・池袋方面
踏切りだ鳴らせ心の警報機
全景11施工後
上野恩賜公園
JR上野駅
東芝府中
東武プロパティーズ
東武動物公園

効果音 82869109
81772326
96218035
80154446

モチベーション

「A列車で行こう9」はゲームであるから、このようなイメージのもと、まずは思う存分に遊んでから、以下の「データを対象とした実験」に進む。「実験」と呼べるほど(化学や物理のような)厳格なものではないが、ゲームで遊んだ結果を一種の仮説とみなして、人手でゲームを遊んだときに出てくる結果をアルゴリズムでも出せないかともがくのである。人間のプレーヤーとしてはゲームの外側で上掲の参考画像のようなイメージ(表象・心像)というかたちの外部知識を持つ。「思う存分に遊ぶ」とは、人間のプレーヤーとしてベストを尽くす(多くの人がばらばらに遊んでも究極的には同じになっていく=誰もが「これがベスト」と判断して選び取ってゆく=一種の共通認識のようなものを獲得するまで遊ぶ)ことであり、でたらめに遊ぶということでも、ただ時間をかけさえすればよいというものでもなく、じぶんのこだわりにこだわるのも適当とはいえない。アルゴリズムによって人間のプレーヤーの行動をうまく模擬できれば、シナリオの自動提案やプレーのガイド機能採点機能や、好みが似ているプレーヤーの推薦などに応用できる。

なお、CV(コンピューター・ビジョン)のデモンストレーションとして往年のレトロゲームを『AI(人工知能)えーあいかっこじんこーちのー』にプレーさせるものとは意味が異なることに注意。ゲームのデータをただの素材として使うのでなく、ゲームそのものの改善や進化につながる手法の開発(※企画やプログラミングという意味のゲームソフトの開発の手前の段階の要素技術の開発)を目指すつもりで臨もう。

k-means法を使おう


k-means(k平均法)は非常に応用の広い基本的なアルゴリズム。多変量解析やデータサイエンスの技法の1つとして習う人もいれば、画像の減色処理のアルゴリズムとして知る人もいる。ゲーム「A列車で行こう9」でも、k-meansを使ってみよう。

「平地」を抽出
TSVファイル
「平地」を分割
(k-means法)
▲k=3(21+1) ▲k=5(22+1)
▲k=9(23+1) ▲k=17(24+1)
「k=17」を使う
ことにする

クラスター3個を除外

ディスカッション

▲グラフィックソフトで重ねる
(数字の位置がずれた)
▲この実験より前に(人手で)
 ゲーム内で引いた路線網
(との対応を見比べる)
▲この実験より前に(人手で)
 このマップにつけた町名
(との対応を見比べる)
▲k=9

プレーの「分解能」

「A列車で行こう9」では、駅の建設には平らな土地が必要になる(※高架駅にする場合も土地が平らである必要がある)ことから、マップをどのように使っていくか(どのような路線網にするか)を考えるときは、主に「平地」を見ることになる。(※ある程度の面積がまとまって平らであるなら、標高が0mより高い「高台」も考慮に入れる。)

このときに、マップ全体の「平地」をどのような細かさ(※「分解能」ともいう)で見るかということが、「府中のメソッド」(クラスタリング)でいう「クラスター数」である。ここでは「地形の自動生成」の使用を前提とし、この機能で地形仮生成を実行するときに「地形の複雑度」というパラメータを指定するので、そこに依拠してクラスターの数を決められないかと考えた。

※「分解能」:顕微鏡や衛星写真と、それに類する各種計測器でいう言いかた。どのくらい小さな物体まで識別できますという「力」をいう。

「地形の複雑度」は整数で指定する。アルゴリズムの説明は省くが、折り紙を折る回数のような意味合いの数字である。このことは「地形の複雑度」に5~9のような大きな数字を指定したときに顕著にわかると思う。せいぜい1~3が実用域だろう。この「地形の複雑度」は、3次元の地形データを上から平面的に見ての縦と横(xとy)それぞれに効くものである。(※高さ方向(z)に効かせるものは「起伏の複雑度」という別のパラメータになっている。)「地形の複雑度」に「2」を指定したとき、それは縦と横で、それぞれ折り紙を1回折るということになる。折った折り紙を広げてみると、縦と横の折り目によって「マス目」ができている。「地形の複雑度」が「2」のとき、縦と横がそれぞれ折り目を境にして2つに分かれ、平面として見れば4つに分かれているということになる。「地形の複雑度」が「2」のときのいわば分解能(※いわば「画素数」)は「4」になる。「地形の複雑度」を「3」にしたときは2回折って4つに分かれ、縦と横がそれぞれ4つだから、全体は16個のマス目になる。「4」にしたときは、いくつになるだろうか。(※「地形の複雑度」が「1」のときは0回折るととらえた。)

ただ、これでは細かすぎるという感覚があるのも事実だ。ここでは「地形の複雑度」から着想を得たが「地形の複雑度」そのものにはこだわらず、なんかそんな感じの折り紙を折ってから広げてできるマス目のような数えかたで「クラスター数」を決めたいと思った。

A4の紙を封筒に入れるときの折り方がある。「地形の複雑度」の数え方で数えてしまうと、「3つに折る」という状態を飛ばして数えてしまうことになる。そういうところを考えているうちに、「クラスター数」を「21(にのいちじょう)」「22(にのにじょう)」「23(にのさんじょう)」「24(にのよんじょう)」というふうに飛び飛びに考え、その途中の数は考えないという方策が出てきた。それでもなお、これではマップ全体を方眼紙のように区切ることになって不自然である。(そんなことでよければ何も計算せず方眼の罫を引けばいいのであって「クラスタリング」の出番はない。)ならば「クラスター数」を奇数にすればいい。奇数にしさえすればいいので、それぞれに「+1」することにした。この「+1」が気持ちわるいという人もいるかもしれないが、その場合は「府中は特別」「府中以外を数える」という絶対府中宣言府中がセカイ中心(※当社比)」といったことを表現した数字だと思ってもらうとよい。人数を数えるときに自分を数え忘れる人がいます

もう少し何かしたい

「最近隣法」
「ウォード法」
「最小全域木」
を見比べる
▲最近隣法
(single)
▲ウォード法
(ward.D2)
▲最小全域木
(spantree)

▲最小全域木
(コマンドでプロットするのは…
 挫折した!)
▲ボロノイ図
(…に、裏写りする油性ペン)

レトロアクション

このページの方法を考えたときよりも後に考えた方法を、このページで使った地形データに遡及適用してみます。

▲「ベクトル円海山 ▲「新札幌バウム

調布のメソッド ~テラマヨス大明神~


R統計数理研究所のミラーサイトから「R」を入手しよう
統計数理研究所とは

ARXぎんがポスト(84025) All Rights Reserved. ©2018-2024, tht.