MAS コミュニティ
artisoc質問用掲示板(アーカイブ)
  
質問掲示板は移転しました。新掲示板はこちら

質問 (解決済み)

[artisocモデル] artisocモデルについて
質問者: matsudaさん , 質問日時: 2020/11/01 16:40
artisocで家の転居シミュレーションを作成したくモデルを構築しているのですが、うまくいかないのでお力をお貸しいただけると幸いです。

モデル:
空間上にhouse(150個)とperson(100個)というエージェントを作成。
houseの初期位置はランダムに配置。
personはhouseをランダムに選択し、その位置に配置される。

ルールエディタ:
MakeOneAgtSetAroundOwn(neighbor,200,Universe.toti.house,False)
home = GetAgt(neighbor,Int(Rnd()*CountAgtset(neighbor)))
My.X = home.X
My.Y = home.Y

以上のように作成していますが、このままでは1つのhouseに複数のpersonが存在することになります。
1つの家には1人以上配置されないようにするにはどのようにすればいいのでしょうか?

0距離にいるpersonを数えて、1以上であれば家探しを繰り返すというルールを作成すればいいのではないかと考えたのですが、うまくルールを書くことができません。



▼解決した回答


1つの家には1人以上配置されないようにする方法ですが、houseにReserve(ブール型)の変数を追加し、既に配置されたか否かを判定できるとよいです。

Dim neighborFree As AgtSet

を定義し、

MakeOneAgtSetAroundOwn(neighbor,200,Universe.toti.house,False)

の後に

ClearAgtSet(neighborFree)
For Each home In neighbor
If home.Reserve == False Then
AddAgt(neighborFree, home)
End If
Next home

とすることで、予約されていないhouseの集合が取得できます。
その後、

home = GetAgt(neighborFree,CInt(Rnd()*CountAgtset(neighborFree)))

とすることで、空き家が取得できます。

回答者: m.tamada さん , 回答日時: 2020/11/02 09:37

▼ 全ての回答


1つの家には1人以上配置されないようにする方法ですが、houseにReserve(ブール型)の変数を追加し、既に配置されたか否かを判定できるとよいです。

Dim neighborFree As AgtSet

を定義し、

MakeOneAgtSetAroundOwn(neighbor,200,Universe.toti.house,False)

の後に

ClearAgtSet(neighborFree)
For Each home In neighbor
If home.Reserve == False Then
AddAgt(neighborFree, home)
End If
Next home

とすることで、予約されていないhouseの集合が取得できます。
その後、

home = GetAgt(neighborFree,CInt(Rnd()*CountAgtset(neighborFree)))

とすることで、空き家が取得できます。

回答者: m.tamada さん , 回答日時: 2020/11/02 09:37



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