質問 (解決済み)[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
|
|
▼解決した回答
▼ 全ての回答
|
|