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

質問 (解決済み)

[artisocモデル] 行動開始を不規則に
質問者: shunさん , 質問日時: 2019/01/23 16:02
100の整列しているエージェントを1stepごとにランダムに行動開始させるにはどのような文を使えばよいでしょうか。
rnd()などでしょうか、ちなみにエージェントは1マスおきにX=1上に配置されています。
よろしくお願いします。



▼解決した回答


質問の意図とあっているかわかりませんが、サンプルコードです。
下の //先頭から整数で値を設定する が該当する部分です。

--------------------
Univ_Init{
Dim i As Integer
Dim 順番を決めるためのAgtSet As Agtset
Dim エージェント As Agt

//エージェントに実数型の変数をつくる

For i = 0 to 10

//エージェントを作る
//ツリーを右クリックして、エージェントに実数型の変数[順番を決めるための乱数]を作っておくこと
エージェント = CreateAgt(universe.空間.サンプルエージェント)

//作った変数にRnd()で値を入れる
エージェント.順番を決めるための乱数 = Rnd()

//エージェントセットに登録
AddAgt(順番を決めるためのAgtSet, エージェント)
Next i

//SortAgtsetで変数順に並び替える
SortAgtset(順番を決めるためのAgtSet,"順番を決めるための乱数",true)

//先頭から整数で値を設定する(エージェントに整数型の変数[動き出す順番]を作っておく)
i = 0
For Each エージェント In 順番を決めるためのAgtSet
エージェント.動き出す順番 = i
i = i + 1
Next エージェント
}

回答者: ObiWan さん , 回答日時: 2019/01/25 13:53

▼ 全ての回答


エージェントの実行順序をランダムすることをを指しているのでしょうか?
それなら、設定→実行環境設定→実行順序→ランダムでそうなるはずですが、デフォルトでもそうなっているはずです。
なお、ルールのなかに、SetRandomSeed()が埋め込まれている場合は、試行毎に同じ実行順序となります。

回答者: igaguri さん , 回答日時: 2019/01/23 16:38
違います,説明分かりにくくてすみません.以下が現在のコード文です.

ctstep = getcountstep()
if ctstep < my.ID then
forward(0)
else
行動文
end if

今現在はこのようにして配列してある(IDの順に並んでいる)エージェントが1stepごとにID:0のエージェントから動きだす設定にしています.しかし、そのエージェントの動き出す順番を不規則にしたいと考えています.
よろしくお願いします.
例えば、1step目にID38が動き出す、2step目にID22が動き出すのように設定したいです.

回答者: shun さん , 回答日時: 2019/01/23 18:42
まだわかりにくいのですが、
つまり、1ステップに1つのエージェントしか動かさないようにするということですか?
だとすると、
エージェントルールで
If Universe.順序(GetCountStep()-1) == My.ID Then
Main()
End if
Sub Main(){
行動ルール
}
でUniverse.順序を配列を持つ変数で、配列数はエージェント数にして作成し、配列に中身に、エージェントIDをランダムに入れれば良いと思います。なお、重なり合わずに、ランダムに数値を入れる方法は自分で考えてください。
注意点として、上記のルールでは、当然のことながら、ステップ数がエージェント数を超えた場合は、エラーが出ますので、If文を使って回避してください。

回答者: igaguri さん , 回答日時: 2019/01/23 18:55
なお、確率的に、実行順序が回ってこないエージェントの存在を許すのであれば、
If Int(CountAgt(エージェント)*Rnd()) == My.ID Then
Main()
End if
とすることも可能です。

回答者: igaguri さん , 回答日時: 2019/01/23 19:12
『なお、重なり合わずに、ランダムに数値を入れる方法は自分で考えてください。』
とおっしゃっておりましたが、そこが僕の質問の本質的なところになります。
考えたところ自分でストップウォッチで適当なタイミングでボタンを押すなどして、小数点2桁を読み番号を1から順にあてがっていく方法です。
しかし、この方法だと毎回違う順番に動き出すわけではありません。
これを毎回ランダムにする方法がございましたら、ご提案よろしくお願いします。

回答者: shun さん , 回答日時: 2019/01/23 23:10
こんな問題は、Webを検索すればExcelや他のプログラム言語で類似の事例がたくさん出てきますので、私からの回答はこれを最後とします。
例えば、別途、順番エージェントを行動させたいエージェントと同じ数だけ作成し、そのエージェントに実数型変数を作成し、その実数型変数にRnd()で乱数値を与え、エージェント集合型変数に格納します。そして、実数型変数を基にソートすれば、ランダムなエージェントの並び、つまりそのエージェントIDはランダムになっているはずです。

Dim i As Integer
Dim junjoset As Agtset
Dim one As Agt
For i = 0 to 99
One = CreateAgt(universe.空間.順序エージェント)
One.tokuten = Rnd()
AddAgt(junjoset,one)
Next i
SortAgtset(junjoset,"tokuten",true)

上記の場合、結果的にjunjosetの格納されているエージェントのIDがバラバラになっています。

回答者: igaguri さん , 回答日時: 2019/01/24 00:14
「重なり合わずに、ランダムに数値を入れる方法」ですが、igaguriさんの回答の通り、
・エージェントに実数型の変数をつくる
・作った変数にRnd()で値を入れる
・エージェントセットに登録
・SortAgtsetで変数順に並び替えると、エージェントがランダムに並ぶ
・先頭から整数でなにか値を設定する(0,1,2,3....)

とするとランダムで重なりあわずに数値を入れることができます。

回答者: ObiWan さん , 回答日時: 2019/01/24 09:26
igaguriさん, ObiWanさんご回答ありがとうございます.

junjosetにtokutenの順番にIDばらばらで格納されたエージェントを前から取り出してIDnoなるものをあてがう方法がわかりません.
ObiWanさんの回答でいう,
・先頭から整数でなにか値を設定する(0,1,2,3....)の部分になります.

igaguriさん, ObiWanさんお二方の回答からも大した内容ではないように思われますが,いろんなことを試した結果,再度質問させていただくことにしました.
大変申し訳ありませんが,お手すきの際にご回答いただけると幸いです.

回答者: shun さん , 回答日時: 2019/01/25 12:45
質問の意図とあっているかわかりませんが、サンプルコードです。
下の //先頭から整数で値を設定する が該当する部分です。

--------------------
Univ_Init{
Dim i As Integer
Dim 順番を決めるためのAgtSet As Agtset
Dim エージェント As Agt

//エージェントに実数型の変数をつくる

For i = 0 to 10

//エージェントを作る
//ツリーを右クリックして、エージェントに実数型の変数[順番を決めるための乱数]を作っておくこと
エージェント = CreateAgt(universe.空間.サンプルエージェント)

//作った変数にRnd()で値を入れる
エージェント.順番を決めるための乱数 = Rnd()

//エージェントセットに登録
AddAgt(順番を決めるためのAgtSet, エージェント)
Next i

//SortAgtsetで変数順に並び替える
SortAgtset(順番を決めるためのAgtSet,"順番を決めるための乱数",true)

//先頭から整数で値を設定する(エージェントに整数型の変数[動き出す順番]を作っておく)
i = 0
For Each エージェント In 順番を決めるためのAgtSet
エージェント.動き出す順番 = i
i = i + 1
Next エージェント
}

回答者: ObiWan さん , 回答日時: 2019/01/25 13:53

MASコミュニティ
掲示板TOP







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