• 締切済み

VBAを使って全おもりの重さの期待値を出したい。

ここに1g、2g、3g、・・・、16gの16個のおもりがあります。重さは見た目では判断出来ないと考えて下さい。おもりの軽い方を判別出来る天秤が8つあります。全天秤に皿が2つずつあり、全皿おもりを1個ずつのせられるものとします。8つの天秤を1度同時に使う作業を1作業とします。特に重さがわかっていない2個のおもりの軽い方の重さの期待値は5.67g。期待値5.67gどうしで軽い方の重さの期待値は3.4g。期待値3.4gどうしで軽い方の重さの期待値は1.89g。期待値1.89gどうしで軽い方の重さの期待値は1gです。ここまでで4作業必要でした。僕がやりたい事はこの4作業で全おもりの重さの期待値を出す事です。全おもりにA1からP1まで名前を付け、エクセルのA1からP1にそれぞれの重さの期待値を出したいのです。8天秤左から右に並べ両皿とも見えるものとし重さの期待値が小さいおもりほど左の天秤にのせて軽さくらべをします。そして期待値を出し、また期待値が小さいおもりほど左の天秤にのせてを4作業行うと考えて下さい。VBAを使ってA1<B1などの条件を付け加えていくだけで全おもりの重さの期待値を出す事は出来るでしょうか?

みんなの回答

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.6

カルタのルールはよくわかりませんが、 最初の4試合の勝率だけでは実力の差は 判定が難しいだろうと思います。 そこで、4試合の中身がわかれば多少なりとも シュミレーションの手助けなるのではと思います。 たとえば、囲碁では半目勝ち、あるいは中押し勝ち というものがあります。もちろん試合時間もあるかも しれません。 もし、カルタ勝敗の中に獲得枚数というものが記録 されていれば、それは期待値に大きく影響するはずです。 また、囲碁のような中押し勝ちのような試合が最後の 一枚の取り合いにならないうちに終わるようなことならば、 中押し勝ちのポイントと残りの枚数の獲得分配を その試合が終わった時点での獲得枚数に比例させて 分配し、ポイントを増やす、あるいは残りは総取り というようなものを試合結果に入れていけば期待値 は大きく変わってきます。 実力が拮抗した者同士では獲得枚数の差はないかもしれないし、 あるいはその時の状況によって拮抗していても実力の下位の 者が中押し勝ちをするかもしれません。当然ながらはるか下位 のものが実力者に中押し勝ちをするかもしれません。しかし、 試合ですから、その日、その時の状況に左右されるのは当然でそれも 実力とすれば、このようなことをシュミレーションに 入れていけばかなりいい線のものができるのでは、と思います。 以上は、返事をいただいた時点で作成しました。その後、 正月のお神酒の残り香を減少させつつ以上の点を考慮して 相関係数を持ち出していろいろシュミレーションして みました。 また、試合形式がシュミレーションに影響するかという ことも考えようとしましたがこれは少し時間が無さ過ぎるので 課題としました。つまり、たとえば、16人を4つのグループに 分けて各自3試合行い、グループ内総当りをし、その勝敗によって 次の対戦相手を選定する、あるいはノックダウンで対戦相手を 選定するなどいろいろです。 何はともあれ、恣意的な判断がなるべく入らないように 試合毎に出てくるデータを分析して4試合終了時で 実力に応じた対戦相手の選定はかなり現実に 近くなるのでは、と思います。 実は、これはトランプの話のときに思いついていたので すが、計算上の期待値ではなく、トランプの相対的な 数値の差と勝敗を加味すれば次の試合の組み合わせには 影響する、しかし1試合ではなく、4試合後ならばデータと しては歩留まりのいいデータになる、なおかつ1試合 終了するごとにシュミレーションの結果との相関を プロットし、相関曲線(あるいは直線)に近くなるか 判定できるのではと思います。相関ではなく他の方法でも かまいません。 やはり、期待値は無から有ではなく、現実の結果の 積み重ねの延長上に可能性として設定しないと 何よりも試合をつつがなく進行しようとして おられるgashigeruさんが一番徒労をかみしめる ことになります。 たまたま、Excelで計算をということでこのカテに 投稿されたのだろうと思います。私もこういった 議論は大好きなのですが、如何せんお神酒の影響が まだ残っているので話が支離滅裂になる前に 一旦終わります。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.5

