4

グリッド内を移動するN 個のロボットをシミュレートするアプリケーションを開発しました。これらのロボットは、限られたステップ数で訪問したグリッド セルの量を最大化し、ゴール ポイントで合流します。すべて正しく動作しますが、非常に遅いです。現在は python+numpy+mathplotlib です。

ロボットの最大数は 100 のソフト リミットを持つことができます (それが高くなる場合は、あると便利です)。

そのために、私は次のように単純化します。

while steps > 0:
    for robot in robots:
        agent.calc(robot,steps)

ロボットは 1x2 numpy 配列 (x および y 座標) です。

ここでエージェントが何をすべきかを決定します。その場で戦術と戦略を切り替える必要があるため、そのロジックを動かすことはできません。

agent.calcは、ロボットをその場で次々と更新します。

cProfiling すると、次のように返されます。トップの抽出

         39014272 function calls (39010490 primitive calls) in 150.314 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
 12417735   62.807    0.000   62.807    0.000 distance.py:8(taxicab_distance)
   124596   36.882    0.000   36.882    0.000 {numpy.core.multiarray.array}
   113657   30.204    0.000  100.800    0.001 logical_agent.py:16(choose_max_distance_to...)
 12417013    6.579    0.000   69.384    0.000 squaregrid.py:30(distance)
   113700    2.900    0.000  109.769    0.001 logical_agent.py:73(calc)
 11652363    2.625    0.000    2.625    0.000 {method 'append' of 'list' objects}
   161849    1.653    0.000    1.653    0.000 distance.py:11(euclidean_distance)
   113664    1.632    0.000    1.632    0.000 {sorted}
   114834    1.185    0.000    1.185    0.000 {method 'keys' of 'dict' objects}
   113700    0.695    0.000    1.134    0.000 squaregrid.py:19(neighbours)

ロボット用にさまざまな環境を実装しました。最も重要なのはsquaregirdです。マンハッタン/タクシーとユークリッドなど、さまざまなメトリックを使用するつもりだったので、すべての環境には独自の距離関数があります。距離関数は、何度か使用するので、独自のdistance.pyファイルに抽出しました。

taxicab_distanceが多く呼び出されていることがわかります。これは、エージェントが次の位置がまだゴールに到達できるかどうかを確認し、他のすべてのロボットとの距離をヒューリスティックの最適化。

この関数は派手なことは何もしません。

def taxicab_distance(u, v):
    return np.abs(u[0] - v[0]) + np.abs(u[1] - v[1])

私は、Python の関数呼び出しのオーバーヘッドがかなり高いことを知っており、それがパフォーマンスに影響していると思います。{numpy.core.multiarray.array}は無視できます。私が間違っていることはわかっていると思います。

距離呼び出しチェーン: agent -> environment.distance -> taxicab_distance

問題は、関数を呼び出すオーバーヘッドをどのように削減できるかということです。pythons c の拡張性である cython を使用して、より具体的にすることを強く検討しました。それはうまくいきますか?それがとても遅い理由は他にありますか?

4

2 に答える 2

4

まず、次のように書き直します。

def taxicab_distance(u, v):
     return np.sum(np.abs(u - v))

taxicab_distance一度に多くのロボットを計算できますか?

于 2014-01-01T15:02:15.843 に答える
2

インライン化でベンチマークしたところ、約 15 秒かかりました。結局、C++ で数値計算を書き直し、統合に cython を使用しました。その後、わずか1秒かかりました。

編集: cpython -> cython

于 2014-06-22T22:47:17.603 に答える