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

質問 (解決済み)

[artisocモデル] 3種類のエージェントによるネットワークの構築
質問者: kimさん , 質問日時: 2019/02/08 17:54
3種類のエージェントをそれぞれ任意の数を作成し、それぞれがリンクによって繋がるモデルを構築しようと考えておりますが、2種類目のエージェントの1体目を「作成→リンクを張る」を実行したときに、フリーズしてしまいます。モデルは、本webページのスケールフリーネットワークモデルを拡張する形で行っております。
以下がソースコードになります。
Univ_Init{でエージェント作成のループ、各エージェントのAgt_Init{でリンクを張るという流れです。
よろしくお願いいたします。

Univ_Init{

// Initialize
Universe.LongTailDivisionNumber = 21

Dim myAgt As Agt
Dim myMega As Agt
Dim myMiddle As Agt
Dim mySmall As Agt
Dim myAgtSet As AgtSet

// Create Mega
Dim i As Integer
For i = 0 to 10- 1
myAgt = CreateAgt(Universe.CallMarket.Mega)//megaを作成する
Universe.PointID(Universe.PointNumber) = myAgt
Universe.PointNumber = Universe.PointNumber + 1
next i
print(myAgt)

// Create Middle
Dim m As Integer
For m = 0 to 50 - 1//
myAgt = CreateAgt(Universe.CallMarket.Middle)//Middleを作成する
Universe.PointID(Universe.PointNumber) = myAgt
Universe.PointNumber = Universe.PointNumber + 1
next m

// Create Small
Dim f As Integer
For f = 0 to 30 - 1//銀行の数
myAgt= CreateAgt(Universe.CallMarket.Small)//Middleを作成する
Universe.PointID(Universe.PointNumber) = myAgt
Universe.PointNumber = Universe.PointNumber + 1
next f



Agt_Init{
Dim nBranch As Integer
Dim TargetPointAgt As Agt
Dim ConnectPointsAgtSet As AgtSet
Dim AllPointAgtSet As AgtSet//変更
Dim pos As Integer
Dim i As Integer
Dim n As Integer

// Point Initialize(初期化)
My.X =(GetWidthSpace(Universe.CallMarket) - 1) * Rnd()
My.Y =(GetHeightSpace(Universe.CallMarket) - 1) * Rnd()
My.Color = COLOR_RED//色は赤

// Connect branch
If Universe.PointNumber > 0 Then//PointNumberが0より大きい場合
nBranch = 0//nBranchを初期化
MakeAgtsetSpace(AllPointAgtSet, Universe.CallMarket)
For Each TargetPointAgt In AllPointAgtSet
//TargetPointAgtに一つずつ取り出し、TargetPointAgtについて実行する
nBranch = nBranch + CountAgtSet(TargetPointAgt.ConnectPoints)
//nBranch(=0?)にConnectPointsを足す
Next TargetPointAgt

n = Universe.PointNumber//nはPointNumberの数


Do While(1)//ループ内で判断する方法1 = true 永続に ?
If CountAgtSet(ConnectPointsAgtSet) == Universe.BranchNumber Then
//ConnectPointsAgtSet=BranchNumberとなった場合に、ループは中断される
Break
End If

If nBranch > 0 Then//nBranch >0の場合

// Decide branch position
pos = CInt(nBranch * Rnd())//posにbranchの位置を格納

// Get Point ID from branch position
i = 0
For Each TargetPointAgt In AllPointAgtSet
//AllPointAgtSetからTargetPointAgtを一つずつ取り出す。
pos = pos - CountAgtSet(TargetPointAgt.ConnectPoints)
If pos < 0 Then
TargetPointAgt = Universe.PointID(i)
Break
Else
i = i + 1
End If
Next TargetPointAgt

Else
// Choice Point
pos = CInt(n * Rnd())
TargetPointAgt = Universe.PointID(pos)
End If

If GetAgtEntry(ConnectPointsAgtSet, TargetPointAgt) == -1 Then

addAgt(ConnectPointsAgtSet, TargetPointAgt)

n = n-1
// Check Exit
If n == 0 Then
Break
End If
Else
// Select same point
End If

Loop//?

For Each TargetPointAgt In ConnectPointsAgtSet
addAgt(My.ConnectPoints, TargetPointAgt)

For i=0 To (Universe.PointNumber - 1)
If Universe.PointID(i) == TargetPointAgt Then
Break
End If
Next i
addAgt(TargetPointAgt.ConnectPoints, My)
Next TargetPointAgt
End If

//agtステップ{はこの下からです!
Dim AroundPointAgtSet As AgtSet
Dim MegaAgtSet As AgtSet//変更
Dim Congestion As Integer
Dim MoveLength As Double
// Dim ConnectPointsAgtSet As AgtSet
Dim Point As Agt

// When it is dowded, it aboids it 既に繋がっている
MakeAgtSet(MegaAgtSet, Universe.CallMarket.Mega)
MakeAgtSetAroundOwnCell(AroundPointAgtSet, 1, MegaAgtSet, False)
Congestion = CountAgtSet(AroundPointAgtSet)

If Congestion >= 1 Then
MoveLength = 0.5
Turn(360 * Rnd())
Forward(MoveLength)
End If

// ConnectPointsView
ClearAgtSet(My.ConnectPointsView)
If Universe.BranchViewMode == True Then
DuplicateAgtSet(ConnectPointsAgtSet, My.ConnectPoints)
For Each Point In ConnectPointsAgtSet
AddAgt(My.ConnectPointsView, Point)
Next Point
End If



▼解決した回答


質問に書いてもらっているコード詳細がわからないのですが、
主要な箇所でデバッグ用のログ出力をPrintLnで行い、処理の流れを出力して
どの行でフリーズしているのか確認すると良いと思います。

回答者: ObiWan さん , 回答日時: 2019/02/14 09:47

▼ 全ての回答


質問に書いてもらっているコード詳細がわからないのですが、
主要な箇所でデバッグ用のログ出力をPrintLnで行い、処理の流れを出力して
どの行でフリーズしているのか確認すると良いと思います。

回答者: ObiWan さん , 回答日時: 2019/02/14 09:47



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