首页 > 解决方案 > 确定海龟集群的数量

问题描述

我一直在尝试计算我的世界中海龟集群的数量,但我一直面临着“你不能在补丁上下文中使用 GROUPE,因为 GROUPE 是海龟专用的”。我正在使用 Schelling 的分离模型中的位并调整模型库中的补丁簇示例,但是在运行模型后我无法使用命令获取簇的数量show max [amas] of personnes

导致问题的线位于集团的底部,并且是:

(groupe = 我自己的 [groupe])]

这是完整的代码:

extensions
[
  GIS ; Extension GIS
]

globals
[
  v
  ;vc
  routes.data ; shapefile routes
  Usol.data ; shapefile utilisation sol
  
  average-happy ; pourcentage heureux
  amas
]

patches-own
[
  routes ; routes
  routes? ; booléenne routes
  Usol
  Usol?
  state ; état d'une patch

  val ; valeur
  
  cluster
]

turtles-own
[
  groupe
  unhappy?
  
  counter
  similar-nearby
  other-nearby
  total-nearby
  happy
]

breed ; Création d'une classe
[
  personnes
  personne
]

to setup ; Déclaration de la procédure setup
  ca ; Clear-all
  reset-ticks ; Remet le compteur de ticks à zéro
  set v 2
  initialiserGIS ; Initialisation de la procédure initialiserGIS
  creerHumains
  do-plots
end ; Fin de la procédure setup

to initialiserGIS ; Déclaration de la procédure initialiserGIS
  set Usol.data gis:load-dataset "utilisationDuSol.shp"
  gis:apply-coverage Usol.data "LANDUSE" Usol
  ask patches
  [
    set Usol? FALSE
  ]
  ask patches gis:intersecting Usol.data
  [
    set Usol? TRUE
    ifelse Usol = "residential"
    [
      set state 1
      set pcolor green
    ]
    [
      set state 0
      set pcolor grey
    ]
  ]

  set routes.data gis:load-dataset "routesMtl.shp"
  ask patches
  [
    set routes? FALSE
  ]
  ask patches gis:intersecting routes.data
  [
    set routes? TRUE
    set state 0 ; Empêche aux agents d'habiter sur les routes
    set pcolor red ; Assigne la couleur rouge aux routes
  ]
end ; Fin de la procédure initialiser GIS

to creerHumains ; Déclaration de la procédure creerHumains
  ask patches with [state = 1] ; Demande aux cellules résidentielles
  [
    set val random-float 1 ; Accorde une valeur aléatoire décimale entre 0 et 1 à la variable val
  ]
  let vide 0.1 ; Initialisation de la variable locale vide avec la valeur 0.1
  let limite1 (1 - vide) / v ; Initialisation de la variable locale limite
  let residents patches with [state = 1 and val > vide] ; Initialisation de la variable locale residents
  ask residents ; Demande aux residents
  [
    sprout-personnes 1 ; Primitive permettant à une patch de créer un agent sur toutes les patches résidentielles
  ] ; Permet de créer un nombre identique de personne de chaque groupe
  let limiteList (list (pmin * (1 - vide )) ((1 - pmin) * (1 - vide)))
  let i 0 
  let minVal vide 
  let maxVal 0 
  while [i <= v - 1] 
  [ 
    set maxVal minVal + item i limiteList 
    ask personnes with [val <= maxVal and val > minVal] 
    [
      set groupe i + 1
    ]
    set minVal maxVal 
    set i i + 1
  ]

  ask personnes ;ceci sert uniquement à attribuer une couleur différente à chaque groupe
  [ ; Assigne la couleur et la forme appropriée en fonction du groupe
    ifelse groupe = 1
    [
      set color red
      set shape "house"
    ]
    [
      ifelse groupe = 2
      [
        set color blue
        set shape "house"
      ]
      [
        ifelse groupe = 3
        [
          set color green
          set shape "house"
        ]
        [
          ifelse groupe = 4
          [
            set color orange
            set shape "house"
          ]
          [
            ifelse groupe = 5
            [
              set color black
              set shape "house"
            ]
            [
              ifelse groupe = 6
              [
                set color brown
                set shape "house"
              ]
              [
                ifelse groupe = 7
                [
                  set color pink
                  set shape "house"
                ]
                [
                  ifelse groupe = 8
                  [
                    set color white
                    set shape "house"
                  ]
                  [
                    set color magenta
                    set shape "house"
                  ]
                ]
              ]
            ]
          ]
        ]
      ]
    ]
  ]
