Rabbit-Fox-Hawk¶
3D로 된 땅에 토끼(Rabbit), 여우(Fox), 매(Hwak), 풀(Grass)가 있다. 이 들 간의 먹이사슬이 있고 번식을 할 때 어떤 상황이 발생 하는지 시뮬레이션 한다.
동작환경:
- Julia v1.8.3
- Agents v5.6.2
- InteractiveDynamics v0.21.11
- CairoMakie v0.8.13
- GLMakie v0.6.13
참고 source : https://github.com/mrchaos/Agents.jl/blob/org/examples/rabbit_fox_hawk.jl
규칙¶
토끼(Rabbit)¶
- 토끼는 자신의 위치에 있는 풀이 있으면 먹는다
- 토끼가 포식자를 볼 경우 달아 난다.
- 토끼가 도망가는 방향은 토끼의 시야에 있는 모든 포식자의 위치에 달려 있는데 토끼가 있는 위치에 가까울 수록 더 많은 영향을 미친다.
- 영향도(힘)는 토끼와 포식자 간의 거리의 제곱에 반비례 하도록 한다 중력, 전자력의 세기가 거리의 제곱에 반비례 하는것 처럼
- 매 스텝 에너비소요량은 마지막 스텝 이후 경과한 시간에 해당 한다.
- 에너지가 0 이되면 죽는다
- 매 스텝마다 재생산의 기회를 갖는다.
- 토끼의 시야에 포식자가 없으면 무작위로 돌아 다닌다.
여우(Fox) / 매(Hawk)¶
- 여우/매는 토끼를 사냥하며 자신의 위치에서 단위 반경 이내의 토끼를 잡아먹는다.
- 매 스텝 에너비소요량은 마지막 스텝 이후 경과한 시간에 해당 한다.
- 에너지가 0 이되면 죽는다
- 매 스텝마다 재생산의 기회를 갖는다.
- 여우/매가 이미 어디론가 움직이지 않았다면 근처에 토끼가 있는지 살펴본다.
- 토끼가 근처에 없다면 여우/매는 근처 임의의 위치로 이동할 경로를 찾는다.
- 토끼가 근처에 있다면 임의의 토끼를 향한 경로를 찾는다.
- 정해진 경로를 따라 주어진 속도로 움직인다.
In [1]:
using LinearAlgebra
In [2]:
using Agents, Agents.Pathfinding
using Random
import ImageMagick
using FileIO: load
using PrettyPrint:pprintln
In [3]:
@agent Animal ContinuousAgent{3} begin
type::Symbol # one of :rabbit, :fox or :hawk
energy::Float64
end
In [4]:
fieldnames(Animal)
Out[4]:
(:id, :pos, :vel, :type, :energy)
In [5]:
const v0 = (0.0, 0.0, 0.0) # velocity field는 사용되지 않음
Rabbit(id, pos, energy) = Animal(id, pos, v0, :rabbit, energy)
Fox(id, pos, energy) = Animal(id, pos, v0, :fox, energy)
Hawk(id, pos, energy) = Animal(id, pos, v0, :hawk, energy)
# The euclidean norm of a vector
eunorm(vec) = √sum(vec .^ 2)
Out[5]:
eunorm (generic function with 1 method)
In [6]:
let
v = (1,2,3)
eunorm(v),norm(v)
end
Out[6]:
(3.7416573867739413, 3.7416573867739413)
환경은 고도맵에서 생성된다.¶
- 2D matrix 고도맵이고 각 포인트는 영역의 고도를 나타낸다.
- 수면(
water_level
) 아래는 어떤 동물도 들어갈 수 없다. water_level
과 초원(grass_level
) 사이의 평탄한 영역에는 모두 들어 갈 수 있다.grass_level
과 산악(mountain_level
) 사이 영역에는 너무 높아 걸어 갈수 업지만 날아 갈 수 있다.mountain_level
이상의 영역은 아무도 접근 할 수 없는 영역이다.
- 수면(
풀(Grass)는 토끼의 먹이 원천 이며 water_level
과 grass_level
사이에서 자란다.
영역에 퍼져 있는 풀은 BitArray
를 사용하여 표현한다. BitArray
에서 1의 값은 풀이 있음을 표현하며 토끼가 먹을 수 있고 먹었을 때 소비되고 값은 0으로 바뀐다. 풀의 성장률(확률)은 수면에 가까이 다가갈 수록 높아 진다.
initialize_model
function은 고도맵이 있는 url에서 다운로드하고 고도맵의 높이에 따라 영역을 나누고 토끼,여우,매를 모델에 추가하고 추가적인 파라미터를 모델에 추가 한다.
고도맵(Heightmap) 다운로드¶
In [7]:
# 고도맵 파일이 images 폴더에 없어면 다운로드 한다.
heightmap_path = "../img/rabbit_fox_hawk_heightmap.png"
let
heightmap_url ="https://raw.githubusercontent.com/JuliaDynamics/" *
"JuliaDynamics/master/videos/agents/rabbit_fox_hawk_heightmap.png"
!isfile(heightmap_path) && cp(download(heightmap_url),heightmap_path)
end
Out[7]:
false
In [8]:
let
heightmap_path = "../img/rabbit_fox_hawk_heightmap.png"
map = load(heightmap_path)
println("map (x,y) : ", size(map))
map
end
map (x,y) : (205, 205)
Out[8]: