グリッド内を移動する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 を使用して、より具体的にすることを強く検討しました。それはうまくいきますか?それがとても遅い理由は他にありますか?