大規模r
で、b
モンテカルロ積分と呼ばれる方法を使用できます。たとえば、ウィキペディア(および/またはSICPの3.1.2章)のモンテカルロ積分を参照して、合計を計算してください。小さくr
てb
大幅に異なるノード障害確率p[i]
の場合、正確な方法が優れています。小と大の正確な定義は、いくつかの要因に依存し、実験的に試すのが最適です。
特定のサンプルコード:これは、このような手順がどのように機能するかを示すための非常に基本的なサンプルコード(Python)です。
def montecarlo(p, rb, N):
"""Corresponds to the binomial coefficient formula."""
import random
succ = 0
# Run N samples
for i in xrange(N):
# Generate a single test case
alivenum = 0
for j in xrange(rb):
if random.random()<p: alivenum += 1
# If the test case succeeds, increase succ
if alivenum >= b: succ += 1
# The final result is the number of successful cases/number of total cases
# (I.e., a probability between 0 and 1)
return float(succ)/N
この関数は二項検定ケースに対応し、テストを実行して、ノード外のノードが失敗の確率で生きているN
かどうかをチェックします。いくつかの実験では、妥当な結果を得る前に数千のサンプルの範囲の値が必要であることがわかりますが、原則として複雑さはです。結果の精度は次のようにスケーリングされます。つまり、精度を2倍に上げるには、4倍に増やす必要があります。十分に大きい場合、この方法は明らかに優れています。b
r*b
p
N
O(N*r*b)
sqrt(N)
N
r*b
近似の拡張:システムのすべてのプロパティを尊重するように、テストケースを設計する必要があることは明らかです。いくつかの拡張機能を提案しましたが、そのうちのいくつかは簡単に実装できますが、他の拡張機能は実装できません。いくつかの提案をさせてください。
1)明確であるが無相関の場合p[i]
、上記のコードの変更は最小限です。関数ヘッドで、単一のfloatの代わりに配列を渡し、p
行を次のように置き換えますif random.random()<p: alivenum += 1
。
if random.random()<p[j]: alivenum += 1
2)相関の場合p[i]
、システムに関する追加情報が必要です。コメントで言及していた状況は、次のようなネットワークである可能性があります。
A--B--C
| |
D E
|
F--G--H
|
J
この場合A
、「ルートノード」である可能性があり、ノードの障害は、ノード、、、および;D
の確率が100%の自動障害を意味する可能性があります。一方、ノードの障害は自動的にダウンするなどです。少なくとも、これは私のコメントで言及したケースでした(元の質問で確率のツリー構造について話しているので、これはもっともらしい解釈です)。このような状況では、ツリー構造を参照してツリーをトラバースするコードを変更する必要があります。テストが失敗するとすぐに、現在のノードから下位のブランチをスキップします。もちろん、結果のテストは以前と同じかどうかです。F
G
H
J
F
G
H
J
p
for j in ...
alivenum >= b
3)ネットワークがツリー構造で表すことができない閉路グラフである場合、このアプローチは失敗します。このような場合、最初にデッドまたはアライブのグラフノードを作成してから、グラフ上でルーティングアルゴリズムを実行して、一意で到達可能なノードの数をカウントする必要があります。これにより、アルゴリズムの時間計算量は増加しませんが、明らかにコードの複雑度は増加しません。
4)時間依存性は自明ではありませんが、mtbf / r(平均故障間隔/修理)がわかっている場合はp
、ツリー構造または無相関線形の確率をp[i]
次のように与えることができるため、変更が可能です。指数の合計。次に、MCプロシージャをさまざまな時間に実行し、に対応する結果を得る必要がありp
ます。
5)ログファイルだけを持っている場合(最後の段落で示唆されているように)、このボードでできることを超えたアプローチの大幅な変更が必要になります。p
ログファイルは、ネットワークグラフ(したがってのグラフ)のモデルと、のすべてのノードの個々の値を再構築できるように、十分に徹底している必要がありますp
。そうしないと、精度が信頼できなくなります。これらのログファイルは、障害や修復のタイムスケールよりも大幅に長くする必要があります。これは、実際のネットワークでは現実的ではない可能性がある仮定です。