10

Python を使用してオンザフライでヒストグラムを作成することに関する概念的な質問があります。良いアルゴリズムや既存のパッケージがあるかどうかを調べようとしています。

モンテカルロ シミュレーションを実行し、1,000,000,000 回呼び出され、各実行の最後に 64 ビット浮動小数点数を返す関数を作成しました。以下は、前述の関数です。

def MonteCarlo(df,head,span):
    # Pick initial truck
    rnd_truck = np.random.randint(0,len(df))
    full_length = df['length'][rnd_truck]
    full_weight = df['gvw'][rnd_truck]

    # Loop using other random trucks until the bridge is full
    while True:
        rnd_truck = np.random.randint(0,len(df))
        full_length += head + df['length'][rnd_truck]
        if full_length > span:
            break
        else:
            full_weight += df['gvw'][rnd_truck]

    # Return average weight per feet on the bridge
    return(full_weight/span)

dfは、それぞれトラックの長さと重量である'length'およびのラベルが付いた列を持つ Pandas データフレーム オブジェクトです。は連続する 2 台のトラック間の距離、は橋の長さです。この関数は、トラック トレインの全長が橋の長さよりも短い限り、トラックを橋にランダムに配置します。最後に、1 フィートあたりの橋に存在するトラックの平均重量 (橋に存在する総重量を橋の長さで割った値) を計算します。'gvw'headspan

結果として、返された値の分布を示す表形式のヒストグラムを作成したいと思います。これは後でプロットできます。私はいくつかのアイデアを念頭に置いていました:

  1. 戻り値を numpy ベクトルで収集し続け、モンテカルロ分析が完了したら、既存のヒストグラム関数を使用します。私の計算が正しければ、そのベクトルだけに 7.5 GB のメモリが必要になるため、これは実行可能ではありません (1,000,000,000 64 ビット浮動小数点数 ~ 7.5 GB)。

  2. 指定された範囲とビン数で numpy 配列を初期化します。各実行の最後に、一致するビン内のアイテムの数を 1 ずつ増やします。問題は、取得する値の範囲がわからないことです。範囲と適切なビン サイズでヒストグラムを設定することは不明です。また、正しいビンに値を割り当てる方法を理解する必要がありますが、それは可能だと思います。

  3. どういうわけかその場でそれをしてください。関数が数値を返すたびに、範囲とビンのサイズを変更します。これを最初から書くのは難しすぎると思います。

まあ、この問題を処理するためのより良い方法があるかもしれません。どんなアイデアでも大歓迎です!

2 つ目の注意として、上記の関数を 1,000,000,000 回実行して、計算された最大値を取得することだけをテストしました (コード スニペットは以下にあります)。そして、これには約 1 時間かかりますspan = 200。より長いスパンで実行すると、計算時間が長くなります (橋をトラックで埋めるために while ループの実行時間が長くなります)。これを最適化する方法はありますか?

max_w = 0
i = 1
    while i < 1000000000:
        if max_w < MonteCarlo(df_basic, 15., 200.):
            max_w = MonteCarlo(df_basic, 15., 200.)
    i += 1
print max_w

ありがとう!

4

1 に答える 1