에이전트 기반 시뮬레이션 첫걸음: 산점도로 나타내기
시뮬레이션
코드 리뷰
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"
의 실제 모습은 위와 같다. 이로써 에이전트를 생성하고 산점도로 시각화해본 것이다.
전체 코드
다음은 이 포스트에 쓰인 줄리아 코드다.
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