スポンサーサイト

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

[駅メモ]経験値をシミュレート

ひとつ重大な間違えに気づいたので今度直します。べき乗のオーダーが1個ぐらい違うかもしれませんすみません。

ちょっと遠征中に気になったので。

○理論
駅メモの経験値は次のようにで計算されます。

取得経験値=リンクしている経験値(*1)の合計

(*1)リンクしている1駅あたりの経験値(ボーナス込み)=[時間あたり経験値]×[リンク時間]×[リンク倍率]

各パラメーターは、

[時間あたり経験値]≒アクセス回数×2+訪れた人数÷2 [1時間あたり]
 ※ 正確な式ではなく通説からの近似式。訪れた人が極端に少ない駅では誤差が大きい(最低でも時給200程度は出る)

[リンク時間]=リンクしている時間数

[リンク倍率]=
→1.00 (リンクしている駅の数が1の場合)
→1.07 (リンクしている駅の数が2以上の場合 かつ該当駅へのリンク時間が~15分)
→1.08 ( 〃       かつ該当駅へのリンク時間が15分~30分)
→1.09 ( 〃       かつ該当駅へのリンク時間が30分~45分)
→1.10 ( 〃       かつ該当駅へのリンク時間が45分~60分)
→1.11 ( 〃       かつ該当駅へのリンク時間が60分~90分)
→1.12 ( 〃       かつ該当駅へのリンク時間が90分~)

計算しやすくするために以下の仮定をおきます。

・リンクする駅の「時間あたり経験値(以下レート)」依存のパラメーター:訪れた人数を一定、アクセス回数を0と仮定
・路線から取れる駅間をどこも一定と仮定

つまりリンクする駅は全て同質で等間隔に並んでいるという仮定をおきます。すると、取得経験値は、

取得経験値
= 1駅あたり経験値 × 駅数
= (k×訪れた人数) × (リンク時間) × (リンク倍率) × 駅数

k は何らかの比例定数

リンク倍率は時間と駅数に依存するパラメーターですが、駅数とリンク時間が十分に大きければほぼ定数とみなせるのでkに含めることができます。すると、

取得経験値 ∝ 訪れた人数 × リンク時間 × 駅数 (∝:比例するという意味)
・取得経験値は、駅を訪れた人数に比例する
・取得経験値は、リンク時間に比例する
・取得経験値は、リンクした駅数に比例する


ということがいえます。この結論は結構重要で、例えば次のようなケースを考えることができます。

(ケース1)ある駅から路線に乗り、何駅かリンクして30分が経過した。このまま落とされずにもう30分間リンク駅を積んだら経験値はおよそ何倍になるか?
答え1:4倍
解説:取得経験値は、訪れた人数・リンク時間・駅数に比例。30分経過しても訪れた人数はほぼ変わらない(1倍)。30分経過すればこれまでにリンクした駅の時間も倍になり、これからリンクする駅も相応に時間が経過するので、均してみると平均的にはリンク時間は倍になる(2倍)。30分経過すると、リンクした駅数はほぼ倍になっていると考えられる(2倍)。1倍×2倍×2倍=4倍。

(ケース2)ケース1と同じ条件で路線に乗り、何駅かリンクして30分が経過したところ、後続の列車からフットバースでチェックインしてくるプレーヤーがいて、これからの先の駅はリンクできるが、30分前の部分から次々に剥がされてしまう。30分後にリンクしている部分の経験値はおよそ何倍になるか?
答え2:1倍(変わらない) ただし、フットバで剥がされた部分を加算すると2倍弱程度
解説:訪れた人数は変わらないので1倍。リンク時間は、後続のフットバで剥がされていくのと、自分がこれから先に取っていくのが釣り合うので、均してみると変わらない(1倍)。リンクする駅数も同様に剥がされる分と取る分が釣り合うので変わらない(1倍)。1倍×1倍×1倍=1倍

(ケース3)ケース1と同じ条件で、何駅かリンクして30分が経過したところ突如眠くなったので寝てしまった。寝ている間はチェックインしないものとして、30分後には経験値が何倍になっているか?ただし後続からはフットバは現れないものとし、寝ている間にリンクしているでんこは落とされないものとする。
答え3:2倍
解説:訪れた人数は変わらないので1倍。リンク時間は、これまでに取った駅が一律に+30分されるので2倍。駅数は変わらない(1倍)。1倍×2倍×1倍=2倍

ここで気づくと思いますが、リンクした駅数は駅間が一定なら時間に比例する(その逆も同じで、リンク時間が駅数に比例関係にある)ので、移動しながら同じキャラでずっとチェックインしていけば、取得経験値は時間の2乗、あるいは駅数の2乗に比例することがわかります

移動ながら同じキャラでチェックインしていくときの取得経験値
∝ 訪れた人数 × リンク時間 × 駅数
∝ リンク時間^2
∝ 駅数^2


