エージェントが目的地まで一定スピードで移動するプログラムを作りたいです。
ただし目的地を通り過ぎることのないようにしたいです。
My.Direction = GetDirection(My.X, My.Y, office.X, office.Y, Universe.city)
Forward(10)
このように書くと、一定スピードで目的地まで進むことができますが、10ずつ進むため、目的地を通り過ぎでしまい、目的地の前後で行き来を繰り返してしまいます。
目的地を通り過ぎることなく、ピッタリ目的地で止まらせるには、どのようなプログラムを書けばよろしいですか?ご回答よろしくお願い致します。
お求めのコードは以下のようなコードでしょうか
//my.schoolはagt型変数 init{ my.school = createagt(universe.city.school) My.school.X=80 My.school.Y=40 } step{ Pursue(my.school, 5) }
まさしくそのコードでした!
何度もご丁寧にありがとうございました
ご回答ありがとうございます。人工社会構築指南はPDFで所持しており、変数の追加等の使い方も存じ上げております。
現在、添付した画像のように、studentエージェントの中にschoolAエージェントを追加しております。
今回お聞きしたかったのは、変数(エージェント型)として追加した、このschoolAエージェントのX座標とY座標の設定方法です。
studentエージェントのルールエディタにどんなプログラムを書けばX座標とY座標を設定できるのでしょうか?
再びよろしくお願い致します。
基本的な使い方が分からないということでしょうか。
エージェントに変数を追加するのは
右クリックでここから出来ます。
お手元に人工社会構築指南などの資料が何かしらあるかと思われますが、そちらに詳しく書かれています
ご返信ありがとうございます。
ご回答の中にあった、「init{}のほうで生成したschoolをmy.に保持しておいて使うというやり方で上手く行くかと思われます。」という部分が理解できなかったため、もう少し詳しく教えていただけますでしょうか。
Init{
Dim school As Agt
school=CreateAgt(Universe.city.school)
}
と記述をして、hitoエージェントの中に、エージェント型変数schoolを追加しました。
そして、「My.に保持しておいて使う」というのは、このschool変数にX座標とY座標を設定して、Pursue関数を用いて、schoolまでhitoを移動させるという意味だと考えたのですが、
Agt{
Dim school As Agt
My.school.X=80
My.school.Y=40
Pursue(school, 5)
}
のようにはできないため、どのようにこのMyを使えば良いのかわかりませんでした。
何度も申し訳ありませんが、具体的にどのようにすればよろしいのか、再びご回答よろしくお願い致します。
pursueを用いる場合
自宅場所を保存する際にその地点にエージェントを生成しておけばよい
恐らくこの書き方では、毎step CreateAgt(Universe.city.school)が呼び出されています(Universe.city.schoolのエージェント数を数えれば毎step50ずつ増えていくことが確認できるかと思われます。)
init{}のほうで生成したschoolをmy.に保持しておいて使うというやり方で上手く行くかと思われます。同様に記述すれば帰宅も可能でしょう
pursueを用いない場合
distanceよりforward()する値が小さいときはdistance分forwardするか座標をそのまま代入すればいいでしょう
Forward(distance / 3)はこの問題に対応した結果かと思いますが、最初ものすごい速度で帰宅する割に永遠に帰宅出来ない人になっているのでそのような意図ではないならば修正した方がいいかと思われます
ご回答ありがとうございます。
少し説明が不足してしまっていたので、追加で説明させていただきます。
実はPursue関数を使いたかったのですが、使い方がわからなったため(又は仕様不可の可能性もあり)、その他のやり方があれば教えていただきたいと思い、質問させて頂きました。
hitoエージェントのプログラムは以下のようになっています。(エージェント数50)
Agt_Step{
//自宅場所の保存
If getcountstep() == 1 Then
My.firstX=My.X
My.firstY=My.Y
End if
//学校の位置設定
Dim school As Agt
school=CreateAgt(Universe.city.school)
school.X=80
school.Y=40
//学校へ行く
If getcountstep() >= 1 Then
Pursue(school, 5)
End if
//帰宅
If getcountstep() >= 100 Then
Dim distance As Double
distance=MeasureDistance(My.X, My.Y, My.firstX, My.firstY, Universe.city)
My.Direction = GetDirection(My.X, My.Y, My.firstX, My.firstY, Universe.city)
Forward(distance / 3)
End if
}
学校へ行く際のプログラムにはPursue関数を適用できたのですが、
帰宅の際は、行き先であるMy.firstXとMy.firstYはエージェントではなく、変数で登録してあるため、Pursue関数の適用のやり方がわかりませんでした。
こちらの条件下での一定スピードで目的地にピッタリ到着する方法を再び教えて頂けますでしょうか?
pursue()という関数があります。
artisocをダウンロードした際関数を纏めたhtmファイルが保存できます。それ若しくはartisoc内のヘルプで使える関数に目を通しておくことをお勧めします。