HOTnet-maps

HOTnet-maps preview image

1 collaborator

Tags

complex networks 

Tagged by Marcello Tomasini over 7 years ago

gis 

Tagged by Marcello Tomasini over 7 years ago

hot 

Tagged by Marcello Tomasini over 7 years ago

power law 

Tagged by Marcello Tomasini over 7 years ago

Child of model HOTnet preview imageHOTnet
Visible to everyone | Changeable by everyone
Model was written in NetLogo 5.0.3 • Viewed 664 times • Downloaded 34 times • Run 0 times
Download the 'HOTnet-maps' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


Info tab cannot be displayed because of an encoding error

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

extensions [ gis ]
globals [ cities-dataset
          countries-dataset
          citiesVectorFeature ]
breed [ cities city ]
;; the number of hops from a fixed center of the tree
cities-own [ nhop ]

;;;;;;;;;;;;;;;;;;;;;;;;
;;; Setup Procedures ;;;
;;;;;;;;;;;;;;;;;;;;;;;;

to setup
  clear-all
  ; Note that setting the coordinate system here is optional, as
  ; long as all of your datasets use the same coordinate system.
  gis:load-coordinate-system (word "data/" projection ".prj")
  ; Load all of our datasets
  set cities-dataset gis:load-dataset "data/cities/cities.shp"
  ;set cities-dataset gis:load-dataset "data/cities.shp"
  set countries-dataset gis:load-dataset "data/countries.shp"
  ;; Set the world envelope to the union of all of our dataset's envelopes
  gis:set-world-envelope (gis:envelope-union-of (gis:envelope-of cities-dataset)
                                                (gis:envelope-of countries-dataset))
  ;; Display countries
  gis:set-drawing-color white
  gis:draw countries-dataset 1
   
  ;; list of cities represented by VectorFeature ordered by country
  ;set citiesVectorFeature sort-by [gis:property-value ?1 "CNTRY_NAME" > gis:property-value ?2 "CNTRY_NAME"] gis:feature-list-of cities-dataset
  ;set citiesVectorFeature sort-by [gis:property-value ?1 "COUNTRY" > gis:property-value ?2 "COUNTRY"] gis:feature-list-of cities-dataset
  ;; list of cities represented by VectorFeature in a random order
  set citiesVectorFeature shuffle gis:feature-list-of cities-dataset
  
  set-default-shape cities "circle" 
  ;; create first 2 cities connected by a backbone
  create-cities 1 
  [ 
    let location gis:location-of (first (first (gis:vertex-lists-of item 0 citiesVectorFeature)))
    setxy item 0 location item 1 location
    set size 1
    ;; set color of the city proportionally with population: darker = bigger
    set color scale-color red (gis:property-value item 0 citiesVectorFeature "POP_RANK") 1 7 
    ;set color scale-color red (gis:property-value item 0 citiesVectorFeature "POPULATION") 5000000 1000 
    set nhop 0
  ]
  create-cities 1 
  [ 
    let location gis:location-of (first (first (gis:vertex-lists-of item 1 citiesVectorFeature)))
    setxy item 0 location item 1 location
    set size 1
    ;; set color of the city proportionally with population: darker = bigger
    set color scale-color red (gis:property-value item 1 citiesVectorFeature "POP_RANK") 1 7 
    ;set color scale-color red (gis:property-value item 0 citiesVectorFeature "POPULATION") 5000000 1000 
    create-link-with turtle 0 [ set color green ]
    set nhop 1
  ]
  
  reset-ticks
end 

;;;;;;;;;;;;;;;;;;;;;;;
;;; Main Procedures ;;;
;;;;;;;;;;;;;;;;;;;;;;;