end ; Fin de la procédure creerHumains

to move  ; Déclaration de la procédure move
  move-to one-of patches with [Usol = "residential"]
  if any? other turtles-here
  [ 
    move ;; Continue jusqu'à tant qu'une patch soit trouvée
  ]  
end

to update-variables ; Déclaration de la procédure update-variables ; permet de mettre à jour les valeurs
  update-turtles
  update-globals
end ; Fin de la procédure update-variables

to update-turtles ; Déclaration de la procédure update-turtles
  ask turtles ; demande turtles
  [ ; Test des patches voisines
    set counter 0 ; réinitialise counter
    set similar-nearby count (turtles-on neighbors) with [groupe = [groupe] of myself]
    set other-nearby count (turtles-on neighbors) with [groupe != [groupe] of myself]
    set total-nearby similar-nearby + other-nearby
    ifelse groupe = 1 
    [
      ifelse (Tmin >= similar-nearby) ; vérification si vc est supérieur ou égale aux voisins similaires
      [ ; personne unhappy + move
        set unhappy? TRUE
        set happy 0
        move
      ] 
      [  ; personne happy
        set unhappy? FALSE
        set happy 1
      ]
    ]
    [
      ifelse (Tmaj <= similar-nearby) ; vérification si vc est supérieur ou égale aux voisins similaires
      [ ; personne unhappy + move
        set unhappy? TRUE
        set happy 0
        move
      ] 
      [  ; personne happy
        set unhappy? FALSE
        set happy 1
      ]
    ]
  ]
end ; Fin de la procédure update-turtles

to update-globals ; Déclaration de la procédure update-globals
  set average-happy mean [happy] of turtles ; Average-happy = moyenne des turtles happy
end ; Fin de la procédure update-globals

to go ; Déclaration de la procédure go
  update-variables ; Vérifie l'état de chacunes des personnes et fait bouger celles nécessitant de l'être
  tick ; Incrémente la valeur de la variable tick
  if ticks >= 100 ; Si le nombre de ticks est supérieur ou égal à 100
  [
    stop ; Arrête le modèle
  ]
  if c-unhappy = 0
  [
    stop ; Arrête le modèle si personne est unhappy
  ]
end ; Fin de la procédure go

to do-plots ; Déclaration de la procédure do-plots
  plot average-happy * 100 ; Plot la moyenne des habitants étant happy
end ; Fin de la procédure do-plots

to-report c-happy ; Déclaration de la procédure de rapportage c-happy
  report sum [happy] of turtles ; Rapporte le nombre de turtles étant happy
end ; Fin de la procédure de rapportage c-happy

to-report c-unhappy ; Déclaration de la procédure de rapportage c-unhappy
  report ((count turtles) - (sum [happy] of turtles)) ; Rapporte le nombre de turtles étant unhappy
end ; Fin de la procédure de rapportage c-unhappy


;;; Q6

to find-clusters
  loop 
  [
    ;; pick a random patch that isn't in a cluster yet
    let seed one-of personnes with [cluster = nobody]
    ;; if we can't find one, then we're done!
    if seed = nobody
    [
      show-clusters
      stop 
    ]
    ;; otherwise, make the patch the "leader" of a new cluster
    ;; by assigning itself to its own cluster, then call
    ;; grow-cluster to find the rest of the cluster
    ask seed
    [ 
      set cluster self
      grow-cluster
    ]
  ]
  display
end

to grow-cluster  ;; patch procedure
  ask neighbors4 with [(cluster = nobody) and
    (groupe = [groupe] of myself)]
  [ 
    set cluster [cluster] of myself
    grow-cluster
  ]
end

;; once all the clusters have been found, this is called
;; to put numeric labels on them so the user can see
;; that the clusters were identified correctly
to show-clusters
  let counter2 0
  loop
  [ ;; pick a random patch we haven't labeled yet
    let p one-of patches with [plabel = ""]
    if p = nobody
      [
        stop
    ]
    ;; give all patches in the chosen patch's cluster
    ;; the same label
    ask p
    [ 
      ask personnes with [cluster = [cluster] of myself]
      [
        set amas counter2 
      ] 
    ]
    set counter2 counter2 + 1 
  ]
end

标签: oopgisnetlogo

解决方案


推荐阅读