フランソワ・ベルジェレット書きました:
より力強いゲームへの第4の方法
こんにちはリー、
JMPは非常に優れた機能、望ましさの機能を持っています。これはまた、より重い問題を解決するためにも使用できます。
- 正規分布からのランダムデータを使用して、色ごとに1つずつ、4つの新しい列を持つデータセットを作成します。Random Normal()* 3
- 色を線の合計とリンクさせる公式を使用して、1行に1つずつ、合計5つの新しい変数yを作成します(例:y1 = 5black + 5blue ...)。
- 色とy1からy5までの結果のランダムデータで100 000行を作成
- 色を説明変数として、y1からy5までのモデルをあてはめる
- フィットモデルプラットフォームでは、効果のスクリーニングを重視し、yごとに望ましさを目標の12に設定します(y = 12のとき望ましさ= 1、yが12から離れているとき0になります)
- 最大化オプションの収束許容誤差は、1E-12に設定され、より大きな問題の正確な数値結果が得られます(わずか数ms長くなります)。
- 望ましさを最大にすると、黒= 5、青= 1、茶= 3、赤= 1.5となります。
要求に応じて利用可能なデータセット
FrançoisBergeret(フランス出身)
このブログ記事は、SASではなくなったブロガーによって書かれました
私の友達や同僚は私をかなり小さなフランス語圏の電話として知っています。私はできるだけフランスに旅行します。私は現在ノースカロライナ州立大学でこの問題について修士号を取得しています。そして、私はフランスのすべての新聞や雑誌を手に入れます。
ルフィガロ補足を追加する日刊紙です。ルフィガロマガジンその土曜日版に。アートニュース、コラムニスト、そして私のお気に入りのゲームがあります。
私は、フランス人が私たちが劇的に面白くないと考えるものから単純にゲームを作る方法に一貫して驚いています。たとえば、ある雑誌のゲームでは、Blaise Pascalから彼の兄弟への手紙に関連しています。(b)16個のつづりまたは言語の誤りを訂正する。(c)15の異常、時代錯誤、または歴史的不可能性を見つける。
数ゲームのうちの1つが私に飛び出しました(意図されたとおり)。これがJMPを使って解決しようとしているゲームです。
[ ライン上のボールの総数が常に12に等しいことを知っている、各色のボールの値を探します。]
この問題を解決するには、少なくとも3つの方法があります。これらのことについて考えた場合、Chez McDoでHappy Meal™を食べるのにかかる時間よりも長くなることがあります。
方法1:ブルートフォース
非常に強引なアプローチはすべての可能な色をループすることです( 赤= x 、茶色= y 、黒= z。青= w それらがゼロより小さくなくても12より大きくてはいけないことを認めること。これを行うJMPスクリプトは次のとおりです。Fourの0から12までの各値を0.5のステップで循環させるループ。結果にヒットすると、結果をログに書き込みます。
For( x = 1, x <= 12, x += 0.5,
For( y = 1, y <= 12, y += 0.5,
For( z = 1, z <= 12, z += 0.5,
For( w = 1, w <= 12, w += 0.5,
If( 2 * z + 2 * w == 12,
If( z + 2 * y + w == 12,
If( 3 * y + 2 * x == 12,
If( z + y + 4 * w == 12,
If( z + w + 4 * x == 12,
Show( x, y, z, w );
)
)
)
)
)
)
)
)
)
結果?赤= 1.5 、ブラウン= 3 、黒= 5。青= 1
方法2:最小二乗法
次の方法は、これを最小二乗問題として認識することです。ボールに付けられた値は、ボール自体がデータとして機能する線形モデルの係数です。それで、5行と4色のボールに関する情報を保持するJMPデータテーブルを作ることができます。目撃するには:
そして、JMPのFit Modelウィンドウを使って、ボールの最小二乗推定値を得ることができます。線形モデルは原点を通るべきであることがわかっているので、私は傍受なしモデルを使用しています。
そのように(「バム!」私は自分自身に言う)、私は結果とパズルへの答えを得ます。
方法3 数学を使う
あなたが過去40年間に代数IIを取ったならば、あなたはマトリックスと呼ばれるこれらの事を研究しました。彼らは実際に有用であることがわかった。そして、あなたがその最小二乗の意味でパズルを認識しないならば、それを見るのには常にこの数学的な方法があります。誰にも言わないでください、しかし、それらは実際には同じアプローチです:あなたが以下で見る数学はJMPの舞台裏で起こっていることです。
行列を使ってパズルの設定を表現する場合(パズルの5行を表す5行)、テーブル自体をこのように表現することができます(それを呼び出します)。 A )
A = [0 0 2 2
0 2 1 1
2 3 0 0
0 1 1 4
4 0 1 1]
これら5つの条件がすべて12になるという事実は、
C = [12
12
12
12
12]
最終行列で b 未知数を表す:ボールの価値。
b = [x
y
z
w]
これを解決するために、我々は単に始めなければなりません
Ab = C
そして得る b 方程式の左側に単独で。典型的には、私たちは両側を乗じるという単純なことをするでしょう A -1 、このような:
A -1 Ab = A -1 C
しかし、あなたは問題があることを知りませんか。パズルには4つの変数と5つの行があるので、その行列表現は正方形ではありません。だから普通の逆行列を使うことはできない。これはまだ可逆ではありませんが、Aにその転置を掛けて正方行列を得ることができます。幸いなことに、JMPにはムーアペンローズ一般逆行列関数(イタリック体のほうがいいですね。) それを使って、行列を割り当て問題を解決する簡単なJMPスクリプトを書くことができます。
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
ginverse(A`*A)*A`*C;
結果を与える(丸め誤差があるので、私は微妙な逆変換過程にあると思います)
[1.5, 3, 5.00000000000001, 0.999999999999994]
同じ答えです。そして丸め誤差があなたに別れを告げるならば、代わりにJMPのSolve関数を使うことができます。
A = [ 0 0 2 2, 0 2 1 1, 2 3 0 0, 0 1 1 4, 4 0 1 1];
C = [12, 12, 12, 12, 12];
solve((A`*A),A`*C);