17
提出日:2014年5月10日 第一回課題 T2C_ (Twitter: @T2C_)

Simulation_Report1

  • Upload
    t2c

  • View
    67

  • Download
    1

Embed Size (px)

DESCRIPTION

Systematic & Monte Carlo on VBA (Excel)

Citation preview

Page 1: Simulation_Report1

提出日:2014年5月10日

第一回課題

T2C_ (Twitter: @T2C_)

Page 2: Simulation_Report1

1

■課題内容

2次元単体(今回は三角形)内の点の位置を探索する時、

Systematic法とMonte Carlo法、どちらが有利であるか。

三角形 ABCの 3つの頂点までの距離の合計Lが最小となる点Xの探索を基に考察する。

■Systematic法

○計算内容・概要

乱数的に求めるMonte Carlo法に比べ、こちらは線分を一定数に分割し図形内に格子を形成し、その交

点上からの各頂点への距離を順次求めてゆくアプローチを取る。

具体的には

1.まず線分 ABを n(指定した数値)等分し、n:n-iに内分する点を Iとする

2.線分 ICを j(同じく指定した数値)等分し、j:j-iに内分する点を Jとする

3.I、Jをずらして行き JA+JB+JCを求める。最小値を保持して置き最後に出力

またこの場合であるとどうしても頂点 C に近づくにつれ点が集約され偏りが出る事が予想出来る為、今

回は一様に分布する方を実装し考察を行うこととした。

具体的には

1.上記と同じく ABを n:n-iに内分する点を Iとする

2.線分 ACを j:j-iに内分する点を Jとする

3.こうする事によって点 X の取りうる位置の幅が広がり、一様に格子を配置出来るので、その中で三

角形の部分を抽出する(三角形をはみ出した場合反転させるようにする)

4.上記と同じく I、Jをずらして行き一定範囲内の AX+BX+CXの最小値を保持する

とする。

以下に実際に実装した実装例としてソースコードを示す。

Microsoft Office Excel 2010上で VBAを用いてプログラミングを行った。

Page 3: Simulation_Report1

2

――――― 以下 ソースコード ―――――

Function Systematic()

Dim Ax, Ay, Bx, By, Cx, Cy As Double '座標

Dim Zx, Zy As Double '調べる点の座標

Dim N As Double '試行回数

Dim L, Lmin As Double '最小の距離

Dim i, j As Integer '繰り返し制御

Dim p, q, r As Double '

Dim dist1, dist2, dist3 As Double '座標間の距離

Lmin = 1000#

With Sheet1

'座標、試行回数読み込み

Ax = .Cells(4, 2)

Ay = .Cells(4, 3)

Bx = .Cells(5, 2)

By = .Cells(5, 3)

Cx = .Cells(6, 2)

Cy = .Cells(6, 3)

N = Sqr(Cells(4, 5))

For i = 1 To N - 1

For j = 1 To N

p = (N - i - j) / N

q = i / N

r = j / N

Page 4: Simulation_Report1

3

If p < 0 Then

p = -p

q = 1 - q

r = 1 - r

End If

Zx = p * Ax + q * Bx + r * Cx

Zy = p * Ay + q * By + r * Cy

dist1 = Sqr((Zx - Ax) ^ 2 + (Zy - Ay) ^ 2)

dist2 = Sqr((Zx - Bx) ^ 2 + (Zy - By) ^ 2)

dist3 = Sqr((Zx - Cx) ^ 2 + (Zy - Cy) ^ 2)

L = dist1 + dist2 + dist3

If L < Lmin Then

Lmin = L

.Cells(4, 8) = Zx

.Cells(4, 9) = Zy

End If

.Cells(5 + ((i - 1) * N) + j - 1, 11) = L

.Cells(5 + ((i - 1) * N) + j - 1, 12) = Zx

.Cells(5 + ((i - 1) * N) + j - 1, 13) = Zy

Next j

Next i

.Cells(4, 7) = Lmin

End With

End Function

――――― ソースコード 終わり ―――――

Page 5: Simulation_Report1

4

○実行結果

試行回数は全て 400回(20 * 20)で行った。

・正三角形

・二等辺三角形

・直角三角形

・鋭角な三角形

・ランダムに 3頂点を生成した三角形

(1~10までの一様な整数の乱数 ==RANDBETWEEN(1,10) で生成 )

をサンプルとして与える。

・正三角形

・二等辺三角形

x yA 2 0

B 0 2C 2.7321 2.7321

頂点の座標

