【Julia】Agents.jl의 멀티 에이전트 시뮬레이션을 이용하여 ① Shering의 별거 모형
Agents는 Juria에서 ABM(Agent Basic Model)을 구축하는 패키지입니다.이것은 jl예제를 배우고 해설하는 부분이다.연구할 때 직접 처리하고, 프로그래밍 경험이 없을 때는 정식 문서의 독해부터 시작해서 애초에 힘들었던 기억이 있다.그래서 앞으로 이 사람들을 위해 도움을 줄 수 있다면 기쁠 거예요.이번이 그 초전이야.처음이니까 쥬리아랑 에이전트.각자의 해설부터 들어가고 싶어요.
※ 이 시리즈는 줄리아의 기초 문법에 대해 짧게 설명합니다.
※ 쥬리아의 환경 구축과 점퍼 노트북에서 사용하는 방법도 간단합니다.나는 아래의 보도가 매우 참고 가치가 있다고 생각한다.
▶ 주리아 스피드 튜토리얼
▶ Juria 환경 구축
컨디션
・Juria 1.6.4
・Jupter Notebook
・Agents4.2.5
말하자면 주리아는...
▶ 홈 페이지
Julia was designed from the beginning for high performance. Julia programs compile to efficient native code for multiple platforms via LLVM.
한마디로 간단한 문법과 빠른 집행 속도가 병존하는 신세대 언어다.파이톤의 후계자로서 파이톤을 대체할 수 있기를 기대하고 있다. 이런 의미에서 계산의 속도가 전면적으로 향상되어야 한다는 인상을 준다.실행 속도와 관련해서는 파이썬 등보다 수십배 빠른 댓글을 다양한 곳에서 들을 수 있다.2012년 MIT 개발자들 OSS, 2018년 버전 1에 발표된 젊은 언어.이 때문에 파이토존과 비교해도 라이브러리 등이 적고, 라이브러리를 이용할 때 다양한 문제가 생기고, 일본어 문서가 적어 오류를 해결하려는 일을 조사하기가 어렵다는 단점이 있다.나도 지금 이 점의 진전 때문에 고민하고 있다.연필.Agents.jl
▶ 홈 페이지
▶ ABM 비교
▶ ABM이란?
Agent.줄리아의 특징을 그대로 이어받은 주르처럼 빠른 ABM을 실행하는 틀이다.이 같은 보도는 다른 프레임의 대표 사례인 넷로고, 매슨, 메사 등과 비교한다.Agents.jl은 신흥 라이브러리이기 때문에 매일 업데이트됩니다.방법 등의 작법에 미묘한 변화가 있을 수 있기 때문에 간혹 곤혹스러울 때가 있다(;;;;)
동시에 ABM에 처음 힘썼을 때 에이전트.jl부터 시작하면 예법이 독특하고 당혹스러울 수 있으니 일단 솔직하게 받아들이세요.
설림의 별거 모형
▼URL
설림의 별거 패턴은 ABM계 인근에서 고전 교재로 자주 수록됐다.컴퓨터 시뮬레이션은 반복적인 이사로 이웃이 이것저것 마음에 들 때까지 만족도 기준이 넉넉해도 따로 살게 된다는 것을 보여준다.그 원형을 거슬러 올라가면 미국에서 흑인, 백인이 별거하는 모습이 컴퓨터에 재현되는 것을 계기로 했다고 한다.
프록시, 공간 정의
using Agents
space = GridSpace((10, 10); periodic = false)
mutable struct SchellingAgent <: AbstractAgent
id::Int # The identifier number of the agent
pos::NTuple{2, Int} # The x, y location of the agent on a 2D grid
mood::Bool # whether the agent is happy in its position. (true = happy)
group::Int # The group of the agent, determines mood as it interacts with neighbors
end
Abstract Agent라는 수퍼 클래스를 상속하여 변경 가능한 에이전트형(Shelling Agent)을 생성합니다.에이전트의 집합은 ID를 키로 하고 구조를 가치로 하는 사전형이다.이번 경우 구조체에는 id와 2D 공간 좌표를 나타내는 정수 모듈의pos,mood,group 네 개의 필드가 있다.인상은 다음과 같다.
Dict(1=> {id:1, pos:(1,1), mood:true, group:1},,,)
공간은 10x10의 격자 공간을 준비했다.모델 생성하기
using Random # for reproducibility
function initialize(; numagents = 320, griddims = (20, 20), min_to_be_happy = 3, seed = 125)
space = GridSpace(griddims, periodic = false)
properties = Dict(:min_to_be_happy => min_to_be_happy)
rng = Random.MersenneTwister(seed)
model = ABM(
SchellingAgent, space;
properties, rng, scheduler = Schedulers.randomly
)
# populate the model with agents, adding equal amount of the two types of agents
# at random positions in the model
for n in 1:numagents
agent = SchellingAgent(n, (1, 1), false, n < numagents / 2 ? 1 : 2)
add_agent_single!(agent, model)
end
return model
end
모델의 생성은 일반적으로 함수로 준비된다.모델의 초기화 함수.우선 공간 파라미터나 프록시 등 파라미터를 바탕으로space,properties를 정의합니다.모델=ABM 부분에서 모델 제작 방법을 사용하여 모델을 생성합니다.rng는 고정 에이전트에 사용되는 무작위 초기값 (pos) (모든 아날로그의 무작위 초기값이 다르면 파라미터를 바꿀 때의 비교는 의미가 없습니다.)또한 scheduler = Schedulers.randomly
는 모든 step에 step 함수를 적용하는 에이전트의 순서를 무작위로 표시한다(기본값은 에이전트의 ID의 젊은 순서이다).이 밖에 for 문장에서 실제 에이전트를 생성합니다.에이전트=의 부분에서 초기 값을 각 에이전트의 속성에 입력하고 (삼원 연산자 사용)
add_agent_single!
방법으로 실제 모델에서 에이전트를 생성한다.앞에서 말한 바와 같이 이 에이전트는 모델에서 ID를 키로 하고 구조를 가치로 하는 사전 유형으로 에이전트의 수량에 따라 사전을 생성하는 요소와 구조체(Shelling Agent)add_agent_single!
방법 등을 API로 한다.jl에서 준비한 거예요.스텝 함수
function agent_step!(agent, model)
minhappy = model.min_to_be_happy
count_neighbors_same_group = 0
# For each neighbor, get group and compare to current agent's group
# and increment count_neighbors_same_group as appropriately.
# Here `nearby_agents` (with default arguments) will provide an iterator
# over the nearby agents one grid point away, which are at most 8.
for neighbor in nearby_agents(agent, model)
if agent.group == neighbor.group
count_neighbors_same_group += 1
end
end
# After counting the neighbors, decide whether or not to move the agent.
# If count_neighbors_same_group is at least the min_to_be_happy, set the
# mood to true. Otherwise, move the agent to a random position.
if count_neighbors_same_group ≥ minhappy
agent.mood = true
else
move_agent_single!(agent, model)
end
return
end
프록시 내부 상태 (속성) 를 업데이트하는 조건을 단계 함수로 설명합니다.매개 변수로, 우리는 모든 에이전트와 모델을 받아들인다.nearby_agents
는 주변 에이전트를 가져오는 데 사용되는 API이고, move_agent_single!
는 에이전트의pos를 무작위 위치로 업데이트하는 데 사용되는 API이다.근처에 같은 그룹의 에이전트가 어느 정도 이상이면 agent.mood
사실이고 그렇지 않으면 이사할 것이다.모형의 실체 생성
model = initialize()
방금 정의한 initialize 함수를 실행하여 실제 모델과 에이전트를 생성합니다.여기는tutorial에 없어요. 각 에이전트의 구조를 조사해 봅시다.model[1]
사전의 키 번호를 지정하면SchellingAgent(1, (14, 19), false, 1)
예를 들어 이렇게 주리아의 구조체가 돌아오면model[1].mood
false
점을 통해 해당 구조에 액세스할 수 있습니다.시각화
using InteractiveDynamics
using CairoMakie # choosing a plotting backend
groupcolor(a) = a.group == 1 ? :blue : :orange
groupmarker(a) = a.group == 1 ? :circle : :rect
figure, _ = abm_plot(model; ac = groupcolor, am = groupmarker, as = 10)
figure # returning the figure displays it
백엔드를 시각적으로 설정할 수 있는 프로그램 라이브러리를 사용합니다.
abm_plot
사용할 수 있을 것 같아요.색상과 모양을 간단하게 정의하는 함수로 초기 화면만 이미지화합니다.※ Visualization Library는 아직 발전 중이기 때문에 이 일대가 확립되지 않았다는 인상을 줍니다.
애니메이션
model = initialize();
# tutorialとは異なりjuypter上で出力しやすいgif形式に変更
abm_video(
"schelling.gif", model, agent_step!;
ac = groupcolor, am = groupmarker, as = 10,
framerate = 4, frames = 20,
title = "Schelling's segregation model"
)
# gifを出力
display("image/gif", read("schelling.gif"))
abm_video
실제 단계 에이전트의 내부 상태를 사용하여 시각화된 애니메이션을 만들 수 있다.다른 말로 모델을 구축하고 실제 시뮬레이션을 한 결과 별거의 진행을 이해할 수 있다.데이터 수집
adata = [:pos, :mood, :group]
model = initialize()
data, _ = run!(model, agent_step!, 5; adata)
data[1:10, :] # print only a few rows
data
에서 프록시 속성을 기호로 설정합니다.run!
함수를 사용하여 Dataframe 형식으로 에이전트를 진입시킨 에이전트의 각 속성의 데이터를 기록합니다.다른 것은 또 각양각색의 데이터 수집 예가 있다.이 Dataframe을 이용하여 파라미터를 바꾸어 결과를 자주 가시화합니다.ABM의 시뮬레이션으로, 예를 들어 min_to_happy
의 파라미터를 바꾸어 결과를 관찰할 수 있다.Dataframe 하면 파이톤도 사용하기 때문에 호환성이 있습니다.끝말
Shering의 별거 모델인 Agents를 통해jl의 개요를 만져봤어요.이곳의 예제에서 상호작용 응용의 구축과 분산 계산이 화제가 되었다.
Reference
이 문제에 관하여(【Julia】Agents.jl의 멀티 에이전트 시뮬레이션을 이용하여 ① Shering의 별거 모형), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/MandoNarin/items/cf7c0fb11e05e3a7094d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)