We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
今月本を買って勉強し始めたばかりです。 大変わかりやすく、感謝しております。
ideal_robot5.ipynbについて1点お聞きしたいことがあります。
第3章のロボットのモデル化、3.2.5エージェントの実装のp72最後から4行目で 「描写の後にone_stepを実行するのは,初期状態がアニメーションの最初に描かれるようにするためです.」 と述べていますが、
self.ani = anm.FuncAnimation(fig, self.one_step, fargs=(elems, ax), frames=1, interval=1000, repeat=False)
上のようにmatplotlib.animationのFuncAnimationでframes=1としても、私の環境ですと、 下図のように左上は「t=0」と表示されていても、ロボットの動作自体は⊿tつまりtime_interval分時刻が進んでしまい初期状態は描写されません。
matplotlib.animation
FuncAnimation
frames=1
time_interval
そこで、 ideal_robot5.ipynbのセル2の
def one_step(self, i, elems, ax): ### fig:one_step_add_one_step while elems: elems.pop().remove()
を
def one_step(self, i, elems, ax): ### fig:one_step_add_one_step print("one_step {}回目呼び出し".format(self.one_step_num)) print("i = {}".format(i)) while elems: elems.pop().remove()
として、jupyter notebook上ではなくコマンドラインで実行し、frames=5として、world.one_step()自体が何回呼び出されているか調べたところ、下図のようになりました。
frames=5
world.one_step()
どうやらmatplotlib.animation.FuncAnimationはまず最初にi=0として1回one_step()を呼び出し、 その後i=0,1,...とone_step()をframes回呼び出すようです。
matplotlib.animation.FuncAnimation
i=0
one_step()
i=0,1,...
frames
なのでこのままですと、最初に描写されるのは、左上に「t=0」と描かれているのにも関わらず、1ステップ時刻が進んだ状態になってしまい、t=0以降のアニメーションもロボットの動作と時刻が⊿tずれてしまうと思われます。
t=0
そこで最初の一回のworld.one_step()の呼び出しではobject.draw()は呼び出すが、object.one_step()は呼び出さないようにすればいいと思うので、少し不細工な実装になってしまうんですが、
object.draw()
object.one_step()
class World: def __init__(self, debug=False): self.objects = [] self.debug = debug #....中略 def one_step(self, i, elems, ax): while elems: elems.pop().remove() elems.append(ax.text(-4.4, 4.5, "t = "+str(i), fontsize=10)) for obj in self.objects: obj.draw(ax, elems) if hasattr(obj, "one_step"): obj.one_step(1.0)
↓
class World: def __init__(self, debug=False): self.objects = [] self.debug = debug self.first_frame=True # そのフレームが1番最初のフレームかどうかのフラグ #....中略 def one_step(self, i, elems, ax): while elems: elems.pop().remove() elems.append(ax.text(-4.4, 4.5, "t = "+str(i), fontsize=10)) if not self.first_frame: for obj in self.objects: obj.draw(ax,elems) if hasattr(obj,"one_step"): obj.one_step(1.0) else: # そのフレームが1番最初のフレームだったら、obj.one_step()は実行しない self.first_frame = False for obj in self.objects: obj.draw(ax,elems)
とすれば、frames=1とした場合のアニメーションは
となり、t=0の初期状態が描写されるようになります。t=0以降もロボットの動作と時刻がずれることもなくなると思います。
長々と説明してしまいましたが、この時刻がずれてしまう問題、もっといい実装があるとは思いますがいかがでしょうか?
The text was updated successfully, but these errors were encountered:
ありがとうございます。「私の環境ですと、」とのことなので環境依存なのかなと思うのですが、そうでもなさそうです。
観測と移動をワンステップに収めるためというのと、教科書用のコードで行数が増えるのは絶対的に悪なのでそうしたような気がするのですが、個人的にはあまり気にならないので、他の方からも指摘があれば対処いたします。
Sorry, something went wrong.
matplotlib.animation.FuncAnimation の init_func 引数に関する説明に記載がありますが、これ自体は規定の動作のようですね。
init_func
cf. https://matplotlib.org/stable/api/_as_gen/matplotlib.animation.FuncAnimation.html#matplotlib-animation-funcanimation
該当箇所のケースであれば、以下のように init_func に副作用のない適当な関数を明示的に渡せば回避できているように見えます。
anm.FuncAnimation(..., init_func=labmda : None)
No branches or pull requests
今月本を買って勉強し始めたばかりです。
大変わかりやすく、感謝しております。
ideal_robot5.ipynbについて1点お聞きしたいことがあります。
第3章のロボットのモデル化、3.2.5エージェントの実装のp72最後から4行目で
「描写の後にone_stepを実行するのは,初期状態がアニメーションの最初に描かれるようにするためです.」
と述べていますが、
上のように
matplotlib.animation
のFuncAnimation
でframes=1
としても、私の環境ですと、下図のように左上は「t=0」と表示されていても、ロボットの動作自体は⊿tつまり
time_interval
分時刻が進んでしまい初期状態は描写されません。そこで、
ideal_robot5.ipynbのセル2の
を
として、jupyter notebook上ではなくコマンドラインで実行し、
frames=5
として、world.one_step()
自体が何回呼び出されているか調べたところ、下図のようになりました。どうやら
matplotlib.animation.FuncAnimation
はまず最初にi=0
として1回one_step()
を呼び出し、その後
i=0,1,...
とone_step()
をframes
回呼び出すようです。なのでこのままですと、最初に描写されるのは、左上に「t=0」と描かれているのにも関わらず、1ステップ時刻が進んだ状態になってしまい、
t=0
以降のアニメーションもロボットの動作と時刻が⊿tずれてしまうと思われます。そこで最初の一回の
world.one_step()
の呼び出しではobject.draw()
は呼び出すが、object.one_step()
は呼び出さないようにすればいいと思うので、少し不細工な実装になってしまうんですが、↓
とすれば、
frames=1
とした場合のアニメーションはとなり、
t=0
の初期状態が描写されるようになります。t=0
以降もロボットの動作と時刻がずれることもなくなると思います。長々と説明してしまいましたが、この時刻がずれてしまう問題、もっといい実装があるとは思いますがいかがでしょうか?
The text was updated successfully, but these errors were encountered: