logo

에이전트 기반 시뮬레이션 첫걸음: 산점도로 나타내기 📂동역학

에이전트 기반 시뮬레이션 첫걸음: 산점도로 나타내기

시뮬레이션

코드 리뷰

Step 1. 패키지 로드, 초기값 설정

julia> cd(@\_\_DIR\_\_) # 파일 저장 경로cd(@\_\_DIR\_\_) # 파일 저장 경로

julia> @time using Plots
 19.989912 seconds (31.16 M allocations: 1.628 GiB, 4.49% gc Time)

julia> @time using Random
  0.034412 seconds (33.81 k allocations: 1.722 MiB)

julia> @time using Distributions
  3.436091 seconds (2.74 M allocations: 156.074 MiB, 0.90% gc Time)

julia> @time using LinearAlgebra
  0.009646 seconds (1.23 k allocations: 77.531 KiB)

julia> N0 = 10 # 초기 인구수
10

julia> gaussian2 = MvNormal([0.0; 0.0], 0.02I) # 2차원 정규분포
IsoNormal(
dim: 2
μ: [0.0, 0.0]
Σ: [0.02 0.0; 0.0 0.02]
)

위의 코드는 패키지를 불러오고 초기 에이전트의 수, 한 턴마다 주변을 배회하도록 이동 규칙을 준 것이다. 이동량은 다음과 같은 $2$차원 정규분포로 정의되었다.

$$ N \left( \mu , \Sigma \right) \qquad \text{where } \mu = (0,0) , \Sigma = \begin{bmatrix} 0.02 & 0 \\ 0 & 0.02 \end{bmatrix} $$


Step 2. 에이전트 생성

말은 에이전트 생성이라고 거창하게 포장했지만 사실 별 거 없다. 2차원 정규분포에서 에이전트의 수만큼 샘플을 뽑으면 그 좌표 자체가 에이전트를 표현하게 된다.

julia> Random.seed!(0);

julia> coordinate = rand(gaussian2, N0)'
10×2 Adjoint{Float64,Array{Float64,2}}:
  0.0960403    0.117155
 -0.0499228   -0.0190712
  0.0829602    0.0420496
  0.00918497  -0.0154174
 -0.0727203    0.222644
 -0.0974262   -0.107877
  0.0562125    0.114782
 -0.0489819   -0.0265268
 -0.2273      -0.350837
  0.321908     0.0310693

위의 좌표들이 곧 에이전트의 위치를 나타낸다. 각 행은 에이전트 하나씩을 가리키며 첫 열은 x 좌표, 두번째 열은 y 좌표다. 당장은 에이전트들이 어떤 행동 규칙을 가질 필요가 없어 이것으로 충분하다.


Step 3. 점도표(Scatter plot) 그리기

julia> p = plot(coordinate[:,1], coordinate[:,2], Seriestype = :scatter,
         markercolor = RGB(1.,94/255,0.), markeralpha = 0.4, markerstrokewidth= 0.1,
         aspect\_ratio = 1, size = [400,400],
         xaxis=true,yaxis=true,axis=nothing, legend = false)

julia> png(p, "agent\_tutorial.png"); p

plot() 함수에 옵션 seriestype = :scatter을 넣으면 위와 같이 에이전트의 좌표를 점으로 찍어준다. 그리고 첫번째 줄에서 입력한 경로에서 다음과 같이 "agent\_tutorial.png"라는 파일이 생성되었을 것이다.

agent\_tutorial.png

"agent\_tutorial.png"의 실제 모습은 위와 같다. 이로써 에이전트를 생성하고 산점도로 시각화해본 것이다.

전체 코드

다음은 이 포스트에 쓰인 줄리아 코드다.

cd(@__DIR__) # 파일 저장 경로

@time using Plots
@time using Random
@time using Distributions
@time using LinearAlgebra

N0 = 10 # 초기 인구수
gaussian2 = MvNormal([0.0; 0.0], 0.02I) # 2차원 정규분포

Random.seed!(0);
coordinate = rand(gaussian2, N0)'

p = plot(coordinate[:,1], coordinate[:,2], Seriestype = :scatter,
  markercolor = RGB(1.,94/255,0.), markeralpha = 0.4, markerstrokewidth	= 0.1,
  aspect_ratio = 1, size = [400,400],
  xaxis=true,yaxis=true,axis=nothing, legend = false)
png(p, "agent_tutorial.png"); p