裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

「メダルツアー」問題

2018年03月21日 | ブログラミング

「メダルツアー」問題
http://riverplus.hatenablog.com/entry/2018/02/25/143351

自然数 w, h に対し、横と縦の長さがそれぞれ w, h となる格子状の道を考えます。
さらに、自然数 m に対し、左から m 番目の縦の道の、各交差点の中間にメダルが 1 個ずつ置いてあります。
例えば下図は、w, h, m = (4, 3, 2) のときの様子です。


この図の左下の点からスタートして、右上のゴールまで最短距離で向かいます。
途中で通過したメダルはすべて拾います。
取り得る経路を等しい確率で選ぶとき、拾うメダルの個数の期待値を F(w, h, m) と定義します。
例えば F(3, 2, 2) = 0.5 です。
取り得る経路は下図の 10 通りで、そのうちメダルを 2 個拾うものが 1 通り、1 個拾うものが 3 通り、0 個拾うものが 6 通りです。
したがって、期待値は 2×(1/10)+1×(3/10)+0×(6/10) = 0.5 と計算できます。


同様に、F(1, 1, 1)=0.5, F(2, 1, 3)=1/3, F(4, 3, 2)=0.6 となることが確かめられます。
小数点以下が 7 桁になるよう四捨五入した F(10, 10, 3) の値を求めて下さい。

=================================================================

末尾に示す簡単なプログラムで w, h の小さい部分についての解を求めると結果は以下のようになる
この問題において,m は解に無関係であることはすぐに分かる
関係性は,ずばり,h/(w+1)


f = function(w, h,  m) {
  g = function(k) {
    x = y = integer(wh+2)
    x[1] = y[1] = 1
    p = integer(wh)
    p[k] = 1
    for (i in 1:wh) {
      if (p[i] == 1) {
        x[i+1] = x[i]+1
        y[i+1] = y[i]
      } else {
        x[i+1] = x[i]
        y[i+1] = y[i]+1
      }
    }
    count = 0
    for (i in 1:wh1) {
      if (x[i] == m && x[i+1] == m && y[i+1]-y[i] == 1) {
        count = count+1
      }
    }
    return(count)
  }
  wh = w+h
  wh1 = wh+1
  a = combn(wh, w, g)
  b = table(a)
  l = length(b)
  value = as.integer(names(b))
  e  = 0
  for (i in 1:l) {
    e = e+value[i]*b[i]
  }
  return(e/sum(b))
}

別解,解説

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ナンプレを解くプログラム | トップ | 「奇数和平方数」問題 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事