# Agent Based Modeling in Julia

**URL:** <https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431>\
**Category:** New to Julia\
**Created:** [July 17, 2018, 11:07am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431 "2018-07-17T11:07:50Z")\
**Posts on this page:** 20\
**Page:** 2

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [August 12, 2018, 10:10am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/21 "2018-08-12T10:10:49Z")

</div>

I tried `forest1.jl` in JuliaBox. I could not find anywhere the package `Random`. Running the script without `using Random` I got the following error:

```julia
UndefVarError: findall not defined

Stacktrace:
 [1] go(::Array{Int64,2}) at ./In[1]:7
 [2] go_repeat(::Float64) at ./In[1]:24
 [3] collect(::Base.Generator{UnitRange{Int64},##5#6}) at ./array.jl:475

```

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [August 12, 2018, 10:50am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/22 "2018-08-12T10:50:11Z")

</div>

The scripts are for Julia 0.7/1.0. Unfortunately a lot of changes since Julia 0.6 are introduced (you are probably using it). Here is an example how you can rewrite the first code to run under Julia 0.6.4:

```julia
function setup(density)
    [x == 1 ? 2 : rand() < density ? 1 : 0 for x in 1:251, y in 1:251]
end

function go(grid)
    any(x -> x == 2, grid) || return true
    for pos in shuffle!(find(x -> x == 2, grid))
        x, y = ind2sub(grid, pos)
        for (dx, dy) in ((0, 1), (0, -1), (1, 0), (-1, 0))
            nx, ny = x + dx, y + dy
            if all((0,0) .< (nx, ny) .≤ size(grid)) && grid[nx, ny] == 1
                grid[nx, ny] = 2
            end
        end
        grid[pos] = 3
    end
    return false
end

function go_repeat(density)
    grid = setup(density)
    init_green = count(x -> x == 1, grid)
    while true
        go(grid) && return count(x -> x == 3, grid) / init_green * 100
    end
end

@time [go_repeat(0.55) for i in 1:100];
@time [go_repeat(0.75) for i in 1:100];

```

The biggest differences in the code are:

- different approach to _find_ functions
- different approach to matrix indexing

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [August 12, 2018, 10:59am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/23 "2018-08-12T10:59:15Z")

</div>

Thank you. Now it works fine in `JuliaBox` (Julia 0.6.2).  
I will try the original version of `forest1.jl` in Julia 1.0.  
What about the package `Random`? Is it not necessary?  
I tried with 0.7. It works but gives the following warning:

```julia
WARNING: Base.shuffle! is deprecated: it has been moved to the standard library package `Random`.
Add `using Random` to your imports.

```

I tried also with 1.0 and it gives the following error:  
`UndefVarError: shuffle! not defined`

But I know that I am not saying nothing new 🙂

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [August 12, 2018, 11:17am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/24 "2018-08-12T11:17:54Z")

</div>

- In Julia 0.6 `shuffle!` is imported from `Random` by default so you do not have to write anything;
- In Julia 0.7 you should import it using `using Random` or a warning will be thrown;
- In Julia 1.0 you must use `using Random` or an error will be thrown as `shuffle!` is not imported by default.

Julia 0.7 is a kind of “in transition” version of Julia - having the same functionality as 1.0 but trying to print warnings where possible to make life easier for people migrating the code from 0.6 to 1.0.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [August 12, 2018, 11:34am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/25 "2018-08-12T11:34:59Z")

</div>

Yes, in Julia 1.0 when I use `using Random` the script runs fine. I will try with the other `forest` scripts in Julia 1.0.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [August 12, 2018, 11:43am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/26 "2018-08-12T11:43:29Z")

</div>