最小値

Lmin x y4.9021 1.656 1.556218

座標

x yA 0 0

B 4 0C 2 3

頂点の座標

最小値

Lmin x y6.4648 2 1.2

座標

Page 6: Simulation_Report1

5

・直角三角形

・鋭角な三角形(x軸が長い)

・鋭角な三角形(y軸が長い)

x yA 0 0

B 1 0C 0 3

頂点の座標

最小値

Lmin x y3.8995 0.35 0.3

座標

x yA 0 0

B 0 1C 100 0

頂点の座標

最小値

Lmin x y101 0 0

座標

x yA 0 0

B 1 0C 0 100

頂点の座標

Lmin x y101 0 0

Page 7: Simulation_Report1

6

・ランダムに 3頂点を生成した三角形 ( 1 )

・ランダムに 3頂点を生成した三角形 ( 2 )

・ランダムに 3頂点を生成した三角形 ( 3 )

x yA 3 10

B 5 2C 8 8

頂点の座標

最小値

Lmin x y11.55 6.15 7.3

座標

x yA 6 8

B 1 4C 2 3

頂点の座標

最小値

Lmin x y7.5969 1.7 3.75

座標

x yA 3 1

B 8 6C 7 10

頂点の座標

最小値

Lmin x y11.224 7.65 6.15

座標

Page 8: Simulation_Report1

7

・ランダムに 3頂点を生成した三角形 ( 4 )

・ランダムに 3頂点を生成した三角形 ( 5 )

・ランダムに 3頂点を生成した三角形 ( 6 )

x yA 8 8

B 6 4C 9 2

頂点の座標

最小値

Lmin x y7.9193 6.9 4.2

座標

x yA 7 8

B 10 8C 8 9

頂点の座標

最小値

Lmin x y3.6346 8.05 8.75

座標

x yA 8 5

B 7 3C 3 3

頂点の座標

最小値

Lmin x y6.2382 6.9 3.2

座標

Page 9: Simulation_Report1

8

■Monte Carlo法

○計算内容・概要

格子を形成し規則的に調べていく Systematic法に比べ、こちらはランダムに図形内に点を生成し

その点からの距離を調べるアプローチを取るものである。

具体的には

1.三角形 ABCの頂点と内部の点 Xの位置ベクトルの関係を利用し、乱数を用いて

三角形内にランダムに点 Xを配置する

2.L = AX + BX + CXを求める

3.これまでの最小値と比較し、最小となる L、Lminを抽出し出力する

以下に実際に実装した実装例としてソースコードを示す。

Systematic法の実装時と同様にMicrosoft Office Excel 2010でVBAを用いてプログラミングを行った。

――――― 以下 ソースコード ―――――

Function montecarlo()

Dim i, N, count As Integer '繰り返し制御

Dim Ax, Ay, Bx, By, Cx, Cy As Integer '頂点座標

Dim Zx, Zy As Double '生成した座標

Dim L, Lmin As Double '最小距離

Dim rand1, rand2, rand3, fact As Double '乱数用

Dim dist1, dist2, dist3 '距離用

Randomize

With Sheet1

Ax = .Cells(3, 2)

Ay = .Cells(3, 3)

Bx = .Cells(4, 2)

By = .Cells(4, 3)

Cx = .Cells(5, 2)

Cy = .Cells(5, 3)

N = .Cells(3, 5)

Page 10: Simulation_Report1

9

Lmin = 999#

For i = 1 To N

rand1 = Rnd()

rand2 = Rnd()

rand3 = Rnd()

fact = 1 / (rand1 + rand2 + rand3)

rand1 = rand1 * fact

rand2 = rand2 * fact

rand3 = rand3 * fact

Zx = rand1 * Ax + rand2 * Bx + rand3 * Cx

Zy = rand1 * Ay + rand2 * By + rand3 * Cy

dist1 = Sqr((Ax - Zx) ^ 2 + (Ay - Zy) ^ 2)

dist2 = Sqr((Bx - Zx) ^ 2 + (By - Zy) ^ 2)

dist3 = Sqr((Cx - Zx) ^ 2 + (Cy - Zy) ^ 2)

L = dist1 + dist2 + dist3

.Cells(i + 2, 11) = Zx

.Cells(i + 2, 12) = Zy

If L < Lmin Then

Lmin = L

.Cells(3, 7) = Lmin

.Cells(3, 8) = Zx

.Cells(3, 9) = Zy

End If

Next i

End With

End Function