つまり、2駅つなげばスタート時の4倍、3駅なら9倍、4駅なら16倍、……、10駅なら100倍と雪だるま式に増えていく計算になります(実際はもう少し複雑だけどそう)。山手線チャレンジに成功したときにすごいことになるのは2乗で増えていくことが理由。

○シミュレーション
レートやリンクした駅数、リンク時間が変化したときに、具体的にどの程度の経験値が得られるのかをグラフにしてみます。経験値に依存するパラメーターが3つなので、4次元のプロットを行わないといけません。4次元のプロットは大変なのと、リンク時間と駅数の関係が漠然としているので、先ほどと同様「駅と駅との時間(駅間)」を与え、パラメーターを代用してしまいます。つまり、

リンク時間=駅間×リンク駅数
駅間=リンク時間÷リンク駅数


という関係になります。駅間をの値ごとに場合分けすれば、パラメーターの次元が1つ減って、3次元の世界で表すことができます。リンク時間というのが観測しづらいのと、駅数のほうが直感的にわかりやすいからというのも理由です。

いきなり結論をどどんと。等高線グラフで書いた例がこちら(画像でかいので注意してね)。

20151021_1.png

見方としては、駅間1分の路線でレートを5000人、20駅(10分ぶん)つないでおよそ10000ポイントぐらいかなという程度。より具体的には、東海道線で東京~横浜まで全部つなぐと理論上は40駅ぐらい取れ所要時間およそ30分弱なので、駅間およそ1分レートを全て1万人と仮定して(この記事を書いたときの横浜が12700人、東京が20200人程度)、1万と40の交差するところを見ると7万程度(元手なしで!)。そんな感じに見ていきます。

駅間の目安としては、1分が東海道線(京急等と並走)や総武線(京成等と並走)のようにいわゆるチェックイン連打できる路線。3分は間にチェックインできる場所が少なくてもそこそこ駅間が短い都市を走ってる路線。5分になると少し郊外になって、例えば内房線や外房線など。10分は相当駅間が離れているのでほとんど使わないと思います。極端な例でも、駅間最長の海峡線の木古内~津軽今別が40分、只見線の只見~大白川が30分、石勝線の新夕張~占冠が20分なので。

以下ソースとか。C#で計算して、Rでグラフ化しちゃいました。パラメーターを駅間で与えると、1駅目は10分、2駅目は9分、3駅目は8分…みたいによりリアルな計算ができたりします

static void Main(string[] args)
{
//リンク数
int[] links = Enumerable.Range(1, 50).ToArray();
//レート
int[] rates = Enumerable.Range(200, 231)
.Select(x => (int)Math.Pow(10.0, (double)x / 100)).ToArray();

//駅間
int[] period = new int[] { 60,180,300,600};

//CSVの書き込み
foreach(var p in period)
{
//CSVデータ
StringBuilder sb = new StringBuilder();
//列ヘッダー
var colheader = Enumerable.Repeat("レート/駅数", 1)
.Concat(links.Select(x => x.ToString()));
sb.AppendLine(string.Join(",", colheader));
//行データ
foreach(var r in rates)
{
List row = new List();
row.Add(r.ToString());//レートのヘッダー
foreach(var l in links)
{
int exp = CalcExp(r, l, p);
row.Add(exp.ToString());
}

sb.AppendLine(string.Join(",", row));
}

//ファイルに書き込み
using(var sw = new StreamWriter("expsim_"+p+".csv", false, Encoding.GetEncoding("shift-jis")))
{
sw.WriteLine(sb.ToString());
sw.Close();
}
}
}

///
/// ボーナス込みの取得経験値を求める
///

/// 訪れた人数
/// リンクしている駅の数
/// 駅と駅の間隔(秒)
/// ボーナス込みの経験値
static int CalcExp(int rate, int stLink, int stPeriod)
{
//駅ごとのリンク時間
var linktime = Enumerable.Range(1, stLink).Select(x => (double)(x * stPeriod)).ToList();
//ボーナスの倍率の配列
var bonus = Enumerable.Repeat(1.0, stLink).ToList();
if(stLink > 1)
{
bonus = linktime.Select(delegate(double seconds)
{
if (seconds < 900) return 1.07;
else if (seconds < 1800) return 1.08;
else if (seconds < 2700) return 1.09;
else if (seconds < 3600) return 1.10;
else if (seconds < 5400) return 1.11;
else return 1.12;
}).ToList();
}
//1秒あたりの基礎経験値
double baseexp = (double)rate / 2.0 / 3600.0;
//駅ごとの経験値
var stexp = Enumerable.Range(0, stLink)
.Select(i => baseexp * bonus[i] * linktime[i]);
//合計経験値
return (int)stexp.Sum();
}


スポンサーサイト
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。