« LED照明 | トップページ | 工業か商業か? »

2008.01.28

Pollutionの計算方法判明

Pollutionの計算が良くわかんないと書いてましたが、なんと~法則を見つけ出した人がいました!

Pollution = (0.1 * population + 0.3 * com - 2 * env + ind - 200) / ind *100

だそうだ。
traが入ってないのが意外だったなぁ。

早速、前に取得してたxmlのデータで検証してみましたが、ちゃんと全データで合致しました。

という事でブログパーツの振り分けもPollutionに対応してみました。
これで常に0%、100%、0%、0%を維持できる・・・かなぁ?(^^;

【追記】
sense_mmc.cgiの方、バグってました。スミマセン
修正しました。

|

« LED照明 | トップページ | 工業か商業か? »

MyMiniCity」カテゴリの記事

コメント

初めまして。

Pollution の正確な計算方法を求めて辿り着きました。
僕以外にも計算して URL を決めている人をやっと発見できました。

で、その Pollution の計算式ですが、僕が溜めているデータでは結構精度が悪いです。その後、何か進展はありましたか?

最初は観察から env の影響は -4.6 くらいだろうと予想していました。人口アクセス対その他アクセスの比率がレベル 5 で 1:1 になると仮定すると、-60/13 で大体それくらいなので次は -60/13 で考えてみましたが、これだと逆に精度が悪くなります。その付近で Population と bases のパラメータによる一次式と仮定して、係数を手探りしたところ
Population: 0.2115
ind: 2.37
tra: 0
sec: 0
env: -4.674
com: 0.79001
(const): -470.48
くらいが良さげでした。比較的状態がよいところはこの係数で割と予想できます。しかし Pollution が極端に悪いところはかなり違ってきます。

今は更に -4.6 付近を捨てて Pollution のパーセンテージの誤差の二乗が小さいところを探しています。もう少し env の影響は大きいようです。

投稿: OKAMURA | 2008.02.11 15:18

>OKAMURAさん
はじめまして。

この式で成り立たない場合がありましたか~
以前、日本のランキング1位~3000位、米国のランキング1位~1000位のデータを取っていて、それで検証した結果、全データが合ってたからこれで当たりかな?と思ってました。

この計算式に合わないXMLデータ等お持ちでしたら、教えていただけませんか?

この式で手持ちのデータが合ってしまったので、正解かな?とは思ったんですが、実はちょっと違和感もあります。
他の式に比べて美しくない(^^;

他の式は全部分母にPopulationが来てて、Populationは必ず1より大きいはずなので、0で割る可能性は無い訳ですが、この式だと分母はindだけなので、indが0かどうかで条件分岐が必要になります。
また、他は全て整数値の掛け算なのに、これだけ小数というのもちょっと・・・
という事で、実はもっと他に美しい(^^;正解があるのではないかな?とは思っています。

投稿: <セルダン> | 2008.02.12 00:03

セルダンさん、ご免なさい。読み違えていました。この式は既に人口に対する割合を出す式だったんですね。

この読み違いに気付いて検証し直したところ僕のデータでも全て OK になりました! 理想的な状態を保つための各パラメータの差分の比の予想も満たしています。

お騒がせしたお詫びに改良バージョンを書いておきます。場合分けが不要になります。

Pollution = (0.1 * population + 0.3 * com - 2 * env + ind - 200) / (ind + 0.001) *100

分母の ind に小さい数を足しておけば ind = 0 でも同じ式で通用します。これが問題になるほど ind が小さいときは値がマイナスになる(従って 0% になる)か、population を上げて影響を出そうとしても人口流出圧力が大きくて不可能でしょう。

投稿: OKAMURA | 2008.02.12 01:31

>OKAMURAさん
いゃ、微小な数を加えて条件分岐しないってのは、あくまでもプログラミング上のテクニックであって、数式としての美しさ(^^;とは別じゃないかと・・・
小数という話も分子分母を10倍すれば整数になる訳ですが、そういうテクニックは別にして、同じ人が考えたにしては、他の式と比べると美しさ(^^;が足らないかな?と・・・

たとえば式に出てくるマジックナンバーにしても、Unemploymentの50とかTransportの100、Criminalityの300というのは、それぞれ選択可能になる時のPopulationの数と一致していて「説明可能」なんですが、このPollutionの200というのは説明不可なんですよね。
もちろん、こじつけて計算を合わせる方法はありますが(^^;、美しくはない。
この辺が本当の数式を探し出す鍵になるかな?と思います。

投稿: <セルダン> | 2008.02.12 20:59

こんにちは。
「本当の式」探りの参考になると思うので、僕が今まで考えた経緯を書いておきますね。人口に対する割合ではなく、公害に困っている人数で考えると分子の方はかなり必然的です。

公害に困っている人の数を pol としてこれが population(以下 pop), ind, env, com の一次式で表せるとします。
pol = A*pop + B*ind - C*env + D*com + E

unemployment の ind の係数は -3、criminality の sec の係数は -4、transport の tra の係数は -5 ですから pollution の env の係数は -6 と考えるのが自然です。
pol = A*pop + B*ind - 6*env + D*com + E

レベル 5 以上で com 無しとすると半分が保守アクセスになるように env アクセスを考えると
Δpop : Δind : Δtra : Δsec : Δenv = 60 : 20 : 12 : 15 : 13

更に pop=500, pop=1000 の理想状態でちょうど pol=0 になるとすれば
0 = A*500 + B*150 + E
0 = A*1000 + B*950/3 - 650 + E
なので
A = 13/10 - B/3
E = B*50/3 - 650
です。

そして Δind=0 の代わりに Δcom を使うときに com のメリット(に見えるもの)として Δenv を Δpop*13/60 より小さくするということを考えます。このとき
A*Δpop - 6*Δenv + D*Δcom = 0
Δenv < Δpop*13/60
なので
D = Δpop*(13/10 - A)/Δcom
です。失業率の制約から Δpop = Δcom ですから
D < 3/10 - A
になります。更に
A = 13/10 - B/3
だから
D < B/3
です。

これで
pol = A*pop + B*ind - 6*env + D*com + E
は結局
pol = (13/10 - B/3)*pop + B*ind - 6*env + D*com + B*50/3 - 650
D < B/3
となりました。あとはゲームバランスとして良さげな B と D を決めれば OK です。

僕は最初は C = -6 というのも可変で考えていました。やがて思い直して C = -6 を仮定しました。そしてデータに付き合わせながら B=3, D=0.9 辺りだろうと予想したのですが、どうしてもデータ件数の 5% くらいで若干の誤差が生じてしまって悩んでいました。最適な B, D を探しながら「こんな恣意的な小数のはずないよなあ」と思っていました。それですっきりさせる別な要素があるはずだと情報を探し始めたのです。

セルダンさんが見つけた式だと、
真のpol = 3*pol/工場当りの人口
となります。工場当りの人口は十分に pop が大きく、人口流出のための時間も十分に経てば 3 に収束するので上の一次式の pol は収束値だったってことですね。大体よくても誤差が出るはずです。

結局理由付けは、なんで工場当りの人口に反比例するのかということが謎として残ります。人口に対して工場が多いと変動しやすいようにということかも知れません。でも、どうして env だけそういう要素を加えたのかが結局謎です。

投稿: OKAMURA | 2008.02.13 12:29

度々済みません。一つだけ反例が見つかりました。

population=6345
ind=2000
tra=1243
sec=1504
env=1252
com=265
unemployment=0
transport=100
criminality=0
pollution=0

です。分母の ind に 0.001 のような小さい数を足すとこれも OK になります。恐らく MyMiniCity 自身がそういう式を使っているのでしょう。

投稿: OKAMURA | 2008.02.13 12:55

>OKAMURAさん
>公害に困っている人の数を pol としてこれが population(以下 pop), ind, env, com の一次式で表せるとします。

実はind^2の項があるんじゃないかと妄想中です(^^;
Populationの増加とindの増加は、失業を減らすために工業が必要で、工業を増やすためには人口が必要という相補性がありますので、過剰に多い人口だけを環境悪化の要因と捕らえればPopulation/indというのは納得できます。
しかし分子のindの項を考えるとB*ind/indとなってしまい、結局定数値のBだけが残る事になるため、直接には環境悪化につながらないという事になっちゃうんですよね。
もちろん、env/indの項があるため、indが増えるとenvの効きが悪くなるという側面はありますが、直接的にindの増加が環境悪化にはつながっていない。
そう考えるとind^2という項があってもおかしくないんじゃないかな?という気が・・・
まだ妄想段階ですが(^^;

>半分が保守アクセスになるように

この仮定は無理があるんじゃないでしょうか?

>一つだけ反例が見つかりました。

あぁ、こういう計算上の誤差程度のものは、他の式でもみつかっています。
単に四捨五入する場合の計算誤差でしょう。

投稿: <セルダン> | 2008.02.14 02:38

その例、実際に計算してみましたか?
これが計算誤差になるような計算の方が難しいですよ。

投稿: OKAMURA | 2008.02.18 23:40

>OKAMURAさん
数学的な意味での「誤差」ではありません。
こちらでも書いていますが、小数点以下がちょうど0.5になる場合に処理がおかしい場合があるようです。
0.5の浮動小数点数の内部表現が、実は0.5よりも僅かに小さいんじゃないかと・・・

1 + 1 == 2
は成り立つけど
1.0 + 1.0 == 2.0
が成り立つかどうかは運次第(^^;というのはコンピュータで浮動小数点を扱う場合の常識です。

投稿: <セルダン> | 2008.02.19 00:24

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/4003/17876531

この記事へのトラックバック一覧です: Pollutionの計算方法判明:

« LED照明 | トップページ | 工業か商業か? »