――――― 以下 ソースコード終わり ―――――

Page 11: Simulation_Report1

10

○実行結果

今回は Systematic法に合わせる形で試行回数は全て 400回で行った。

また調べる三角形も同様に

・正三角形

・二等辺三角形

・直角三角形

・鋭角な三角形

・ランダムに 3頂点を生成した三角形

とし、サンプルとして与える。比較のため座標も全く同様にした。

・正三角形

・二等辺三角形

x yA 2 0

B 0 2C 2.73 2.73

頂点の座標

最小値 座標

Lmin x y5.092643 1.480856 1.622925

x yA 0 0

B 4 0C 2 3

頂点の座標

最小値 座標

Lmin x y6.465358 2.054128 1.132372

Page 12: Simulation_Report1

11

・直角三角形

・鋭角な三角形(x軸が長い)

・鋭角な三角形(y軸が長い)

x yA 0 0

B 1 0C 0 3

頂点の座標

最小値 座標

Lmin x y3.90018 0.392476 0.249627

x yA 0 0

B 0 1C 100 0

頂点の座標

最小値 座標

Lmin x y100.8783 0.20888 0.404448

x yA 0 0

B 1 0C 0 100

頂点の座標

最小値 座標

Lmin x y100.8741 0.406212 0.232187

Page 13: Simulation_Report1

12

・ランダムに 3頂点を生成した三角形( 1 )

・ランダムに 3頂点を生成した三角形( 2 )

・ランダムに 3頂点を生成した三角形( 3 )

x yA 3 10

B 5 2C 8 8

頂点の座標

最小値 座標

Lmin x y11.54894 6.010303 7.277972

x yA 6 8

B 1 4C 2 3

頂点の座標

最小値 座標

Lmin x y7.590946 1.727644 3.793848

x yA 3 1

B 8 6C 7 10

頂点の座標

最小値 座標

Lmin x y11.2357 7.614158 6.199017

Page 14: Simulation_Report1

13

・ランダムに 3頂点を生成した三角形( 4 )

・ランダムに 3頂点を生成した三角形( 5 )

・ランダムに 3頂点を生成した三角形( 6 )

x yA 8 8

B 6 4C 9 2

頂点の座標

最小値 座標

Lmin x y7.920299 6.876857 4.171129

x yA 7 8

B 10 8C 8 9

頂点の座標

最小値 座標

Lmin x y3.637884 8.055263 8.704134

x yA 8 5

B 7 3C 3 3

頂点の座標

最小値 座標

Lmin x y6.246738 6.828555 3.264429

Page 15: Simulation_Report1

14

■考察

まずは両方法における精度の高さを比較する。

今回の場合は Lminの値が低い方がより精度が高い(○を記述)とする。

表1 Systematicと Monte Carloの Lminの値比較(試行回数 400回)

上記の表からわかる通り、試行回数 400回における差異はそこまで認められず、

また各 Lminの値を比較してわかる通り、Lminの値自体にも、あくまで座標の値の大きさ、

つまり三角形の大きさとの比率で見て、ではあるが、大きな差は認められなかった。

ゆえに試行回数を増やしても圧倒的にどちらが有利と言い切れる差が出るとは断定し切れない事が予測

出来る。

しかし観点別に見ると若干ながら差異が出る。

実用上の観点から見ると、例えば乱数を用いた方法、つまりMonte Carlo法の方は、

出力したデータと同じ出力データを再び出力出来ない、つまり再現性が低く、

また数理的な証明に利用する場合にその正当性の保証が大変難しくなると言う難点が予想出来る。

またその時々によって精度の良さが左右されるので、試行回数を十分大きくしなければ

大きな偏りが出る可能性が否定出来ない所もある事を今回より実践的に理解出来たと言える。

加えて今回はMonte Carlo法を実装するに当たって一様性を持たせられなかったので、

どうしても頂点付近の点が少なくなる、つまりその点でも偏りが出てしまったが、

これが有利に働く可能性も否定はし切れないことが考えられる。このデータの偏りは恐らく中心極限定

理に拠るものでは無いだろうか。

Systematic Monte Carlo正三角形 ○二等辺三角形 ○直角三角形 ○鋭角な三角形(x軸に長い) ○鋭角な三角形(y軸に長い) ○ランダムな三角形(1) ○ランダムな三角形(2) ○ランダムな三角形(3) ○ランダムな三角形(4) ○ランダムな三角形(5) ○ランダムな三角形(6) ○

種類

方法

精度比較

