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

質問 (解決済み)

[artisocモデル] ダイクストラ法の新しい経路の追加について
質問者: ymktkdさん , 質問日時: 2021/01/15 18:04
ある条件下で目的地を変更し、ダイクストラ法で新しい経路を取得してエージェントを進ませたいです。

レシピブック03を参考にし以下のように記述しましたが、目的地が変更されません。
(My.State=0 → My.State=1 → My.State=3 → My.State=0 の場合)

修正方法を教えて頂けないでしょうか。

[以下関連部分の記述コード]

Agt_Init{

Dim PointList As AgtSet

MakeAgtset(PointList,Universe.Map.Point)
My.target=GetAgt(PointList,63)
My.RouteArray=@dijkstra(my.ID,CStr(My.target.ID))

My.State=0

}

Agt_Step{

Dim targetPointAgt As Agt
Dim distance As Double
Dim getsign1 As Agtset
Dim sign1 As Integer
Dim PointList As AgtSet

MakeAgtset(PointList,Universe.Map.Point)


If My.State==0 Then //移動中
If My.RouteCount < CountToken(My.RouteArray) Then
// 経路に沿って進む
targetPointAgt=Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
distance = Pursue(targetPointAgt, 1)

If distance > 0 Then // Pointに到着したとき
My.RouteCount = My.RouteCount + 1
If CountToken(My.RouteArray) > My.RouteCount Then
// 余剰分、次のPointへ向かう
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
Pursue(targetPointAgt, distance)
End If
MakeOneAgtSetAroundOwn(getsign1,1,Universe.Map.Signage1,False)
  sign1=CountAgtSet(getsign1)
If sign1>0 Then
My.State=1
End If
End If
Else
My.State=2
End If 
End If


If My.State==1 Then
If My.RouteCount < CountToken(My.RouteArray) Then
// 経路に沿って進む
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
distance = Pursue(targetPointAgt, 1)

If distance > 0 Then // Pointに到着したとき
My.RouteCount = My.RouteCount + 1
If CountToken(My.RouteArray) > My.RouteCount Then
// 余剰分、次のPointへ向かう
targetPointAgt = Universe.Map.Point(CInt(GetToken(My.RouteArray, My.RouteCount)))
Pursue(targetPointAgt, distance)
End If
End If
Else
My.State=3
End If 
End If


If My.State==2 Then //次目的地なし観光中
//省略
End If


If My.State==3 Then //次目的地あり観光中
My.StopCount=My.StopCount+1
If My.StopCount>20 Then //観光終了
My.target=GetAgt(PointList,70)
My.RouteArray=@dijkstra(my.ID,CStr(My.target.ID))
My.State=0
End If
End If



▼解決した回答


レシピブック03では、目的地をPointで指定されています。
上記のルールでは、Agt_Initで定義したいと考えているため、
PointのAgt_Stepにある下記箇所をコメントアウトしてください。

/*
If CountAgtSet(My.NearAgtSet) > 0 Then
// 隣接したPointがあるとき
nearPointAgt = GetAgt(My.NearAgtSet, Cint(Rnd() * CountAgtSet(My.NearAgtSet)))
personAgt.RouteArray = @dijkstra(My.ID,CStr(nearPointAgt.ID))
personAgt.RouteCount = 1
Else
// 隣接したPointがないとき
personAgt.RouteArray = CStr(My.ID)
personAgt.RouteCount = 1
End If
*/

回答者: m.tamada さん , 回答日時: 2021/01/16 14:34

▼ 全ての回答


レシピブック03では、目的地をPointで指定されています。
上記のルールでは、Agt_Initで定義したいと考えているため、
PointのAgt_Stepにある下記箇所をコメントアウトしてください。

/*
If CountAgtSet(My.NearAgtSet) > 0 Then
// 隣接したPointがあるとき
nearPointAgt = GetAgt(My.NearAgtSet, Cint(Rnd() * CountAgtSet(My.NearAgtSet)))
personAgt.RouteArray = @dijkstra(My.ID,CStr(nearPointAgt.ID))
personAgt.RouteCount = 1
Else
// 隣接したPointがないとき
personAgt.RouteArray = CStr(My.ID)
personAgt.RouteCount = 1
End If
*/

回答者: m.tamada さん , 回答日時: 2021/01/16 14:34



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