MAS コミュニティ
artisoc質問用掲示板

質問 (解決済み)

[artisocモデル] サンプルのdangobusについて
質問者: shin59さん , 質問日時: 2019/09/03 22:48
サンプルのdangobusについてなのですが車なし乗客ありでしばらく実行すると団子運転になるのですが原因がわかりません.
わかる方いたら教えていただけると嬉しいです.

*車も乗客もいない状態では団子運転になりませんでした



▼解決した回答


モデルを作成した鈴木です。ご指摘ありがとうございます。確かにおっしゃる通り、しばらく放っておくと団子になります。

論理的には団子にならない筈なのに、モデル上で団子になってしまうのは、座標を計算するときの誤差が原因と思われます。どういうことかと申しますと、このモデルでは、バスや車の座標に、実数型(double)の変数を使っています。たとえば、あるバスのある時点での座標は(X=2.0、Y=71.46284526411…)のような非常に細かな数字で指定されています。

問題は、実数型の変数は、小数を正確に表現できない場合がしばしばあることです。そういう場合は、自動的に近似値に置き換えられています(正確ではないですが、イメージとしては無限に割り切れない小数を途中の桁で四捨五入してそれで済ませる感じです)。これを計算するので、どうしても小さな誤差が生じてしまうのです。

そしてこのモデルの場合、ほんの小さな誤差であってもバス停への到着判定の時に、他のバスと1ステップだけ時間がズレてしまう事があります。例えば、到着判定の範囲に0.00000001だけでも届かなければ、他のバスより1ステップ遅れてしまいます。あとはその差が拡大して団子になってしまいます。車だけでなく乗客もいないときに団子になりにくいのは、バス停そのものが無視されて到着判定によるズレが生じないからだと思われます。

実は整数型(integer)を使うとこの問題は解決できるのですが、動きがカクカクしてしまったり、マップが巨大になってしまったりで、サンプルとしてはいまいちな感じです。

いずれにしても、モデル説明に書いた私の文章が不正確でした。混乱させてしまって、すみませんでした。構造研の方にお願いして修正したいと思います。

回答者: さん , 回答日時: 2019/09/05 13:31

▼ 全ての回答


モデルを作成した鈴木です。ご指摘ありがとうございます。確かにおっしゃる通り、しばらく放っておくと団子になります。

論理的には団子にならない筈なのに、モデル上で団子になってしまうのは、座標を計算するときの誤差が原因と思われます。どういうことかと申しますと、このモデルでは、バスや車の座標に、実数型(double)の変数を使っています。たとえば、あるバスのある時点での座標は(X=2.0、Y=71.46284526411…)のような非常に細かな数字で指定されています。

問題は、実数型の変数は、小数を正確に表現できない場合がしばしばあることです。そういう場合は、自動的に近似値に置き換えられています(正確ではないですが、イメージとしては無限に割り切れない小数を途中の桁で四捨五入してそれで済ませる感じです)。これを計算するので、どうしても小さな誤差が生じてしまうのです。

そしてこのモデルの場合、ほんの小さな誤差であってもバス停への到着判定の時に、他のバスと1ステップだけ時間がズレてしまう事があります。例えば、到着判定の範囲に0.00000001だけでも届かなければ、他のバスより1ステップ遅れてしまいます。あとはその差が拡大して団子になってしまいます。車だけでなく乗客もいないときに団子になりにくいのは、バス停そのものが無視されて到着判定によるズレが生じないからだと思われます。

実は整数型(integer)を使うとこの問題は解決できるのですが、動きがカクカクしてしまったり、マップが巨大になってしまったりで、サンプルとしてはいまいちな感じです。

いずれにしても、モデル説明に書いた私の文章が不正確でした。混乱させてしまって、すみませんでした。構造研の方にお願いして修正したいと思います。

回答者: さん , 回答日時: 2019/09/05 13:31

MASコミュニティ
掲示板TOP







Copyright © KOZO KEIKAKU ENGINEERING Inc. All Rights Reserved.
( 会社情報 情報セキュリティ・個人情報について )