Some thoughts about possible alternate versions of the Segregation
model.

In addition to considering how easily the code "reads" -- call it code
simplicity -- I suggest also weighing computational simplicity.
heavily.  This sometimes aligns with code simplicity, but not always.

NetLogo makes it really easy to write down something like `one-of
patches with [not any? turtles-here]` without calling the coder's
attention to the fact that running it always involves querying every
patch in the entire world.  This is problematic because it's slow,
but you might also consider it conceptually problematic.

I'm not saying it would be necessarily be wrong to decide in the end
that exhaustive global search is a good thing to base a version of the
model on.  I just hope that the simplicity of the code involved isn't
causing the issue to be glossed over.

I would lean against anything involving `in-radius` because it's a
circular neighborhood, which is both computationally expensive and a
downright peculiar thing to be using at all in a grid-based model.
(Imagine Thomas Schelling pulling out a compass and drawing circles on
his checkerboard.)  It's unfortunate that NetLogo doesn't have
`in-von-neumann-radius` or `in-moore-radius`, so we end up reaching for
`in-radius` just because it's there.  (`von-neumann-distance` and
`moore-distance` are missing as well.)

Schelling writes of his 1D version, "rearrange the pluses and zeros by
moving each dotted one to the nearest point where [...]".  Another
unfortunate gap in the NetLogo language is any simple way of expressing
nearest-first search with early exit.  One version of the model we've
considered involves using `min-one-of`, but the resulting computation
isn't done in nearest-first order, so more distant candidates are
sometimes examined before nearer candidates, and it becomes necessary to
limit the radius to prevent the search from becoming global.  If NetLogo
offered a concise way of expressing this kind of search, using it might
result in my favorite version of all, but the language doesn't have it.

None of my feelings about any of these choices are super strong, but
personally, I like the random walk version:

  to find-new-spot
    move-to one-of neighbors4
    if any? other turtles-here
      [ find-new-spot]
  end

I like it because it's strictly local, because it's dead simple, and
because (like Schelling) it favors shorter moves.  And it doesn't just
happen to be dead simple when expressed in NetLogo's particular
idiosyncratic vocabulary of primitives; it would be dead simple in any
programming language, because it's dead simple conceptually.

Note that I've used `neighbors4` rather than `neighbors`, since allowing
diagonal moves is conceptually more complex and has an inconsistent
distance metric (some moves are distance 1, others are distance
1.414...).

If the use of recursion is considered obscure, consider rewriting as:

  to find-new-spot
    move-to one-of neighbors4
    while [any? other turtles-here] [
      move-to one-of neighbors4
    ]
  end

Seth

-- 
You received this message because you are subscribed to the Google Groups 
"netlogo-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to netlogo-devel+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to