to go
  if (ticks + 2) = length citiesVectorFeature [ stop ]
  ;; new edge is green, old edges are gray
  ask links [ set color gray ]
  ;; index of the list cities
  let current-city item (ticks + 2) citiesVectorFeature
  ; a feature in a point dataset may have multiple points, so we
  ; have a list of lists of points, which is why we need to use
  ; first twice here
  let location gis:location-of (first (first (gis:vertex-lists-of current-city)))
  ; location will be an empty list if the point lies outside the
  ; bounds of the current NetLogo world, as defined by our current
  ; coordinate transformation
  if not empty? location 
  [ 
    ;; The behavior of the model depends crucially on the value of alfa:
    ;; if alfa is less than a particular constant depending on the shape of the region, 
    ;; then Euclidean distances are not important, and the resulting network is easily seen to be a star,
    ;; the ultimate in degree concentration, and, depending on how you look at it, the exact opposite, or absurd extreme, of a power law.
    ;; If alfa grows at least as fast as sqrt(n), where n is the final number of points, then Euclidean distance becomes too important, 
    ;; and the resulting graph is a dynamic version of the Euclidean minimum spanning tree, in which high degrees do occur, 
    ;; but with exponentially vanishing probability.
    ;; If, however, alfa is anywhere in between — is larger than a certain constant, but grows slower than sqrt(n) if at all —
    ;; then, almost certainly, the degrees obey a power law.
    let x item 0 location
    let y item 1 location
    let partner nobody
    ;; Node i attaches itself to the node j that minimizes the weighted sum of the two objectives:
    ;; alfa * dij + hj
    ;; where dij is the /normalized/ Euclidean distance, and hj is some measure of the “centrality” of node j, such as 
    ;; (a) the average number of hops from other nodes; 
    ;; (b) the maximum number of hops from another node; 
    ;; (c) the number of hops from a fixed center of the tree;
    ;; all three measures result in similar power laws.
    ;; We use metric (b). To compute it we choose tourtle 0 as the center of our network. Then the maximum number of hops from a node is:
    ;; number of hops of the node from the center + maximum number of hops a node is from the center.
    ;; we must check the case when nodes with maximum number of hop are children of current node to don't overstimate hj by an excess of max_nhop - 1
    ;; Optionally there is a preference to attach to bigger city
    set partner min-one-of cities
    [ 
      alfa * 
      sqrt 
      ( 
        ;;( (x - min-pxcor + 0.5) / (max-pxcor - min-pxcor) - (xcor - min-pxcor + 0.5) / (max-pxcor - min-pxcor) ) ^ 2 + 
        ( (x - xcor) / (max-pxcor - min-pxcor) ) ^ 2 +
        ;;( (y - min-pycor + 0.5) / (max-pycor - min-pycor) - (ycor - min-pycor + 0.5) / (max-pycor - min-pycor) ) ^ 2 
        ( (y - ycor) / (max-pycor - min-pycor) ) ^ 2
      ) 
      + hj self
      + ifelse-value (city_size_pref? and gis:property-value current-city "POP_RANK" > 0)
      ;+ ifelse-value (city_size_pref? and gis:property-value current-city "POPULATION" > 0)
          ;; the greater is the city the less is the added value
          ;; 7 less than 50K
          ;; 6 50K < people < 100K
          ;; 5 100K < people < 250K
          ;; 4 250K < people < 500K
          ;; 3 500K < people < 1M
          ;; 2 1M < people < 5M
          ;; 1 greater than 5M
          [ gis:property-value current-city "POP_RANK" ] [0]
    ]
  
    if partner != nobody
    [ 
      create-cities 1 
      [ 
        setxy x y
        set size 1
        ;; set color of the city proportionally with population: darker = bigger
        set color scale-color red (gis:property-value current-city "POP_RANK") 1 7 
        ;set color scale-color red (gis:property-value current-city "POPULATION") 5000000 1000 
        create-link-with partner [ set color green ]
        set nhop 1 + [ nhop ] of partner
      ]
    ]
  ] ;; END if not empty? location
 
  tick
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Compute hj heuristic ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report hj [node]
    let max_nhop max [nhop] of cities
    ;; if all cities at max_nhop are children of current-city then decrease hj
    while [ all? cities with [nhop = max_nhop] [ is-child node max_nhop] ]
    [ 
      set max_nhop max_nhop - 1
    ]
    report max_nhop + [nhop] of node
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Find if city at max_ops is child of current-city ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to-report is-child [root max-nhop]
  let child false
  if root != city 0 ;; all cities are children of the root of the tree, so don't check it!
  [
    ask root
    [
      ask link-neighbors with [nhop > [nhop] of root]
      [
        ifelse nhop = max-nhop
          [ set child true ]
          [ set child is-child self max-nhop] ;; use of recursion to traverse the tree
      ]
    ]
  ]
  report child
