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

質問 (解決済み)

[artisocモデル] モデル内で目的地に向かい、一旦止まり、そのままスタート地点へ戻る場合
質問者: mikoさん , 質問日時: 2019/06/21 17:00
モデル内で目的地に向かい(目的地X,目的地Yへ)、一旦止まり、元の場所へ戻る(初期値X,初期値Yへ)場合はどう区切ればよいのでしょうか。
以下のようにコマンドを書くとエージェントが目的地へ変な動き方
をしながら向かっていってしまいます。宜しくお願い致します。

Agt_Init{
My.X=1
My.Y=0
My.目的地Y=Rnd()*15
My.目的地X=13-3*CInt(Rnd()*5)
My.初期値X=1
My.初期値Y=0
}
Agt_Step{
If My.目的地X>My.X then
//My.目的地X == My.Xの時はこの中に入ってこない
ForwardXCell(1)
  Return
else if My.目的地X<My.X then
//My.目的地X == My.Xの時はこの中に入ってこない
ForwardXCell(-1)
Return
end if
If My.目的地Y>My.Y then
ForwardYCell(1)
else
end if
end if


If My.初期値X>My.目的地X then
ForwardXCell(1)
  Return
else if My.初期値X<My.目的地X then
ForwardXCell(-1)
Return
end if
If My.初期値Y<My.目的地Y then
ForwardYCell(-1)
else
end if
end if

}



▼解決した回答


自分が目的地に向かっている状態なのか、目的地から元の場所に戻っている状態なのかを判別する変数を持っておいて、状態によって処理を分けると良いと思います。

例えば、エージェントの変数に「移動の状態」という変数を持ちます。

// My.移動の状態 == 0 目的地に向かっているとき
// My.移動の状態 == 1 目的地に到着して、元の場所に戻っているとき

If My.移動の状態 == 0 Then
//目的地に向かって移動しているときの処理
If My.目的地X>My.X then
//My.目的地X == My.Xの時はこの中に入ってこない

~~~~~
~~~~~

If My.目的地Y == My. Y And My.目的地X == My. X Then
My.移動の状態 = 1 //到着したので、状態を変える
End If
End If

If My.移動の状態 == 1 Then
//目的地に到着して、元の場所に戻っているとき
If My.初期値X>My.目的地X then

~~~~~
~~~~~

End If

回答者: ObiWan さん , 回答日時: 2019/06/25 13:34

▼ 全ての回答


自分が目的地に向かっている状態なのか、目的地から元の場所に戻っている状態なのかを判別する変数を持っておいて、状態によって処理を分けると良いと思います。

例えば、エージェントの変数に「移動の状態」という変数を持ちます。

// My.移動の状態 == 0 目的地に向かっているとき
// My.移動の状態 == 1 目的地に到着して、元の場所に戻っているとき

If My.移動の状態 == 0 Then
//目的地に向かって移動しているときの処理
If My.目的地X>My.X then
//My.目的地X == My.Xの時はこの中に入ってこない

~~~~~
~~~~~

If My.目的地Y == My. Y And My.目的地X == My. X Then
My.移動の状態 = 1 //到着したので、状態を変える
End If
End If

If My.移動の状態 == 1 Then
//目的地に到着して、元の場所に戻っているとき
If My.初期値X>My.目的地X then

~~~~~
~~~~~

End If

回答者: ObiWan さん , 回答日時: 2019/06/25 13:34
どうもありがとうございます。
移動の状態は整数型にしました。
そして書いてみたら初期値のYまでは戻ることができましたが、その後とどまり(↓*****以下の部分)、X軸方向に動かなくなってしまいました。

何度も見直しましたが、動きません。ご教示お願い致します。

Agt_Init{
My.X=1
My.Y=0
My.目的地X=13-3*CInt(Rnd()*5)
My.目的地Y=Rnd()*15
My.初期値X=1
My.初期値Y=0
}

Agt_Step{

If My.移動の状態 ==0 Then
If My.目的地X>My.X then
//My.目的地X == My.Xの時はこの中に入ってこない
ForwardXCell(1)
  Return
else if My.目的地X<My.X then
//My.目的地X == My.Xの時はこの中に入ってこない
ForwardXCell(-1)
Return
end if

If My.目的地Y>My.Y then
ForwardYCell(1)
return
else
end if
end if

If My.目的地Y ==My.Y and My.目的地X ==My.X Then
My.移動の状態 = 1 //到着したので、状態を変える
End If
End If

If My.移動の状態 == 1 Then
//目的地に到着して、元の場所に戻っているとき
If My.初期値Y<My.Y then
ForwardYCell(-1)
return
else if My.初期値Y>My.Y then
ForwardYCell(1)
return
end if

*****ここから動かなくなってしまいました。

if My.初期値X>My.X then
ForwardXCell(1)
Return
If My.初期値X<My.X then
ForwardXCell(-1)
  Return
end if
end if
end if
end if
}

回答者: さん , 回答日時: 2019/06/25 18:40
If文をたくさん使っていますが、階層があっていない(変なEnd Ifが入っている?)のではと思います。

一度、実行したい処理の流れをフローチャートに書いてからコードを書くとわかりやすいかもしれません。また、長くなってくるとわかりにくくなるので、SubやFunctionでプログラムをいくつかの処理に分割するとわかりやすくなります。

プログラムは書いた通りに動くので、動作がおかしい場所で各変数の値がどのようになっているか見ると良いでしょう。
artisocの表示メニューからパラメータ情報画面を開くと、エージェントの変数の状態をリアルタイムで見ることができますので活用してみてください。

回答者: ObiWan さん , 回答日時: 2019/06/25 19:14
どうもありがとうございます。
Sub,Function,パラメータ情報画面についてはどこから勉強をしてよいのかまだよく分かっていませんが、今現在のルールエディタ上の自分の問題は解決しました。

回答者: miko さん , 回答日時: 2019/06/25 19:47

MASコミュニティ
掲示板TOP







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