How to modify spatial extent of a landscape - netlogo

I created a landscape that it is possible to modify at each simulation by changing paramaters in the interface.
For my simulated landscapes, I considered that one patch = 100 m². For the moment, the spatial extent of my landscape is 0.3 km² (51 patches x 51 patches x 100) if I didn't make a mistake.
Ideally, I would like to have a spatial extent of 10 000 km². I made some tests and obtained an internal error when I specified max-pxcor = 1000, max-pycor = 1000 and patch size = 1 pixel in model settings. So, is it possible to have a landscape with a spatial extent of 10 000 km²?
Thank you very much for your help.

The simplest solution would of course be to just increase the patches to 1km². Then you only need the view to be 100x100. If you have agents on the landscape, you could then just divide their sizes by 10 and speeds by 100 (since each patch is 100 times wider and taller than before).

This sounds like you might be using up your computer's memory. First, make sure in the "Settings" on the Interface that you set the Location of Origin to "Corner"; otherwise, if you leave the origin at the center then your space will really be 2000 x 2000. Then set max-pxcor and max-pycor to 999 (so space goes 0 to 999).
It works on my computer...

In case amount of pixels in the view (count patches * patch-size ^ 2) is the cause of error instead of amount of patches:
running "set-patch-size 1 resize-world 0 999 0 999"
instead of
"resize-world 0 999 0 999 set-patch-size 1"
should remove errors caused by too many pixels in view.
10000x10000 world? For me testing a world with 1 patch and patch size larger than 9000 pixels starts causing errors. A list with a size of 10000 * 10000 elements takes too much memory.
Displaying a world of such size is possible in netlogo. Contents of the world would have to be scattered around in files on the harddrive instead of memory. Visualization can be done with bitmap extension or drawing/stamping with a turtle. Partially visualizing the world using patches is also possible.

Related

Please Assist with Netlogo Model