end 

;;;;;;;;;;;;;;;;;;;;
;;; Compute s(g) ;;;
;;;;;;;;;;;;;;;;;;;;

to-report log-likelihood
  let s 0
  ;; for each link compute di*dj and sum it to s
  ask links 
  [ 
    set s s + [ count link-neighbors ] of end1 * [ count link-neighbors ] of end2 
  ]
  report s
end 
;;;;;;;;;;;;;;;;;;;;;;;;
;;; Compute S-metric ;;;
;;;;;;;;;;;;;;;;;;;;;;;; 

to-report relative-log-likelihood
  let smax 0
  let counter 0
  let di 0
  let child 0

  ;; D = { d1, d2, d3, ..., dn }, d1 >= d2 >= d3 >= ... >= dn
  let degree-sequence sort-by > [ count  link-neighbors ] of turtles
  set di item 0 degree-sequence
  set degree-sequence remove-item 0 degree-sequence
  foreach degree-sequence
  [
    set smax smax + di * ?
    set counter counter + 1
    if di = counter ;; we have iterated through all di's childs; if di = 0 select the highest degree.
    [
      set counter 1 ;; count the parent if it's not the root
      set di item child degree-sequence ;; select child; child = 0 is the root.
      set child child + 1
    ]
  ]

  report log-likelihood / smax
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Save Nodes Degrees to file ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to save-node-degree-to-file
  if file-exists? "NodeDegrees.txt" [ file-delete "NodeDegrees.txt" ]
  
  file-open "NodesDegrees.txt"
  
  ;; save in descending orders
  ;; D = { d1, d2, d3, ..., dn }, d1 >= d2 >= d3 >= ... >= dn
  foreach sort-by > [ count link-neighbors ] of turtles
  [
    file-print ?
  ]
  file-close
end 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Export Graph Connectivity to txt ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

to export-graph
  if file-exists? "HOTGraph.txt" [ file-delete "HOTGraph.txt" ]
  
  file-open "HOTGraph.txt"
  
  ;; write each linked couple of tourtles and their degree
  ask links 
  [ 
    file-type [who] of end1 ;; writes without blank spaces
    file-write [who] of end2 ;; write a space value space
    file-print "" ;; write carriage return
  ]
  file-close
end 

;;;;;;;;;;;;;;
;;; Layout ;;;
;;;;;;;;;;;;;;
;; resize-nodes, change back and forth from size based on degree to a size of 1

to resize-nodes
  ifelse all? turtles [size = 1]
  [
    ;; a node is a circle with diameter determined by
    ;; the SIZE variable; using SQRT makes the circle's
    ;; area proportional to its degree
    ask turtles [ set size sqrt count link-neighbors ]
  ]
  [
    ask turtles [ set size 1 ]
  ]
end 


; Copyright 2013 Tomasini Marcello.
; See Info tab for full copyright and license.

There is only one version of this model, created over 7 years ago by Marcello Tomasini.

Attached files

File Type Description Last updated
data.zip data GIS dataset over 7 years ago, by Marcello Tomasini Download
HOTnet-maps.png preview model view over 7 years ago, by Marcello Tomasini Download

Parent: HOTnet

This model does not have any descendants.

Graph of models related to 'HOTnet-maps'