You can have a look at a follow up post (also for Julia 1.0) here: [Julia snippets: ABM speed in Julia](https://juliasnippets.blogspot.com/2018/08/abm-speed-in-julia.html)

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [August 12, 2018, 11:45am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/27 "2018-08-12T11:45:47Z")

</div>

Yes I saw it today but I decided to read (give it another try 🙂 ) the first one first.

---

<div class="post-metadata">

**Author:** ![Corvince](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/corvince/32/7330_2.png) [@Corvince](https://discourse.julialang.org/u/Corvince)\
**Post date:** [February 25, 2019, 7:57pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/28 "2019-02-25T19:57:21Z")

</div>

For googlers regarding performance:

By specifying the union type for mixed such as `mixed = Union{B, C}[a;b]`, the performance becomes the same as for the same arrays 😊

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [February 25, 2019, 9:56pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/29 "2019-02-25T21:56:44Z")

</div>

Yes - as long as the `Union` is not larger than 4 types.

---

<div class="post-metadata">

**Author:** ![datnamer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/datnamer/32/3471_2.png) [@datnamer](https://discourse.julialang.org/u/datnamer)\
**Post date:** [February 25, 2019, 11:17pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/30 "2019-02-25T23:17:35Z")

</div>

if it is, is there graceful degradation or a dropoff?

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [February 26, 2019, 6:53am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/31 "2019-02-26T06:53:30Z")

</div>

It is a cut off. For larger `Unions` Julia decides to do dynamic dispatch (treating them as if they were collections of `Any`)

---

<div class="post-metadata">

**Author:** ![Ali\_Vahdati](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ali_vahdati/32/38715_2.png) [@Ali\_Vahdati](https://discourse.julialang.org/u/Ali_Vahdati)\
**Post date:** [April 25, 2019, 1:01pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/32 "2019-04-25T13:01:14Z")

</div>

I have recently developed a package for ABM: [Agents](https://github.com/kavir1698/Agents.jl).

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [April 25, 2019, 1:13pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/33 "2019-04-25T13:13:11Z")

</div>

I will try to use `Agents.jl` with great interest.

Why do you think you are having difficulties to have more contributors to a most important theme like `ABM`?

---

<div class="post-metadata">

**Author:** ![Ali\_Vahdati](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ali_vahdati/32/38715_2.png) [@Ali\_Vahdati](https://discourse.julialang.org/u/Ali_Vahdati)\
**Post date:** [April 25, 2019, 2:03pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/34 "2019-04-25T14:03:33Z")

</div>

Are you referring to the number of contributors to this package? I have only registered it a few days ago. Hopefully, people will find it useful and contribute to it.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [April 25, 2019, 2:16pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/35 "2019-04-25T14:16:17Z")

</div>

Yes. I hope so too.  
I have more experience with `NetLogo` but I have a great interest in `Julia`.

Are you aware of Mesa packages like [HARK](https://github.com/econ-ark)? Maybe it is too soon to talk about ABM in Economics in Julia (sure we have [QuantEcon](https://lectures.quantecon.org/jl/) and other packages).

---

<div class="post-metadata">

**Author:** ![Ali\_Vahdati](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ali_vahdati/32/38715_2.png) [@Ali\_Vahdati](https://discourse.julialang.org/u/Ali_Vahdati)\
**Post date:** [April 25, 2019, 2:25pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/36 "2019-04-25T14:25:49Z")

</div>

Agents has already most of the functionalities of Mesa. But I am not familiar with other Mesa packages. Nevertheless, it should be easy to add more functionalities to Agents, since it is in Julia.

---

<div class="post-metadata">

**Author:** ![sbacelar](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sbacelar/32/4359_2.png) [@sbacelar](https://discourse.julialang.org/u/sbacelar)\
**Post date:** [April 25, 2019, 2:30pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/37 "2019-04-25T14:30:02Z")

</div>

OK. I am trying your two examples in `Jupyter`. I think it would be interesting to have a demo of `Agents.jl` in `Jupyter` format.

---

<div class="post-metadata">

**Author:** ![pkofod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pkofod/32/2179_2.png) [@pkofod](https://discourse.julialang.org/u/pkofod)\
**Post date:** [May 22, 2019, 8:20am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/38 "2019-05-22T08:20:00Z")

</div>

HARK is not really an ABM package as the focus is exclusively on behavior coming from optimizing behavior, and more specifically models whose solutions can be characterized by Bellman equations. This means a lot wrt the tools it tries to expose and support.

signed,  
contributor to HARK 🙂

---

<div class="post-metadata">

**Author:** ![Raf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/raf/32/3383_2.png) [@Raf](https://discourse.julialang.org/u/Raf)\
**Post date:** [May 22, 2019, 12:06pm UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/39 "2019-05-22T12:06:10Z")

</div>

Maybe we should discuss some of the CA components you are using. I’m mid way through writing this:

> **[GitHub - cesaraustralia/DynamicGrids.jl: Grid-based simulations in Julia](https://github.com/cesaraustralia/DynamicGrids.jl)**
>
> Grid-based simulations in Julia. Contribute to cesaraustralia/DynamicGrids.jl development by creating an account on GitHub.

Which is a base framework and bunch of visualisation outputs (like Interact/Blink, even REPL 😉 ) for writing more specific simulation packages like this:

> **[GitHub - cesaraustralia/Dispersal.jl: Tools for simulating organism dispersal](https://github.com/cesaraustralia/Dispersal.jl)**
>
> Tools for simulating organism dispersal. Contribute to cesaraustralia/Dispersal.jl development by creating an account on GitHub.

Apologies the docs aren’t updating at the moment, so they’re a bit out of date.

---

<div class="post-metadata">

**Author:** ![Ali\_Vahdati](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ali_vahdati/32/38715_2.png) [@Ali\_Vahdati](https://discourse.julialang.org/u/Ali_Vahdati)\
**Post date:** [May 27, 2019, 9:35am UTC](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431/40 "2019-05-27T09:35:52Z")

</div>

Sure, I will check your packages.

[Previous page](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431.md?page=1)

[Next page](https://discourse.julialang.org/t/agent-based-modeling-in-julia/12431.md?page=3)