4試合というのは会場全体で4試合なのですか。 あるいは一人が4試合ということですか。 文脈からすると一人4試合のような感じですが。 会場全体で4試合ならば手も足も出ませんが。

gashigeru
質問者

お礼

一人4試合です。4試合分しか時間がありません。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.4

おおざっぱにですが。 質問のような方法で期待値を出すのは無理です。期待値は 本来、事象x確立の集合を足して出します。 たとえば、16人の勝つ確率が、 (A) 0.3 0.301 0.302 0.303・・・・0.315 である場合と、 (B) 0 1/15 2/15・・・・・・14/15 15/15 のような場合、(A)の場合は最強の人間が4試合戦って 全て負ける確率は0ではない。反対に一番弱い人間が すべて勝つ確率は0ではない。 ところが、(B)の場合は、最強の人間はかならず 全ての試合に勝つ。一番弱い人間は必ず負ける。 ところが、4/15以上の勝つ確率を持つ人間は4試合 やってすべて勝つ確率は0ではないから、順序は つけられない、すなわち強さの期待値ははじきだせない。 つまり、2番目の場合のみ総当りして期待値と強さの 順序が確定できるということになります。

gashigeru
質問者

お礼

指摘ありがとうございます。現実はそうなんですよ。でも1位とか2位とか16位まで出したいわけなんですね。そのための方法として1位から16位までを上下が成り立つように当てはめた全パターンの平均を使おうと考えたのです。もちろん自力で出すのは無理です。結果VBAを使う事を勧められました。果たしてVBAで可能なのかは僕にはわかりません。指摘ありがとうございます。納得のいく順位決めをして評価を得たいと思っているところです。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

この質問は質問の仕方が良くなくてわかりにくいと思う。 (1)期待値と言う統計確率の用語の使い方がただしくない。 数学的な意味を外れて、我流の意味で使ってませんか? (2)VBAの問題ではない。VBAの熟練者でも解けない人はいるでしょう。 アルゴリズム(手順)がわかって、その後にそれに沿ってVBAなりでプログラムを使うことはありえるが 難しいのは、メインは、はかりをどのように使うかという、アルゴリズムでしょう。 パズルにあるような問題だとおもう。あるアイデアが必要な問題でしょう。 数学のカテに質問すべきと思う。 似ているかどうか判ってないが http://web2.incl.ne.jp/yaoki/ansnise3.htm のようなタイプの問題でしょうか。 ーーー >1g、2g、3g、・・・、16gの16個のおもりがあります これは標準分銅 http://www.murakami-koki.co.jp/weights.html 参照 のような、きっちりした重さの分銅のようなものですか。 直ぐ次の文章に>重さは見た目では判断出来ないと考えて下さい、とあるのが紛らわしいのでは? ーーー 以上考慮して質問を書き直してもらわないと、読者に質問の意味が伝わらないのでは? ーー もし質問者が、そうは思わないならこの補足要求は無視してください。

gashigeru
質問者

お礼

なるほど。僕は5つ同じ様な質問をしていますがわかりにくいという答えがよく来ます。多分僕の説明が上手くないのだと思います。該当するおもりの重さとそれである確率の合計なので期待値と呼ぶのかと思っていましたがそうではないのかもしれませんね。このような結果になるというおもりの全パターンの平均が期待値になると考えていますが使い方がおかしいのかもしれません。おもりを効率良く順番通りに近付ける方法を探しています。おもりの判別問題とはちょっと違います。おもりですが0gの箱の中におもりが入っていて中が見えないとでも考えてくれればいいと思います。どの箱にどれが入っているかを8つの天秤を4回使って出来るだけ効率良く見つけ出そうというわけです。もちろん4作業だけでは1gと16gぐらいしか見つからないと思います。4作業しか行なえないのであとは期待値を当てます。何のためかと言うとカルタ大会で順位を出来るだけ正確なのを出したいからです。おもりはわかりやすくするための例として出しています。でも指摘ありがとうございます。いい質問方法に変えたつもりなのですが質問も難しいですね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

#1です。計算はすべての重りの期待値が決定 されるまで、トランプでいえばすべて赤に 変更されるまで。以上です。

gashigeru
質問者

お礼

ありがとうございます。全おもりの判別をするのにはいい方法だと思いました。でも都合により4作業しか行えません。というのは実はおもりは説明のためであり使う目的はカルタ大会の順位決めです。時間の都合で4試合しか行えません。その4試合だけでいかに参加チーム16チームを出来るだけ正確な強さに並べかえるかが僕の課題です。そのために僕は期待値を使おうと思い、質問しました。期待値を出すって難しいですよね。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

文脈からすると期待値とは関係なく最小の重さの 重りを選択していけばいいだけなのでは? 8つの天秤を1度同時に使う作業を1作業とします。特に重さが わかっていない2個のおもりの軽い方の重さの期待値は5.67g。 期待値5.67gどうしで軽い方の重さの期待値は3.4g。期待値 3.4gどうしで軽い方の重さの期待値は1.89g。期待値1.89g どうしで軽い方の重さの期待値は1gです 上記の命題は以下。 (1) >8つの天秤を1度同時に使う作業を1作業とします。 軽いほうの8個を取り出す。 (2) >特に重さがわかっていない2個のおもりの軽い方の重さの期待値は5.67g。 >期待値5.67gどうしで軽い方の重さの期待値は3.4g 軽いほうの4個を取り出す。 (3) >期待値3.4gどうしで軽い方の重さの期待値は1.89g。 軽いほうの2個を取り出す。 (4) >期待値1.89g どうしで軽い方の重さの期待値は1gです 軽いほうの1個を取り出す。 方法 (A) 最初に上記の(1)から(4)までを実行します。その結果 一番小さい重りのものが選択されます。その重りに 1gの期待値を設定します。 プログラム上はデータはランダムに並んでいるので (A1,B1)、(C1,D1)の組み合わせで取り出していくものと します。もちろんどのようにランダムに取り出して 構いません。 (B) 次に同様に(1)から(4)までを実行します。そのとき、 重さ1gのものと一緒にペアになったものを残し、 重り1gの重りは除きます。除いたものにはチェックを 入れます。以降同様に行い、最小の 重さを出します。その結果、重さ2gの重りが決定 され、期待値に2gを設定します。 (C) 以下同様にして重さが判明したものと判明していないものが ペアになった場合は重さが判明していないものを残します。 除いたものにはチェックを入れます。 (D) 以下同様にして、(1)から(4)までを実行し、重さが判明し たもの同士が選択された場合は、便宜上、重いほうの重り を残します。除いたものにはチェックを入れます。 (E) 重りが判定されるごとに最小値を一つ上げます。 以下、(1)から(4)までを(C)(D)(E)の方法に沿って 実行します。(1)から始めるときはチェックをはずして おきます。(E)はとくには必要ないかも知れませんが。 関数で最小値を取り出したり、関数内で最小値を 計算して取り出してもいいかと。 これだけですが。これをExcelでというならば 質問者さんでもコードが組めるのでは? 私は、面倒くさいからAccessで1から16までのIDの フィールド、それぞれのIDにランダムに設定した 重りのフィールド、期待値を記入するフィールド、 はずした重りをチェックしておくフィールドで テーブルを設定し、VBAだけでコードを組みました。 再帰関数と、いくつかの関数で終わりです。 ただし、再帰関数は中で入れ子のループが グルグル回り、一方で、データを行ったり来たり していますが。 いかがですか。Excelでコードを組んでみては。 お正月で時間があるならば、トランプで1から16までの 赤と黒のカードを用意し、黒のカードを十分に切り、 2枚づつ取り出すことで、最初の(1)から(4)までを実行し、 最後に残ったカードを赤に変え、再び(1)から(4)までを (C)(D)(E)の方法に沿って、実行してみてください。 途中でカードを切り直しても結構です。