Please let me preface this with I am not a programmer by trade. I am a social scientist using M&S for some research. That being said, my goal is to use ABM (Netlogo) to create a model of state antifragility. That is a model of states that get better under stress rather than deteriorate or are resilient (return to their pre-stress levels).
The idea for this model is simple. Create agents (states) that have three properties-loops, capacity and performance. The Capacity of a state is defined as it's Agility + it's Learning + it's Power Conversion. ( I've done some regression analysis to see what the relationship between each of these variables and stress is and they are listed below. ) The state also has two loops-fragile and antifragile that are always running, but depending on the performance value and the stress value only one of those loops will activate to update the capacity/performance values to deal with the next stress. Finally, a state's performance ties all those together. That is, it is a function of capacity and stress.
States randomly roam about the world full of shocks (red patches with an intensity value). When the state comes across the patch, it interacts with that patch. To interact, it activates a loop and then performs and update of its capacity and it's performance for the next stress. This happens until a state dies (it's too fragile and fails) or it becomes the maxium value of antifragile.
UPDATED CODE BELOW ( 22 July) JenB, I took your advice and stripped it down to it's basic parts by removing the looping functions. Eventually, I'd like to get there in a future iteration, but for now I removed it. The code below is my stripped down, updated version. Where I am stuck is the stop movement function.
Starting with the latter, I am still unsure how to set something true or false. I kept getting an error about a string not a value for that command. (Again, I am really, really a beginner at this and even reading the Netlogo Dictionary isn't that easy for me.)
Now that I think about it there is a third thing. I'd also like to randomize the value of the red patches ("shocks"). I believe the way I have it set up right now is that they all have the same value, but I'd like some to be bigger or smaller.
Thank all of you for all your help in this journey!
Please see the code below:
breed [states state]
states-own [learning powerconversion agility performance category]
patches-own [intensity]
;; TO SET UP ;;
to setup
clear-all
grow-shocks
set-default-shape states "dot"
create-states 10 [
setxy random-xcor random-ycor
set color blue
set size 2.5
set performance random 100
set learning random 10
set powerconversion random 10
set agility random 10
]
reset-ticks
end
;; TO GROWN SHOCKS ;;
to grow-shocks ;; to grow shocks in the international environment do the following:
ask n-of number-shocks patches [
set pcolor red ;; make them red
set intensity random 10 ;; set their intensity to a random number between 0-10
]
end
;; TO GO ;;
to go
ask states [ ;; ask states to do the following : move, interact, update-category (AF, R, F)
move
interact
update-category
]
tick
end
;; TO MOVE ;;
to move ;; to move do the following:
right random 15
left random 15
forward 1
if abs pxcor = max-pxcor
[ set heading (- heading) ]
if abs pycor = max-pxcor
[ set heading (180 - heading) ]
end
;; TO INTERACT ;;
to interact ;; to interact with shocks do the following:
if pcolor = red [
set pcolor black set intensity 0 ;; if the patch is red, turn the patch black and set intensity to 0
update-performance ;; update-performance
update-category
]
end
;; TO UPDATE PERFORMANCE ;;
to update-performance ;; to update a state's performance do the following:
set performance (((-0.13 * learning ^ 3) + (1.89 * learning ^ 2) + (-5.72 * learning) + 8.13 ) +( 0.09 * agility ^ 3) + (1.29 * agility ^ 2) + (-3.45 * agility) + 5.57 +( 0.02 * powerconversion ^ 3) + (-0.89 * powerconversion ^ 2) + (9.93 * powerconversion) + -17.51 )
end
;; TO UPDATE STATE TYPE;;
to update-category ;; to update the state's type do the following:
if performance > 75 [ ;; if the state has a performance value of over 75, turn it green indicating an antifragile state
set color green
]
if performance < 74 and performance > 35 [ ;; if the state has a performance value between 35 and 74, turn it yellow indicating a robust state
set color yellow
]
if performance < 34 and performance > 5 [ ;; if the state has a performance value between 1 and 34, turn it red indicating a failed state
set color red
]
So I am guessing the line throwing the too large error is this one:
to activate-antifragileloop
set performance e ^ performance
end
This seems like a logic error to me. From the rest of your code, I am guessing performance numbers are generally in the range 0 to 100. Do you realise that e^100 = 2.6881171 x 10^43? It seems unlikely that you want performance to switch between numbers like 100 and numbers with 43 digits. I can't imagine a real world situation that you could be trying to represent where a key characteristic of the entities in the system has such a wildly varying value.
On the question of stopping, I would have another variable named something like done? that starts as false then you set it to true when you want it to stop. Then you can simply have ask states with [not done?] instead of ask states for any code that moves them around etc.
You said you are not a programmer. One of the best things a beginner can do is to make only minimal changes at a time. You have several problems with your code - this should almost never happen. Your life will be much easier if you only make one change at a time and get it working correctly before moving on. This is particularly important with NetLogo where it can be very difficult to work out whether something is working correctly because you are modelling systems that interact - how do you know whether the interaction is producing the results or a bug is producing the results?

Creating a network of nodes where there are multiple paths and a continuous link

I have managed to create a set of nodes and link them. However most of the time the nodes that generated do not form a continuous link with each other. By that I mean, for example if 8 nodes are generated (N1,N2,N3,N4,N5,N6,N7,N8).
Connection maybe N1-N3-N5,
and another set N2-N4-N6-N8-N7. I want both sets to have some sort of connection, i.e N5-N7. So that if I were to run a nw extenstion function, such as nw:turtles-on-path-to, I wont get an error saying it can find the path from N3 to N8.
ideally I would also like if some of the nodes are connected to more than one node, for example N2-N4, N2-N6, N2-N5.
Any ideas how to do it? Thanks in advance
breed [nodes node]
create-nodes 30[
set color blue
set size 1.5
set shape"circle"
]
ask nodes [create-link-with one-of other nodes]
repeat 500 [layout-spring nodes link 0.2 5 1]
ask nodes [setxy 0.95 * xcor * 0.95 ycor]
Your basic problem is that you don't have enough edges. You have N edges with N nodes (because each node is asked to add one edge). You need N-1 edges just to create a chain, so you only have one spare to create an extra connection.
Once you have enough edges, you can then do some sort of rewiring where you check if there's more than one component (nw:weak-component-clusters) and, if so, create an edge between a randomly selected node in one cluster to a randomly selected node in another cluster (and delete a random edge if you want to maintain the same total number of edges). Keep doing that (while) until you only have one component.

Set value of speed slider programmatically

In setup, I draw a bunch of turtles--as small circles--to display two curves defined by functions. A very simple way to do this is
ask patches with [pycor = (myfunction pxcor)] [sprout 1 [...]]
and that's what my code does at present. It's kind of wasteful, since every patch has to be consulted--in random order--for each curve, but it's simple and easy to read, and it only happens during setup.
However, there's a little bit of a pause as the curves are constructed. If I move the speed slider all the way to the right, the pause is not noticeable. If I wrap the curve display routines in no-display and display, the user doesn't see the curves being constructed, but the speed is unchanged, AFAICS. If I move the slider to the left, it takes a long time to construct the curves even with no-display; the user doesn't see the points being placed one by one, but nevertheless has to wait while twiddling her/his thumbs.
Is there a way to set the model speed programmatically (for normal, "headfull" use)? I don't want to tell users "Move the speed slider to the right, then press setup, then move it back to the center before pressing go.
If not, maybe I'll code the curves properly using loops, but I thought I'd ask. Seems like there would be a way to do this, but I haven't found anything in the dictionary or programming docs so far.
(edit: no-display, if it did help, isn't available in NetLogo Web, which I am targetting along with regular NetLogo.)
I don't believe there is. However, you are asking all patches, when you could simply ask the pxcor values. This should speed it up a lot - square root of the number of iterations if a square world. Something like:
to testme
clear-all
let counter min-pxcor
while [counter <= max-pxcor]
[ let fn-out (function counter)
if fn-out >= min-pycor and fn-out <= max-pycor
[ ask patch counter fn-out [ set pcolor red]
]
set counter counter + 1
]
end
to-report function [#invalue]
report #invalue ^ 2
end

Netlogo World coordinates

can I set the min/max pxcor and pycor in Netlogo interface from code? Want to choose a state, and then use its min/max lat/long to set the display so it fills up the whole world. I guess the alternative is to make the world wide enough and high enough for the biggest state and then adjust all lat/long values to fit that. I'm only looking at lower 48 states since Alaska is huge and Hawaii spread out, but still makes Rhode Island teeny next to Texas.
Sure. Just take a look at the resize-world primitive.
Just be aware that:
As a side effect, all turtles and links die, and the existing patch grid is discarded and new patches created.

Change turtle size keeping lower point position constant

I have distributed turtles on the world having size x and I wish to increase their size to y but the I want to keep their location of their lower further point same (Check figure below). How can one accomplish this?
EDIT:
I wished to write a procedure that could be applicable for all turtle heading, that is if the turtle is heading 0 or 90 or 45. Direct math in such case could be complicated.
As Seth said, this should be relatively straight forward math. If you don't want to do the math, though, and this is only for visual purposes, you could make a new turtle shape, where the "bottom" of the shape is actually at the center. Then, when turning, it will like the turtle is turning around their bottom. When changing size, again, the "bottom" will stay in the same place.