Page 16: Simulation_Report1

15

一方で、出力手法に重みを置かずただ結果のみを採用する場合や、今回のシミュレーションにおいては

例えば大きな三角形の場合であると、Systematic法よりもMonte Carlo 法の方が良いとも考えられる。

今回それを検証するため、x軸に極端に長い鋭角な三角形、y軸に極端に長い鋭角な三角形を用いて

比較を行ったが、予測通りMonte Carlo法の方が精度が高かった。これは Systematicで大きな三角形を

格子状に分割する際、そのマス目は試行回数と反比例するように巨大化し、より効率的な箇所も飛ばし

て比較を行うためであることが考えられる。しかし予測ほど実測値に開きが出なかったので、この点に

おいては議論の余地が大幅に残されているとし要検証であるだろう。

結論として、今回の実験では Systematic、Monte Carlo、どちらの手法も大きな差異は見受けられない

が、実際に活用していく際に使い分けてゆく必要性を見つめることが出来た。

■課題・今後の展望

今回の実験では、数え切れないほど多くの課題を残し、検証も大変に不十分であった。

しかし見えてくるものも多かったのでそれらに関しても考察・記述する。

○三角形の種類の選定

今回、こういった実験に対し目測や予測の経験の無さ、不十分さを十二分に痛感した。

まずこういった場合どういう観点で枠組みを決めれば良いのかわからず、三角形の種類と、差異が出そ

うな種を幾つか挙げるに留まったが、本来であれば考え得る限りの枠組みで検証してみるべきであった

と感じた。その点で言えば x軸のみ極端に大きい、y軸のみ極端に大きい、などは非常に好例であったが

例えば乱数で頂点を生成するなどは不必要とまでは行かないが意義が不足している印象を受けた。

それは上述の通り乱数に拠って生成したものはその再現性やバラつきに拠って人間に取って意味を捉え

辛いという事実を背景とする。

○速度やオーダの比較

今回はプログラムのソースコードに関して強く踏み込まなかったが、実際はソースコードの検証も非常

に有意義であり十分な必要性を持つと感じた。例えばそこから効率化や高速化の糸口を見付けられれば

広い範囲において応用が利くためである。今回に限って言えばアルゴリズムや目的はわかりつつ、数学

への不慣れから上手く自分の中でイメージ化や既存の知識との結び付けが難航した。今後こういった事

態に陥った時にどの様に対処するかは常に考え続けてゆくべき課題であると強く認識した。

Page 17: Simulation_Report1

16

○試行回数の変更

今回は一律で試行回数を 400としたので、その事によって見えてこなかったものも恐らくあると考えら

れる。勿論闇雲に行えば良いと言うものでも無いので上述の通りその要素の選定にも技術を培っていく

必要性を感じ、実験や成果をまとめる難しさの壁に当たった印象である。

○他の検討方法・実装不足な箇所

今回実装できたのは一様な Systematicと一様でないMonte Carloのみであり、また角度(∠AXB等)

の算出もわからず残ってしまった。また他の検討方法として、中心近くのみを探索する方法、それに関

連して明らかに違いそうな所を除去する方法、などが浮かんだが実装方法が浮かばず断念した経緯もあ

る。これらはあって無駄、ということは無さそうなので、今回は期限までの時間の使い方を誤ったが

今後の挑戦課題として取り組んで行く次第である。

○応用発展

今回は二次元平面上での実験であったが、応用させれば 3次や更に高次元、複素平面上でも活用してい

けるのではと考える。更にグラフ理論、取り分け思いついたのはダイクストラ法やベルマンフォード法

や A*法などのように経路探索、最短経路問題等にも有効でありそうなことである。

どの様に繋ぎ合わせるかはまだ道筋すら見えないが、壁にぶつかるだけでなくそう言った楽しみを見出

だせる実験であった。

■結び

上述の通り種々新しい気付きもあったが、概ねは反省やそれに準ずる方向であったので、

これからの糧として行き、行く行くは取り組む研究に対する知識や技術、経験の集約に努めたい所であ

る。

それから今回は珍しく参考にする物が授業内で扱ったプリントやノートのみであったので、

ネット上でも色々と調べることを試み、より多くの道への道標としたい。

今回は時間の見積もりを誤ってしまったので慢性的な時間不足と闘いながらの作成であったが、

次回以降は十分な時間と前条件(数学など)を以て形を問わず良質な成果発表を行えるように

してゆく次第である決意の表明を以て本レポートの結びとする。